activity销毁处理

阻止运行在后台的activity被系统回收

1.退之后台

 重写finish()方法:
  moveTaskToBack(true);
  不要调super.finish(),只调上面这一句就行了,这样只有在第一次启动的时候会走到onCreate()。以后(只要进程不死掉)都不会再走onCreate()
//这就省的处理拦截返回home啥的了
2. android.os.Process.killProcess(android.os.Process.myPid()); 
??? http://zheyiw.iteye.com/blog/2042873貌似用不到

3.onSaveInstanceState(销毁时)/onRestoreInstanceState(重构时)

对于Activity被系统回收导致的问题,可以使用切换横竖屏来模拟场景。//so

  @Override
2     protected void onSaveInstanceState(Bundle outState) {
3 //        super.onSaveInstanceState(outState);
4     }
使用viewpager是,退至后台,当activity销毁时,fragment没销毁且在onSaveInstanceState进行状态保存,然后activity重构是,之前还在,再初始化,导致重复加载,然后就会出现view空白

http://www.cnblogs.com/liuling/p/2015-9-21-1.html

此外数据恢复之用

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
        savedInstanceState.putBoolean("MyBoolean",true);
        savedInstanceState.putDouble("myDouble", 1.9);
        savedInstanceState.putInt("MyInt", 1);
        savedInstanceState.putString("MyString","Welcome back to Android");
        // etc.
        super.onSaveInstanceState(savedInstanceState);
}
(不一定成对使用==另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。)
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
        double myDouble = savedInstanceState.getDouble("myDouble");
        int myInt = savedInstanceState.getInt("MyInt");
        String myString = savedInstanceState.getString("MyString");
}

总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。(http://android.blog.51cto.com/268543/634646/

4.

如何让后台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为桌面应用的进程号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值