新手开发者,也就是我这种的基本上就是对android的基础还凑合,觉得自己已经能独立的开发app,但是往往忽略了对于android 内存使用的优化,总是觉得想用就用,等到应用OOM的时候才开始向要优化,想想以前经常遇到的好多问题,感觉确实是让自己进步了很多。

说的有点乱,android对于内存优化其实做了很多,其中就有onLowMemory& onTrimMemory

这是俩个我们在程序中可以进行操作的俩个方法:

在内存紧张的时候,会回调OnLowMemory/OnTrimMemory,需要在回调方法中编写释放资源的代码。
可以在资源紧张的时候,释放UI 使用的资源资:Bitmap、数组、控件资源。

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()注册后,就会被系统回调到。

OnLowMemory和OnTrimMemory的比较

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

不管是在activity,Fragment,Application,Service,ContentProvider中我们都可以通过这俩个方法来保证自己的应用程序尽量不被杀掉,让手机的更多资源来服务我们的程序。

android的程序优化比较多,这只是其中的一点。

更多相关文章

  1. 第一行代码-9.6 服务的最佳实践--后台执行的定时任务
  2. Android进程
  3. Android之rild进程启动源码分析
  4. Android系统启动流程(1) —— 解析init进程启动过程
  5. Android通过JSON数据格式和java服务后台进行数据交互

随机推荐

  1. android GPS DEMO
  2. Android学习之界面篇(六)ViewPager学习与An
  3. Android 导入项目出错
  4. Android 简单视图
  5. Android TimePicker example
  6. android PhoneWindow
  7. 如何编译Android(安卓)ASE
  8. android 模拟软件启动界面
  9. Using Eclipse to compile Android sourc
  10. [Android] conversion to dalvik format