android launcher开发(2)状态的保存与恢复

来源:互联网 发布:去痘印面膜 知乎 编辑:程序博客网 时间:2024/04/29 05:58

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);        }    }
0 0
原创粉丝点击