`

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

 
阅读更多

http://blog.csdn.net/leewind841209/article/details/6561874

[Target]

      在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。这个下次讨论

 

[Example]

      最后老样子放一个例子:

 

 

[java] view plaincopy
 
  1. public class SecondActivity extends Activity{  
  2.       
  3.     private static final String TAG = "Michael";  
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         // TODO Auto-generated method stub  
  7.         super.onCreate(savedInstanceState);  
  8.         if (savedInstanceState!=null) {  
  9.             Log.i(TAG, "data is "+savedInstanceState.getInt("save"));  
  10.         }  
  11.         setContentView(R.layout.main);  
  12.     }  
  13.       
  14.     @Override  
  15.     protected void onSaveInstanceState(Bundle outState) {  
  16.         // TODO Auto-generated method stub  
  17.         super.onSaveInstanceState(outState);  
  18.         outState.putInt("save"11);  
  19.         Log.i(TAG, "onSaveInstanceState, data is "+outState.getInt("save"));  
  20.     }  
  21.     @Override  
  22.     protected void onRestoreInstanceState(Bundle savedInstanceState) {  
  23.         // TODO Auto-generated method stub  
  24.         super.onRestoreInstanceState(savedInstanceState);  
  25.         Log.i(TAG, "onrestore, data is "+savedInstanceState.getInt("save"));  
  26.     }  
  27.       
  28. }  
分享到:
评论

相关推荐

    Android onSaveInstanceState和onRestoreInstanceState触发的时机

    Android 中的 onSaveInstanceState 和 onRestoreInstanceState 是两个重要的生命周期方法,它们在 Activity 的生命周期中扮演着关键角色。了解这两个方法的触发时机对于开发者来说是非常重要的。 首先,我们需要...

    onSaveInstanceState调用的小例子

    然后,当活动被重新创建(如屏幕旋转后),Android会调用`onCreate`或`onRestoreInstanceState`,在这里你可以从`savedInstanceState`参数中恢复之前保存的状态: ```java @Override protected void onCreate...

    android Activity 详述 demo

    当Activity被系统销毁(如屏幕旋转)时,可以使用`onSaveInstanceState(Bundle)`保存当前状态,然后在`onCreate(Bundle)`或`onRestoreInstanceState(Bundle)`中恢复。 在"ActivityDemo"项目中,开发者通常会创建一...

    Android的Activity周期测试

    - onCreate():Activity首次创建时调用,用于初始化界面布局和基本组件。 - onStart():Activity变得可见但不一定是前台活动时调用。 - onResume():Activity完全可见并与用户交互时调用。 2. 运行过程: - ...

    Android中Activity的生命周期探讨

    为了确保Activity在停止和重启后能正确恢复,开发者应使用`onSaveInstanceState()`保存关键数据,并在`onCreate()`或`onRestoreInstanceState()`中恢复。 7. 状态管理最佳实践 理解并妥善处理Activity的生命周期是...

    Android Activity生命周期Demo源码.rar

    开发者可以通过重写`onSaveInstanceState()`保存状态,并在`onCreate()`或`onRestoreInstanceState()`恢复。 8. **后台任务和Intent**: 在Activity的生命周期中,Intent常用来启动其他Activity或Service。通过`...

    android各组件详解-activity

    4. **保存和恢复状态**:在onSaveInstanceState()和onRestoreInstanceState()方法中保存和恢复Activity的状态,以确保应用在配置改变时能正确恢复。 总之,理解Activity的生命周期和如何有效地管理它是开发Android...

    android activity 生命週期

    6. **onSaveInstanceState()**:在系统将要销毁Activity前调用,用于保存Activity的当前状态,以便在重新创建Activity时恢复。通常用于保存临时数据或视图状态。 7. **onDestroy()**:当Activity被销毁前调用,这是...

    android生命周期管理:重置一个Activity

    Android 生命周期管理:重置一个 Activity Android 生命周期管理是 Android...通过 onSaveInstanceState() 和 onRestoreInstanceState() 回调函数,可以保存和恢复 Activity 的状态信息,避免数据丢失和恢复状态信息。

    Activity_Callback.rar_Callback android_activity Callback_android

    - **onSaveInstanceState()** 和 **onRestoreInstanceState()**:用于在Activity重建时保存和恢复用户界面的状态。 了解并正确使用这些回调是Android开发者的基本功。在实际开发中,我们经常需要根据业务需求在回调...

    android activity状态保存

    2. `onCreate(Bundle savedInstanceState)` 和 `onRestoreInstanceState(Bundle savedInstanceState)`: 在Activity创建时,如果之前保存了状态,系统会调用`onCreate()`方法,并传递保存的Bundle。开发者可以在`...

    Android Activity和Fragment的生命周期测试代码

    在实际开发中,尤其要注意处理配置变更(如屏幕旋转)导致的Activity重建,以及在onSaveInstanceState(Bundle outState)和onRestoreInstanceState(Bundle savedInstanceState)中保存和恢复状态。同时,合理使用静态...

    android Activity生命周期 详解

    当用户返回,`onRestart()`->`onStart()`->`onResume()`会被调用,若Activity被销毁并重新创建,`onCreate()`会再次调用,接着是`onStart()`和`onResume()`。 理解并熟练掌握Activity生命周期对于开发高效、响应式...

    Android Activity和Intent机制.doc

    为了保存Activity的状态,开发者可以使用onSaveInstanceState Bundle参数来存储关键数据,然后在onCreate或onRestoreInstanceState中恢复这些数据。 Intent是Android中的一个关键类,它用来表示一个动作、动作的...

    Android Activity 生命周期

    为避免数据丢失,可在`onSaveInstanceState(Bundle outState)`中保存关键数据,并在`onCreate(Bundle savedInstanceState)`或`onRestoreInstanceState(Bundle savedInstanceState)`中恢复。 8. **Task和Back Stack*...

    Activity之间的相互调用与传递参数

    在onSaveInstanceState()中保存数据,然后在onCreate()或onRestoreInstanceState()中恢复。 总结一下,Activity之间的相互调用与传递参数是Android开发中的核心技能。理解启动模式、Intent的使用、回调机制以及生命...

    重建Activity-Recreating an Activity

    6. 理解和利用生命周期回调函数:Activity生命周期涉及多个回调函数,如onCreate(), onRestoreInstanceState(), 和onSaveInstanceState()。这些方法分别在Activity创建、恢复状态和保存状态时被系统调用。正确地实现...

    Android基础-2(Activity)

    为了在Activity状态改变时保存用户数据,Android提供了onSaveInstanceState(Bundle outState)和onRestoreInstanceState(Bundle savedInstanceState)方法。在系统准备销毁Activity时,会调用onSaveInstanceState(),...

Global site tag (gtag.js) - Google Analytics