通过这两篇文章
http://topic.csdn.net/u/20110312/11/62e21a94-195b-48c8-85d3-ea2689ed693f.html?seed=582570045&r=72861243#r_72861243
http://blog.sina.com.cn/s/blog_4d66a3cb0100prfe.html
总算实现了目标。通过在androidmanifest.xml中的application标签中加入android:persistent="true" 属性后的确就能够达到保证该应用程序所在进程不会被LMK杀死。但有个前提就是应用程序必须是系统应用,也就是说应用程序不能采用通常的安装方式。必须将应用程序的apk包直接放到/system/app目录下。而且必须重启系统后才能生效。
除了一般的几种优先级外,还存在着coreserver,system这样的永远不会被LMK回收的优先级。系统中的电话应用就是coreserver优先级的。
通过查看源代码可以知道,只有应用程序的flag同时为FLAG_SYSTEM和FLAG_PERSISTENT时,才会被设置为coreserver优先级

if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {

app.persistent = true;

app.maxAdj = CORE_SERVER_ADJ;

}


FLAG_SYSTEM在应用程序apk放在/system/app下时会被设置。所以才会出现只设置android:persistent="true"仍然会被杀死的情况。
测试时发现,将应用程序放到/system/app后不重启系统,仍然会被识别为普通的进程。当系统重新启动时,会在一开始就启动该进程并把它优先级设置为coreserver。
通过dumpsys activity命令能够很明显的看出其中差别。
Running processes (most recent first):
App # 3: adj= 2/1 ProcessRecord{30858c20 1877:com.android.email/10014} (started-services)
PERS # 2: adj=-100/0 ProcessRecord{308fb390 1713:system/1000} (fixed)
App # 1: adj= 0/0 ProcessRecord{30908198 1794:android.process.acore/10005} (top-activity)
PERS # 0: adj= -12/0 ProcessRecord{3090d488 1789:xiao.xiong.test/10026} (fixed)
而且adj=-12时,这个进程通过ddms手动stop后会立即启动

更多相关文章

  1. 浅析android通过jni控制service服务程序的简易流程
  2. 关于Android(安卓)Studio3.2新建项目Android(安卓)resource link
  3. Android(安卓)- Manifest 文件 详解
  4. Android之应用程序基础
  5. Android四大组件的理解
  6. Android官方入门文档[1]创建一个Android项目
  7. 第三章 Android程序设计基础
  8. 2011年Android(安卓)Camera学习笔记之一
  9. [置顶] Android(安卓)跨进程通信Aidl的使用及注意事项

随机推荐

  1. Android文章收藏
  2. 【实战】android获取天气情况(Json来返回
  3. Android:Task '' not found in root proj
  4. android 底部菜单写法之FragmentTabHost
  5. android webview 设置
  6. AndroidStudio打包apk出现的问题 `Error:
  7. react-native开发实例之替换默认logo——
  8. Android(安卓)Studio如何引用外部Library
  9. Android(安卓)JNI和NDK学习(3)--Android.
  10. AndroidStudio用gradle编译中文乱码