Launcher除了进行桌面应用程序的展示意外,还提供管理应用程序的功能。作为一个程序,launcher长期位于后台,因此他也可能遭遇到app的危机,当内存不足的时候遭受到系统的回收。那么问题来了,我们如何进行launcher状态的保存与恢复。
activity的状态保存
我们都知道,activiy是在onsaveInstanceState()中进行状态的保存。
onSaveInstanceState(Bundle outState)
我们就是通过outstate保存状态。
例如 应用程序窗口视图的层次,Fragment的状态信息
那么什么时候调用这个方法呢,一般是在onstop调用之前,但并不是说所有调用onstop()方法都会进行状态的保存。只有在activity覆盖,或者长时间没有操作,黑屏的时候。
有一点需要注意的是,如果我们点击打开一个dialog,而这个dialog是设置为dialog主题的activity,同样会触发。
launcher状态的保存
我们看下laucher 的onSaveInstanceState(Bundle outState)的代码
if (mWorkspace.getChildCount() > 0) {
outState.putInt(RUNTIME_STATE_CURRENT_SCREEN,
mWorkspace.getCurrentPageOffsetFromCustomContent());
}
super.onSaveInstanceState(outState);
//判断页数,如果大于一,那么保存当前的页数
outState.putInt(RUNTIME_STATE, mState.ordinal());
// 枚举类型,保存launcher的状态,例如是否在应用程序菜单界面();
// We close any open folder since it will not be re-opened, and we need to make sure
// this state is reflected.
closeFolder();
if (mPendingAddInfo.container != ItemInfo.NO_ID && mPendingAddInfo.screenId > -1 &&
mWaitingForResult) {
outState.putLong(RUNTIME_STATE_PENDING_ADD_CONTAINER, mPendingAddInfo.container);
outState.putLong(RUNTIME_STATE_PENDING_ADD_SCREEN, mPendingAddInfo.screenId);
outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_X, mPendingAddInfo.cellX);
outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_Y, mPendingAddInfo.cellY);
outState.putInt(RUNTIME_STATE_PENDING_ADD_SPAN_X, mPendingAddInfo.spanX);
outState.putInt(RUNTIME_STATE_PENDING_ADD_SPAN_Y, mPendingAddInfo.spanY);
outState.putParcelable(RUNTIME_STATE_PENDING_ADD_WIDGET_INFO, mPendingAddWidgetInfo);
outState.putInt(RUNTIME_STATE_PENDING_ADD_WIDGET_ID, mPendingAddWidgetId);y
有一点需要注意到的是状态的保存与恢复并不是一一对应的关系。并不是说,调用了onSaveInstanceState就一定会进行状态的恢复。
launcher状态的恢复
public void onRestoreInstanceState(Bundle state) {
/*
* for循环恢复每一页的状态
* */
super.onRestoreInstanceState(state);
for (int page: mSynchronouslyBoundPages) {
mWorkspace.restoreInstanceStateForChild(page);
}
}