文档章节

Android 内存相关 onTrimMemory,onLowMemory

 等待流星
发布于 2014/03/13 11:44
字数 1194
阅读 612
收藏 1

OnLowMemory

OnLowMemory是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory。系统提供的回调有:

  • Application.onLowMemory()

  • Activity.OnLowMemory()

  • Fragement.OnLowMemory()

  • Service.OnLowMemory()

  • ContentProvider.OnLowMemory()

除了上述系统提供的API,还可以自己实现ComponentCallbacks,通过API注册,这样也能得到OnLowMemory回调。例如:

复制代码

public static class MyCallback implements ComponentCallbacks {
        @Override        public void onConfigurationChanged(Configuration arg) {
        }

       @Override        public void onLowMemory() {            //do release operation        }
   }

复制代码

然后,通过Context.registerComponentCallbacks ()在合适的时候注册回调就可以了。通过这种自定义的方法,可以在很多地方注册回调,而不需要局限于系统提供的组件。

onLowMemory 当后台程序已经终止资源还匮乏时会调用这个方法。好的应用程序一般会在这个方法里面释放一些不必要的资源来应付当后台程序已经终止,前台应用程序内存还不够时的情况。

 

OnTrimMemory

OnTrimMemory是Android 4.0之后提供的API,系统会根据不同的内存状态来回调。系统提供的回调有:

  • Application.onTrimMemory()

  • Activity.onTrimMemory()

  • Fragement.OnTrimMemory()

  • Service.onTrimMemory()

  • ContentProvider.OnTrimMemory()

OnTrimMemory的参数是一个int数值,代表不同的内存状态:

  • TRIM_MEMORY_COMPLETE:内存不足,并且该进程在后台进程列表最后一个,马上就要被清理

  • TRIM_MEMORY_MODERATE:内存不足,并且该进程在后台进程列表的中部。

  • TRIM_MEMORY_BACKGROUND:内存不足,并且该进程是后台进程。

  • TRIM_MEMORY_UI_HIDDEN:内存不足,并且该进程的UI已经不可见了。      

以上4个是4.0增加

  • TRIM_MEMORY_RUNNING_CRITICAL:内存不足(后台进程不足3个),并且该进程优先级比较高,需要清理内存

  • TRIM_MEMORY_RUNNING_LOW:内存不足(后台进程不足5个),并且该进程优先级比较高,需要清理内存

  • TRIM_MEMORY_RUNNING_MODERATE:内存不足(后台进程超过5个),并且该进程优先级比较高,需要清理内存       

以上3个是4.1增加

系统也提供了一个ComponentCallbacks2,通过Context.registerComponentCallbacks()注册后,就会被系统回调到。

以上int值对应关系:

复制代码

http://developer.android.com/reference/android/content/ComponentCallbacks2.html
Constants
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public static final int TRIM_MEMORY_BACKGROUNDAdded in API level 14Level for onTrimMemory(int): the process has gone on to the LRU list. This is a good opportunity to clean up resources that can efficiently and quickly be re-built if the user returns to the app.Constant Value: 40 (0x00000028)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public static final int TRIM_MEMORY_COMPLETE 
Added in API level
14
Level
for onTrimMemory(int): the process is nearing the end of the background LRU list, and if more memory isn't found soon it will be killed.
Constant Value: 80 (0x00000050)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public static final int TRIM_MEMORY_MODERATE 
Added in API level
14 Level for onTrimMemory(int): the process is around the middle of the background LRU list; freeing memory can help the system keep other processes running later in the list for better overall performance.
Constant Value:
60 (0x0000003c)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public static final int TRIM_MEMORY_RUNNING_CRITICAL 
Added in API level
16
Level
for onTrimMemory(int): the process is not an expendable background process, but the device is running extremely low on memory and is about to not be able to keep any background processes running. Your running process should free up as many non-critical resources as it can to allow that memory to be used elsewhere. The next thing that will happen after this is onLowMemory() called to report that nothing at all can be kept in the background, a situation that can start to notably impact the user.
Constant Value:
15 (0x0000000f)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public static final int TRIM_MEMORY_RUNNING_LOW 
Added in API level
16
Level
for onTrimMemory(int): the process is not an expendable background process, but the device is running low on memory. Your running process should free up unneeded resources to allow that memory to be used elsewhere.
Constant Value:
10 (0x0000000a)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public static final int TRIM_MEMORY_RUNNING_MODERATE 
Added in API level
16
Level
for onTrimMemory(int): the process is not an expendable background process, but the device is running moderately low on memory. Your running process may want to release some unneeded resources for use elsewhere. Constant Value: 5 (0x00000005)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public static final int TRIM_MEMORY_UI_HIDDEN 
Added in API level
14
Level for onTrimMemory(int): the process had been showing a user interface, and is no longer doing so. Large allocations with the UI should be released at this point to allow memory to be better managed.Constant Value: 20 (0x00000014)

复制代码

  

OnLowMemory和OnTrimMemory的比较

1,OnLowMemory被回调时,已经没有后台进程;而onTrimMemory被回调时,还有后台进程。
2,OnLowMemory是在最后一个后台进程被杀时调用,一般情况是low memory killer 杀进程后触发;而OnTrimMemory的触发更频繁,每次计算进程优先级时,只要满足条件,都会触发。
3,通过一键清理后,OnLowMemory不会被触发,而OnTrimMemory会被触发一次。

 

使用举例:

复制代码

