首页 > 代码库 > 如何让后台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不被系统回收