进程优先级的判定

进程的优先级反应了系统对于进程重要性的判定。

在Android系统中,进程的优先级影响着以下三个因素:

当内存紧张时,系统对于进程的回收策略
系统对于进程的CPU调度策略
虚拟机对于进程的内存分配和垃圾回收策略

我们系统对于进程的优先级大致有如下五个分类:

  1. 前台进程
  2. 可见进程
  3. 服务进程
  4. 后台进程
  5. 空进程

进程优先级的设置

对于每一个运行中的进程,Linux内核都通过proc文件系统暴露这样一个文件来允许其他程序修改指定进程的优先级:/proc/[pid]/oom_score_adj。(修改这个文件需要root权限)
这个文件允许的值的范围是:-1000 ~ +1000之间。值越小,表示进程越重要。

当内存非常紧张时,系统便会遍历所有进程,以确定哪个进程需要被杀死以回收内存,此时便会读取oom_score_adj 这个文件的值。

进程优先级的影响范围

在Android系统中,进程的优先级影响着以下三个因素:

当内存紧张时,系统对于进程的回收策略
系统对于进程的CPU调度策略
虚拟机对于进程的内存分配和垃圾回收策略

如何提高进程优先级

AndroidManifest.xml中的Application节点内添加android:persistent=“true”;
重载back按键事件,让activity在后台运行,不要Destroy;
启动Service,并设置前台运行方式;
与NotificationManager交互,让进程变成可感知进程;
发送/接收广播,进行进程保活。

如何在Activity被销毁时进行数据缓存

当进程不可避免的被销毁时,可以考虑对页面当前数据、部分控件状态进行缓存,这样可以避免部分bug、优化用户体验。

Activity重建时,系统会在销毁前调用onSaveInstanceState方法(调用时序在onStop之前),在重建时调用onRestoreInstanceState方法恢复缓存数据。我们可以重写onRestoreInstanceState方法恢复数据,也可以在onCreate中使用savedInstanceState来恢复数据(需要对savedInstanceState判空)。

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) {  
     super.onRestoreInstanceState(savedInstanceState); //恢复数据位置2(官方推荐) 
     String string = savedInstanceState.getString("cache");
 } 
@Override 
   protected void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 
      outState.putString("cache", "Cicada"); 
}