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

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值