Activity状态的保存

来源:互联网 发布:youtube翻墙软件下载 编辑:程序博客网 时间:2024/05/17 01:58

在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);}   

原创粉丝点击