先把结论放在前面:onTrimMemory的级别不是"内存紧张程度"的线性刻度,而是不同事件的通知——UI_HIDDEN表示界面不可见,RUNNING_*表示本进程仍在前台但压力上升,COMPLETE表示进程即将被回收。正确用法是按级别做"可重建资源的分层释放",而不是每级都做同样的清理。
面试里这题几乎问的是实战经验。答得浅的是"系统内存紧张时会回调onTrimMemory,在里面释放缓存";答得深的是能列出各级别的真实触发条件、指出TRIM_MEMORY_BACKGROUND的语义、说明onLowMemory已近乎废弃,以及讲清"释放什么"与"释放不了什么"的边界。
各级别的触发条件与该做什么
| 级别 | 触发条件 | 该释放 | 不该释放 |
|---|---|---|---|
TRIM_MEMORY_UI_HIDDEN | 界面已不可见(onStop之后) | 界面级缓存:图片缓存、View 引用、大对象 | 正在编辑的草稿、需要立即恢复的进度 |
TRIM_MEMORY |