Android onTrimMemory()与onLowMemory()使用

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来处理.



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值