首页 > 代码库 > 如何让后台Activity不被系统回收
如何让后台Activity不被系统回收
最近帮忙客户定制一款A20平台的视频机,由于视频机内存太小,偶尔会出现从桌面跳转到其他应用(如泰捷视频看会电影)再返回桌面时桌面重启的情况,根据经验,应该是桌面主Activity由于内存太小被系统回收了。
开始认为在桌面应用AndroidManifest.xml文件中Application节点中加了一条属性:android:persistent="true" 就可以了,push到system/app重启,经测试,发现不行。应该这条属性比较适合Service。
最后在framework层解决:
找到frameworks\base\services\java\com\android\server\am\ActivityManagerService.java这个类,修改这个文件,在startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr)方法(注意有两个startProcessLocked方法,这个是参数少的)中增加如下代码:
private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr) { //added by lgj 2015.1.14 Slog.w(TAG, "startProcessLocked modified by lgj "+app.processName); if("com.csw.csw_launcher".equals(app.processName)) { app.maxAdj = ProcessList.FOREGROUND_APP_ADJ; Slog.w(TAG, "startProcessLocked has been modified com.csw.csw_launcher persistent=true"); } ...... ...... }其中com.csw.csw_launcher为桌面应用的包名。
修改后保存,重新编译系统,生成固件,桌面安装在这个固件中就不会被销毁了。
如果嫌麻烦,在/android/out/target/product/sugar-ref001/system/framework这个目录下会有个services.jar文件,下次把这个文件直接替换系统system/framework下的services.jar重启即可。
#cat /proc/xxx/oom_adj查看oom_adj的值是否为0,xxx为桌面应用的进程号。
如何让后台Activity不被系统回收