在安卓开发过程当中,当点击HOME键,将app运行在后台时,而后再点击app图标进入时,遇到了以下两种状况:app
一、每次打开时,app的入口页面老是被执行。ide
二、当运行内存被其它应用占用完时,在进入app时,home时的当前页面数据没有被清除(待进一步确认),此时页面正常,点击返回键以后显示的页面数据被清除了,而致使应用崩溃。指针
下面将针对这两个问题的处理方式进行相对应的说明。code
1、若是activity的启动方式是singleTask,则会出现此问题。若是是默认的standard方式,则没有这样的问题(待进一步确认)。可是不少时候都须要使用singleTask方式启动界面,这时须要在app入口的界面的oncreate()方法中作如下处理。生命周期
if (!isTaskRoot()){
finish();
return;
}
说明:isTaskRoot():用来判断当前Activity是否是该任务栈中的根Activity,也就是说是否是一个启动的Activity。而且该activity是否被启动过。
moveTaskToBack(boolean momRoot):是把当前的Activity退到后台,不是finish,并不会走ondestory()。参数nonRoot表示的含义是此方法对非根activity是否有效,也就是说true表示对全部activity均有效,false表示只对根activity有效。
此时要注意该界面销毁时所作的操做,要避免空指针异常。
2、这里要讲两个方法:
一、
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putBoolean(SaveState,true);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(SaveState,true);
}
onSaveInstanceState方法有这两个,第一个使用在非FragementActivity中,而第二个用在FragementActivity中。
该方法会在系统自动清除组件里的数据时会被调用。
二、
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.putBoolean(SaveState,true);
}
该方法会在系统销毁组件时会被调用。
用这两个方法保存的变量,能够在组件的onCreate(Bundle savedInstanceState)方法中取出。每次界面数据被清理掉以后,再显示到前台时,都会从新走生命周期。Fragement有本身的生命周期,也须要作处理。