onTrimMemory

onTrimMemory返回的信息更加丰富,只要满足了触发条件,系统就会返回内存警告信息。onTrimMemory回调中,包含一个int类型的参数level,代表着警告的级别。根据它们的回调时机,可以大致分成以下几个类型。

运行时内存容量

这几个内存警告代表着当前App还能够继续执行,且此时App处于前台运行状态,但系统内存已经快达到LMK阈值了。

  • TRIM_MEMORY_RUNNING_MODERATE:第一级警告,系统即将准备执行LMK。
  • TRIM_MEMORY_RUNNING_LOW:第二级警告,内存已经接近LMK阈值。
  • TRIM_MEMORY_RUNNING_CRITICAL:第三级警告,LMK已经杀掉了能够杀掉的优先级为Background的进程,即将杀掉自己的App。

缓存时内存容量

当App处于后台运行状态时,例如按Home键退到后台时,与运行时类似也是三级警告。

  • TRIM_MEMORY_BACKGROUND:第一级警告,LMK已经准备把App列为准备杀掉的对象。
  • TRIM_MEMORY_MODERATE:第二级警告,App已经被LMK列为准备杀掉的对象。
  • TRIM_MEMORY_COMPLETE:第三级警告,LMK即将杀掉自己的App。

TRIM_MEMORY_UI_HIDDEN

TRIM_MEMORY_UI_HIDDEN是onTrimMemory一个比较实用的回调信息,该回调在UI元素完全被隐藏的时候触发。它与onStop()的不同在于,onStop()纵观全局,例如广播、系统资源的释放,而这个回调信息只针对UI元素,可以针对UI进行特定的资源释放。

虽然上面列举了很多监听内存警告的方法,但在实际的开发中,系统不建议App插手内存的管理。这些方法仅仅是提供信息而已,而真正该在这些方法中释放的资源应该是App的缓存数据,这些缓存数据可以让App的性能更好。但是在内存不够时,App应该首先释放这些缓存从而获取更大空间,而这一过程就是在onLowMemory和onTrimMemory中处理的。

TrimMemory模拟

TrimMemory的回调是很难模拟的,毕竟运行时的状态比较复杂,而且系统LMK清理的过程也不是开发者能够预知的。因此,系统给开发者提供了一个ADB命令模拟这一状态,指令如下所示。

  1. ~ adb shell dumpsys gfxinfo packagename -cmd trim level

其中,packagename就是待测的包名,level就是前面列举的这些警告级别。具体的int值可以在ComponentCallbacks2.java这个类中找到,如图6.52所示。

onTrimMemory - 图1 图6.52 警告级别

通过这个指令,可以模拟对应的警告级别。