android应用被强杀或应用被回收导致的空指针问题等其他问题

2020-01-02  本文已影响0人  on_i_on

在开发中我们经常会遇见app退到后台再打开会出现空指针、页面显示不全等一系列奇怪的问题。

问题分析:

当我们的进程被强杀或者被回收的时候,Android系统虽然让你的进程没有了,但是此进程中Activity中栈的信息还是存在的,也就是说此时当你点开此应用的时候程序中的Activity栈信息任然存在,只不过Activity中的数据都没有了,需要重新创建新的Activity数据。

处理方式:

分别涉及到:一个单例ConstantInstance 基类BaseAcyivity 首页MainActivity 启动页IndexActivity

在启动页IndexActivity 存一个单例值
public class IndexActivity extends BaseAcyivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
    // 在单例中存一个状态标志app属于正常状态
    ConstantInstance.getInstance().setAppStatus(ConstantInstance.STATUS_NORMAL);
    super.onCreate(savedInstanceState);
    、、、、、、
}
基类BaseAcyivity onCreate方法判断单例的值
public class BaseAcyivity extends AutoLayoutActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    switch (ConstantInstance.getInstance().getAppStatus()) {
        /**
         * 应用被强杀
         */
        case ConstantInstance.STATUS_FORCE_KILLED:
            //跳到主页,主页lauchmode SINGLETASK
            Intent intent = new Intent(this, MainActivity.class);
            intent.putExtra(ConstantInstance.KEY_HOME_ACTION, ConstantInstance.ACTION_RESTART_APP);
            startActivity(intent);
            break;
    }
}
这里我们如果发现单例的状态变为非正常状态,被强杀了,就跳转到首页MainActivity ,
MainActivity 的启动模式为SINGLETASK,这时候会调用MainActivity 的onNewIntent方法
MainActivity的onNewIntent
 @Override
protected void onNewIntent(Intent intent) {
    int appStatus = intent.getIntExtra(ConstantInstance.KEY_HOME_ACTION, ConstantInstance.STATUS_NORMAL);
    L.e("appStatus====" + appStatus);
    switch (appStatus) {
        case ConstantInstance.ACTION_RESTART_APP:
            startActivity(new Intent(this, IndexActivity.class));
            finish();
            break;
    }
}
这里我们发现需要重启app 重启动页开始 重新启动app
ConstantInstance
public static final int STATUS_FORCE_KILLED = -1; //应用放在后台被强杀了
public static final int STATUS_NORMAL = 2; //APP正常态
public static final int ACTION_RESTART_APP = 9;//被强杀
上一篇下一篇

猜你喜欢

热点阅读