onTrimMemory和onLowMemory都是常用的API.从名字我们也可以看出是与内存相关的.
1.onLowMemory
onLowMemory可以用在低于android API 14以下系统中(14,后者更高版本也是可以的)
这个API属于 interface ComponentCallbacks .
当os在低内存状况下运行, 且正在运行的前台应用需要减少占用内存时,会调用此函数. 然而.这个函数准确调用的时机是不是很明确的,
一般来讲后台所有进程都被杀掉的时候,此函数会调用.
我们重写这个函数的时候, 需要释放memory cache和不必要的资源(比如UI组件).
在android 4.0一下版本,我们可以使用此api, android4.0及以上,官方建议使用onTrimMemory. onLowMemory相当于onTrimMemory的TRIM_MEMORY_COMPLETE
级别.
2. onTrimMemory
onTrimMemory属于interface ComponentCallbacks2 ,而
ComponentCallbacks2 继承了
ComponentCallbacks接口.
这个接口可以在
Activity
,Service
,ContentProvider
, andApplication四个类中调用. 这个API的作用在于根据os 的memory状况,
及时调整 app的内存占用.以让该app在系统中存活的更长久.
onTrimMemory(int level)可以针对前台app,也可以针对后台app.
当app在前台运行时,该函数的level(从低到高)有:
1)
TRIM_MEMORY_RUNNING_MODERATE os开始运行在低内存状态下. app正在运行,不会被杀掉
2)TRIM_MEMORY_RUNNING_LOW os运行在更加低内存状态下,app在运行,不会被杀掉 app可以清理一些资源来保证系统的流畅.
3)
TRIM_MEMORY_RUNNING_CRITICAL os运行在相当低内存状态下,app在运行,且os不认为可以杀掉此app. os要开始杀掉后台进程. 此时,app应该去释放一些不重要的资源.
当app在后台运行时,level状态有:
1)
TRIM_MEMORY_UI_HIDDEN
appd的 UI不可见,app可以清理UI使用的较大的资源
当app进入后台LRU list时,
1)
TRIM_MEMORY_BACKGROUND os运行在低内存下,app进程在LRU list开始处附近, 尽管app没有被杀掉的风险, 但是系统也许已经正在杀后台进程.app应该清理一些容易恢复的资源
2)
TRIM_MEMORY_BACKGROUNDos运行在低内存下,app进程在LRU list中间处附件, app此时有被杀的可能
3)
TRIM_MEMORY_COMPLETE os运行在低内存下, app是首先被杀的选择之一, app应该及时清理掉恢复app到前台状态,不重要的所有资源.
另外,一个app占用内存越多,则系统清理后台LRU list时,越可能优先被清理.所以,内存使用我们要谨慎使用.
3. 两者的区别与联系.
1)onLowMemory可以用在所有的os 版本中;onTrimMemory则只能用在 api 14及以上版本
2)onTrimMemory对内存反馈这块更加细致.不仅对前台app,还能对后台app进行内存状况的反馈.
4. 使用
android os 的Launcher中,采用的是onTrimMemory,而Browser采用的是onLowMemory.
以我来看.Luancher本身占用内存不大(50M左右),但是它要求是稳定,能够长久的存活,从后台恢复能快速及时.所以,开发者在onTrimMemory做了工作.
而Browser本身占用内存较大, 对于维持较长的生命期没有较大的需求.所以,在onLowMemory中处理.
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
// The widget preview db can result in holding onto over
// 3MB of memory for caching which isn't necessary.
SQLiteDatabase.releaseMemory();
// This clears all widget bitmaps from the widget tray
if (mAppsCustomizeTabHost != null) {
mAppsCustomizeTabHost.trimMemory();
}
}
}
上面是Launcher3的onTrimMemory实现.
具体是使用onTrimMemory,还是onLowMemory. 个人觉得,直接采用onTrimMemory是没有问题的.
但是为了精细点,如果一个app想维持在后台较长的存活时间,则用onTrimMemory,如果一个app占用内存较大,则采用onLowMemory来处理.