Activity状态的保存

在Activity中有两个方法:onSavedInsanceState()和onRestoreInstanceState()。这两个方法并不是Activity的生命周期方法,因此它们并不一定被触发。
事实上,onSavedInsanceState()用于一般是在一个activity被杀掉之前调用用以保存每个每个实例的状态,以保证该状态可在onCreate(Bundle)或者onRestoreInstanceState(Bundle)中恢复。那么onSavedInstanceState到底是何时被调用的呢?看看google的官方文档:

Android calls onSaveInstanceState() before the activitybecomes vulnerable to being destroyed by the system, but does not bothercalling it when the instance is actually being destroyed by a user action (suchas pressing the BACK key).

这句话翻译为当某个Acticity变得“容易”被系统销毁时,onSaveInstanceState()就会被执行,如果是用户主动销毁的(如用户按下back键),那么该方法是不会执行的。这个“容易被系统销毁”包括以下几种情况:

(1)当用户按下HOME键的时候
(2)长按HOME键,选择运行其它程序的时候
(3)按下电源键的时候
(4)从一个Activity启动到另一个Activity (5)屏幕方向切换时,例如从横屏切换到竖屏(这个时候Activity是真正被销毁了)

我们常常在onCreate方法中执行的和super.onCreate(savedInstanceState)事实上就是执行的回复Activity状态的操作。
注意:这里有一点需要注意,当Activity调用onSaveInstanceState时,它实质上是将它里面的一些View的状态保存到它所属的进程的内存空间里,如果你手动结束了这个进程,是无法再重新恢复的。

同样的, onRestoreInstanceState()也并不是一定会调用,它被调用的前提是:Activity确实被销毁了,而不仅仅是停留在上面所列的几种可能的情况下。如用户按下HOME后马上切回程序,是不会调用该方法的,而屏幕方向切换却会调用它。

上面提到过,使用back按键时实质上是用户主动地去销毁这个activity,因此不会保存状态。但是如果我们这时候想保存状态(比如手Q、天天动听等),该怎样做呢?看下Stackoverflow中有人提供的解决方案:

这里提到了两种解决方案:

  • 使用一个Service来保存状态 : 这个多用于activity真正的销毁了
  • moveTaskToBack(true) : 捕获按钮事件,使用moveTaskToBack方法让activity移到后台,而不让它真正销毁

好了,看下下面的实现:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_MENU) {
        showExitDialog();
        return true;
    }
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (getCurrentFrame().onBackPressed()) {
            return true;
        }
        //注意这一句,它重写了用户按下back键触发的事件,这里执行moveTaskToBack只是将activity移到后台,并没有销毁
        if (moveTaskToBack(true)) {
            app.showNotification(this);
        }
        return true;
    }

    return super.onKeyDown(keyCode, event);
}   

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值