(原创)解决APP进程被杀死出现的一些坑
这几天在开发中遇到了这样一个问题
当打开的App数量达到一定数目时
原先的App进程会被系统杀死
然后再次进入这个被杀死的App时
发现了一些异常
经过排查,是viewpager的getitem方法没有被调用
通过网上的一些信息得知
用安卓默认的恢复方式来恢复这些数据
是会存在一些问题的
比如fragment的getActivity返回的值为空
于是我想到
是否可以不执行重新加载的方式呢?
于是就有了这篇博客。
处理方式其实也很简单,
就是在activity的onCreate方法中做一次判断
代码如下
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
savedInstanceState = null;
}
super.onCreate(savedInstanceState);
}
这里需要注意
一定要在super.onCreate函数前执行
这里是直接把系统保存后传过来的Bundle给置空了
如果你的是fragment相关的原因,可以不用这么极端的做法
直接替换成这段代码即可:
savedInstanceState.remove("android:support:fragments");
但是注意
如果你的Activity类是继承Activity而不是FragmentActivity时
里面的参数为android:fragments
说到这个恢复数据的事,再多提一点
我们都知道安卓恢复数据是用这两个方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
以及oncreate的Bundle参数
在API 21后为Activity增加了一个新的属性
只需在Manifest中的activity设置属性
android:persistableMode="persistAcrossReboots"
activity就有了持久化的能力,另外需要配合一个新的bundle才行,那就是PersistableBundle。
什么意思呢?
就是机器关机后来做数据恢复用的
这两个方法是上面两个方法的重载
代码如下
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
{
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle
persistentState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
}
可以看到多了一个Bundle
这个bundle里的数据关机后重启开启也是会有的
关于这两个方法,大家可以参考这篇博客
另外,也感谢这篇博客让我解决了开发中的问题