Android中的onLowMemory()和onTrimMemory(int level)

在 Android 中,onLowMemory()onTrimMemory(int level) 是两种与内存管理相关的回调方法,用于通知应用程序当前系统的内存状态。它们的执行时机和触发条件有所不同,以下是详细的对比和解释:


1. onLowMemory()

执行时机

  • 当系统内存严重不足时,Android 会调用 onLowMemory()
  • 这通常发生在所有后台进程(优先级为 background 的进程)都被杀死后,系统仍然无法满足前台应用的内存需求时。

触发条件

  • 系统已经清理了尽可能多的后台进程,但内存仍然不足以维持前台应用的正常运行。
  • 此时,系统会向正在运行的前台或服务进程发出 onLowMemory() 回调,要求它们释放尽可能多的非必要资源。

特点

  • onLowMemory() 是一个较为“紧急”的回调,表明系统内存已经接近极限。
  • 它是一个较早引入的 API,在 Android 早期版本中就已经存在。

使用场景

  • 适用于释放较大的资源,例如:
    • 清理缓存数据。
    • 释放占用大量内存的对象(如图片、视频等)。
    • 停止不必要的后台任务或服务。

2. onTrimMemory(int level)

执行时机

  • onTrimMemory(int level) 是从 Android 4.0(API Level 14)开始引入的更细粒度的内存管理回调。
  • 它会在不同的内存状态变化时被调用,并通过参数 level 表示当前的内存压力级别。

触发条件

  • 根据系统的内存状态,onTrimMemory() 可能会被多次调用,且每次调用可能对应不同的 level 值。
  • 以下是一些常见的 level 值及其含义:
Level 描述
TRIM_MEMORY_COMPLETE 内存不足,且该进程是后台进程中最后一个,即将被清理。
TRIM_MEMORY_MODERATE 内存不足,且该进程位于后台进程列表的中间位置。
TRIM_MEMORY_BACKGROUND 内存不足,且该进程是一个后台进程。
TRIM_MEMORY_UI_HIDDEN 应用的 UI 不再可见(例如切换到后台)。
TRIM_MEMORY_RUNNING_CRITICAL 内存不足(后台进程少于 3 个),且该进程优先级较高,需要立即释放内存。
TRIM_MEMORY_RUNNING_LOW 内存不足(后台进程少于 5 个),且该进程优先级较高,建议释放部分内存。
TRIM_MEMORY_RUNNING_MODERATE 内存不足(后台进程超过 5 个),但情况尚不严重,建议进行适度优化。

特点

  • onTrimMemory() 提供了更精细的内存状态信息,允许应用根据不同的内存压力级别采取不同的优化策略。
  • 它比 onLowMemory() 更灵活,可以更早地响应内存压力。

使用场景

  • 根据 level 的值,采取不同的内存优化措施。例如:
    • TRIM_MEMORY_UI_HIDDEN 时,可以释放与 UI 相关的资源。
    • TRIM_MEMORY_RUNNING_LOW 或更高级别时,可以清理缓存、释放非必要的对象。

3. onLowMemory()onTrimMemory() 的区别

特性 onLowMemory() onTrimMemory(int level)
引入版本 Android 早期版本 Android 4.0(API Level 14)
触发时机 系统内存严重不足,所有后台进程已被清理后 系统内存压力发生变化时
触发频率 较低,只有在内存极度紧张时才会触发 较高,随着内存状态的变化可能会多次触发
参数 无参数 提供 level 参数,表示当前的内存压力级别
用途 释放尽可能多的资源 根据内存压力级别,采取不同程度的优化措施
适用场景 紧急情况下释放大块资源 精细化内存管理,逐步释放资源

4. 示例代码

@Override
public void onLowMemory() {
    super.onLowMemory();
    // 系统内存不足,释放尽可能多的资源
    Log.d("MemoryManagement", "onLowMemory called");
    clearCache();
    releaseHeavyResources();
}

@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    Log.d("MemoryManagement", "onTrimMemory called with level: " + level);

    switch (level) {
        case TRIM_MEMORY_UI_HIDDEN:
            // 应用进入后台,释放与 UI 相关的资源
            releaseUIResources();
            break;

        case TRIM_MEMORY_RUNNING_LOW:
            // 内存不足,释放部分缓存
            clearCache();
            break;

        case TRIM_MEMORY_COMPLETE:
            // 内存极度不足,释放所有非必要资源
            releaseAllNonEssentialResources();
            break;

        default:
            // 其他情况,根据需要处理
            break;
    }
}

5. 总结

  • onLowMemory() 是一个紧急回调,仅在内存极度不足时触发,适合释放大块资源。
  • onTrimMemory(int level) 提供了更精细的内存状态信息,允许应用根据不同的内存压力级别采取适当的优化措施。
  • 在实际开发中,建议同时实现这两个方法,并根据具体的内存状态采取相应的优化策略,以确保应用在不同内存条件下都能高效运行。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容