当前位置: 代码迷 >> Android >> [Android][Activity] onCreate, onSaveInstanceState跟onRestoreInstanceState的调用探讨
  详细解决方案

[Android][Activity] onCreate, onSaveInstanceState跟onRestoreInstanceState的调用探讨

热度:182   发布时间:2016-05-01 14:07:30.0
[Android][Activity] onCreate, onSaveInstanceState和onRestoreInstanceState的调用探讨
(转)http://blog.csdn.net/leewind841209/article/details/6561874
[Android][Activity] onCreate, onSaveInstanceState和onRestoreInstanceState的调用探讨 .

      在Activity里的onCreate(Bundle savedInstanceState)函数中,savedInstanceState这个参数是用来存储Activity的信息,包括了每个UI的信息和用户自定义在其中存储的信息。这篇文章就目的就是讨论关于Activity的自身信息的存储。



[Investigation]

      Activity下的函数onSaveInstanceState(Bundle outState),是用来做具体内容的存储。如果不复写的话,这个函数的作用就是调用每个View的onSaveInstanceState去存储UI里面的信息,什么文字、颜色、focus的状态等等。如果复写的话,Programmer可以在这里定义一些需要存储的信息,放到Bundle,调用Bundle里面什么putInt之类的函数。

      但是这个函数的难点在于它什么时候被调用,这个不是用简单的生命周期来分析定义的,而其中涉及到了一些逻辑判断。

      有篇翻译过来的文章值得推荐: http://blog.csdn.net/ddna/archive/2010/01/03/5123482.aspx

      这个函数的执行,我总结下来有这样几点需要注意的

1.如果onSaveInstanceState被调用,是在onResume到onPause之间被调用的
2.使用了finish来关闭Activity不会调用onSaveInstanceState,也就是说这个Activity不可能被再现
3.如果使用了startActivity跳转Activity,onSaveInstanceState也不会被调用,因为原来的Activity并没有被销毁,只是保存到了stack中去了。只要这些UI信息不被破坏,那么onSaveInstanceState是不会被调用的
4.如果orientation发生了变化,同时没有规定Activity在orientation变化的时候不重启,那么Activity会调用onDestory销毁当前的Activity,但是同时onSaveInstanceState也会被调用,这样在变化之后,原有的画面信息仍然被保留了下来
5.如果使用中点击了Home键,onSaveInstanceState不会被调用,因为Activity没有被销魂,只是放到了stack中去了,跟startActivity的情况一样。
      我知道我说的可能跟很多其他人转帖的内容不一样,我只想说这些都是我从实际使用中和阅读了Google文档进行分析的来的,欢迎指正。



      说完了onSaveInstanceState的调用情况,来说一下返回情况,一般在onSaveInstanceState存储的值,可以在两个地方得到:

1.onCreate(Bundle savedInstanceState)
2.onRestoreInstanceState(Bundle savedInstanceState)
     onCreate这个函数,我们继承它的时候,经常不会说把super这行代码去掉,因为前面它有很多代码都是包含了如何用savedInstanceState信息来还原界面的。

     onRestoreInstanceState这个函数的调用是在onStart到onResume之间执行的。

     为什么要有两个来调用?我觉得这跟Activity保存和还原的方式有关。举个例子来说,如果我们调用了startActivity从Activity A跳转到了Activity B,那么Activity A只调用到了onStop,它本身并没有被消除,只是存到了stack中去了。当你在Activity B中点了Back键,回到Activity A中来,这个时候Activity A是从onStart开始调用的。所以很明显,onCreate这里,我们没有经过,不能在这里读到保存的信息,但是有了onRestoreInstanceState,我们又可以做到了。



[Fect]

      说说onSaveInstanceState的缺点,我们可以看到,只有在onCreate和onRestoreInstanceState这样非常不灵活,而且只能用Bundle这个也限制了我们的代码编写。所以Android还提供了一个API:onRetainNonConfigurationInstance。这个下次讨论

public class SecondActivity extends Activity{

private static final String TAG = "Michael";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
if (savedInstanceState!=null) {
Log.i(TAG, "data is "+savedInstanceState.getInt("save"));
}
setContentView(R.layout.main);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putInt("save", 11);
Log.i(TAG, "onSaveInstanceState, data is "+outState.getInt("save"));
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "onrestore, data is "+savedInstanceState.getInt("save"));
}

}
  相关解决方案