阻止运行在后台的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为桌面应用的进程号