(原创)解决APP进程被杀死出现的一些坑

(原创)解决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里的数据关机后重启开启也是会有的
关于这两个方法,大家可以参考这篇博客

另外,也感谢这篇博客让我解决了开发中的问题