`
moor212
  • 浏览: 173898 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[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"));
}

}
分享到:
评论

相关推荐

    Android代码-svc

    "View" code and "Screen Code" such as onCreate,onCreateView, onViewCreated or onSaveInstanceState, onRestoreInstanceState.onActivityResult etc. It makes hard to see each "View Logic" and "Screen Logic...

    Android Studio SQLite不调用oncreate方法

    Android Studio SQLite不调用oncreate方法

    Android-教程精华-开发

    次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState), 以及Activity之间的跳转和数据传输(intent)。 Activity中常用的函数有SetContentView() findViewById() finish() startActivity(),其...

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化

    Activity 的生命周期 以及 横屏竖屏切换时 Activity 的状态变化 例如: 切换到横屏 onSaveInstanceState onPause onStop onDestroy onCreate onStart onRestoreInstanceState onResume

    Android activity原理分析

    主要是讲android的activity工作原理,比如onCreate,onstart,onRestart,onResume,等这些函数的执行时机,调用逻辑,有详细的流程图;

    android 面试

     答:onCreate()Activity第一次加载时调用,用户构建窗体  onStart()Activity能被用户看到时时调用  onResume()Activity能够得到用户焦点时调用  onRestart()Activity第二次被加载时调用,不在调用onCreate()  ...

    Android 中 onSaveInstanceState()使用方法详解

    覆盖onSaveInstanceState方法,并在onCreate中检测savedInstanceState和获取保存的值 @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(currentposition, videoView....

    Android 多个activity完全退出实例代码

    2、在你要退出的activity Oncreate方法中加入ExitApplication.getInstance().addActivity(this);作用是添加到你的activity历史中。 3、在你当前要完全退出程序的activity中覆盖onKeyDown方法. 4、当你点击手机的返回...

    android下activity生命周期

    android下activity生命周期 生命周期: 回调 描述 onCreate() 这是第一个回调,在活动第一次创建是调用 onStart() 这个回调在活动为用户可见时被调用 onResume() 这个回调在应用程序与用户开始可交互的时候调用 ...

    Android相机 解决三星bug版本

    如果 activity 的销毁如果无法避免 那么在activity销毁之前调用 onSaveInstanceState 保存图片的路径 当activity重新创建的时候 会将 onSaveInstanceState 保存的文件传递给onCreate()当中 在onCreate当中 检查照片...

    retainstate

    运行时变更就是设备在运行时发生变化(例如屏幕... 然后在 onCreate() 或 onRestoreInstanceState() 期间恢复 Activity 状态。 对于大量数据:用 Fragment 保留需要回复的对象。 自行处理配置变更,不重启Activity。

    Android onCreate( )方法详细介绍

    本文主要介绍Android onCreate( )方法,做Android应用的朋友对onCreate()的方法并不陌生,在开发应用的时候大家应该注意什么呢,这里给大家详细说明

    Android在OnCreate中获取控件的宽度和高度的实现代码

    在Android中,有时需要对控件进行测量,得到的控件宽度和高度可以用来做一些计算。在需要自适应屏幕的情况下,这种计算就显得特别重要

    Android学习笔记

    Android初步学习笔记 activity生命周期 docs/index.html 1、onCreate:第一次被启动、 2、onStart:activity可视时调用、 3、onResume:activity获得用户焦点是被调用、 4、onPause:启动另外一个activity时被调用、...

    理解Android中Activity的方法回调

    下面通过实例来模拟一下Android中Activity的方法回调思想。 Activity接口 代码如下: package com.xujing.test  //定义接口  public interface Activity{   //创建时调用的方法   public void onCreate();  ...

    Android中oncreate中获得控件高度或宽度的实现方法

    主要介绍了Android中oncreate中获得控件高度或宽度的实现方法的相关资料,希望通过本文大家能实现这样的功能,需要的朋友可以参考下

    Android编程实现两个Activity相互切换而不使用onCreate()的方法

    主要介绍了Android编程实现两个Activity相互切换而不使用onCreate()的方法,结合实例形式分析了多个Activity切换而不重新创建的操作技巧,需要的朋友可以参考下

    Android面试题-Activity A跳转Activity B,再按返回键,生命周期执行的顺序?

    最近在准备面试,碰到这一题...在A跳转B会执行:A onPause -> A onStop -> B onCreate -> B onStart -> B onResume 在B按下返回键会执行:B onPause -> B onStop -> B onDestroy -> A onRestart -> A onStart -> A on

    Android 右滑返回资源

    在不需要右滑返回的activity的onCreate()里调用 setSwipeBackEnable(false); //主 activity 可以调用该方法,禁止滑动删除 点击返回键也具有该动画效果: @Override public void onBackPressed() { ...

    android-activity-lifecycle-demo:一个Android应用程序,展示何时进行各种活动生命周期回调

    背景: android活动的生命周期包括以下回调: onCreate() , onStart() , onResume() , onPause() , onStop() , onRestart()和onDestroy() 。 这些回调为开发人员提供了指示应用程序行为的区域。onCreate() 此...

Global site tag (gtag.js) - Google Analytics