 1 @Override 2 public void onTrimMemory(int level) { 3     Log.e(TAG, " onTrimMemory ... level:" + level);      6 } 7  8 @Override 9 public void onLowMemory() {     11     Log.e(TAG, " onLowMemory ... ");     13 }

复制代码

 

通过 ActivityManager查看进程的内存:

 

复制代码

 1 private void displayBriefMemory() { 2     final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 3     ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo(); 4     activityManager.getMemoryInfo(info); 5     Log.i(TAG, "系统剩余内存:" + (info.availMem >> 10) + "k"); 6     Log.i(TAG, "系统是否处于低内存运行:" + info.lowMemory); 7     Log.i(TAG, "当系统剩余内存低于" + (info.threshold >> 10) + "k" + "时就看成低内存运行"); 8  9     util.SavedToText(TAG, "meminfo  系统剩余内存:" + (info.availMem >> 10) + "k"10             + "  " + "系统是否处于低内存运行:" + info.lowMemory + "  " + "当系统剩余内存低于"11             + (info.threshold >> 10) + "k" + "时就看成低内存运行");12 }


本文转载自:http://www.cnblogs.com/sudawei/p/3527145.html

共有 人打赏支持
粉丝 5
博文 78
码字总数 10995
作品 0
崇明
私信 提问
加载中

评论(1)

爱coding
爱coding
楼主你好,通过一键清理,测试过,不会执行OnTrimMemory方法,是什么原因呢?
正确应对系统内存不足,OnLowMemory和OnTrimMemory回调

理论上,一个具备良好行为的应用应该考虑Android系统内存紧张的问题,这样有助于维持一个良好的生态。在前人的基础上,本文对OnLowMemory和OnTrimMemory回调进行了总结。 1. OnLowMemory OnL...

Mr云台
2017/04/07
0
0
喜闻乐见-Android应用的生命周期

本文主要讲述了App的启动流程、Application的生命周期以及进程的回收机制。 在绝大多数情况下,每一个Android应用都在自己的Linux进程中运行。当需要运行某些代码时,进程就会被创建。进程将...

Q吹个大气球Q
2018/10/01
0
0
Android application使用总结

简介:   Application和Activity、Service一样,都是Android框架的一个系统组件,每一个应用都有一个Application,Application的生命周期也就是整个app的生命周期。 特点: 实例的创建方式:...

养只柯基萌萌哒
2018/11/29
0
0
Android进程系列第八篇---LowmemoryKiller机制分析(下)

前面进程系列已经更新了七篇,本文(基于kernel 3.18),基于前两篇博客,继续梳理LMK杀进程机制下篇,主要总结LowmemoryKiller的中kernel的原理部分。 Android进程系列第一篇---进程基础 An...

LooperJing
2018/10/16
0
0
微信 Android 终端内存优化实践

前言 内存问题是软件领域的经典问题,平时藏得很深,在出现问题之前没太多征兆。而一旦爆发问题,问题来源的多样、不易重现、现场信息少、难以定位等困难,就会让人头疼不已。 微信在过去 N ...

北辰丨丶
03/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

table边框样式

table{ border:0.5px solid #000; border-collapse:collapse; //去除边框间空隙}th,td{ border:0.5px solid #000;}...

学霸猫
21分钟前
1
0
分布式消息通讯Kafka原理分析(二)

本章重点: 1.消息的存储原理2.Partition的副本机制原理3.副本数据同步原理 消息的文件存储机制 通过如 下命令找到对应partition下的日志内容 [root@localhost ~]# ls /tmp/kafka-logs/f...

须臾之余
26分钟前
1
0
Vue Element表单绑定(四)常用操作整理

一、启用回车提交报单操作 在登录页面,使用回车提交表单操作一般是必要的一个操作。在 Element中如何使用呢,示例如下: 来个注意点: 1.button按钮的native-type设置为submit,而不是绑定c...

tianma3798
30分钟前
1
0
《大话数据结构》读后总结(七)

常见的时间复杂度 执行次数 函数阶 非正式术语 12 O(1) 常数阶 2n+3 O(n) 线性阶 3n^2+2n+1 O(n2) 平方阶 5log2n+20 O(logn) 对数阶 2n+3nlog2n+19 O(nlogn) nlogn阶 6n^3+2n^2+3n+4 O(n3) 立...

徐曙辉
32分钟前
0
0
three.js 事件交互

点击查看交互效果 在three.js中,展示的一切内容都是在canvas中绘制的,所以点击事件点击到物体上是无法获取点击对象的,要获取点击的对象要使用RayCaster,用于在三维空间中进行鼠标拾取,原...

tianyawhl
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部