在开发中我们经常会遇见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;//被强杀
网友评论