Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法, 它们不同于 onCreate()、onPause()等生命周期方法 在activity被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (传入的Bundle参数是由onSaveInstanceState 至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,(本人注:我昨晚调试时就发现原来不一定成对被调用的 onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候 ,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState
作用 Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause() 这就是onSaveInstanceState() 和 onRestoreInstanceState() 两个函数的基本作用和用法。 通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState()和 onRestoreInstanceState() 方法,我们可以清楚地知道当某个activity (虽然测试时发现多数在onPause()前) 三. onRestoreInstanceState()调用时机 onRestoreInstanceState() 被调用的前提是,activity A“ onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之间调用。
通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为 至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState 当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState 方法不会被执行 另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原
Override public void onSaveInstanceState(Bundle savedInstanceState) { // 通过Bundle参数以键值对的方式进行数据的存储 // 数据恢复:onRestoreInstanceState 核心方法 onRestoreInstanceState() 2. 具体调用场景 若 异常关闭了Activity,即调用了onSaveInstanceState() & 下次启动时会调用onRestoreInstanceState() 注:此时结合Activity的生命周期的调用顺序是 : onCreate() onStart() onRestoreInstanceState() onResume() 4. 使用示例 @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState
通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为 至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState 当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState 方法不会被执行 另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原 发布者:全栈程序员栈长,转载请注明出处
(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } @Override protected 只有是系统自动回收的时候才会保存 Bundle 对象数据; -- Bundle 对象来源 : onCreate() 方法中的 Bundle 对象参数, 是在 onSaveInstance() 或者 onRestoreInstanceState 会自动保存组件的状态, 注意, 只有有 id 的组件才会保存; -- 关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的; (3) onRestoreInstanceState (Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); System.out.println ("onRestoreInstanceState() : " + savedInstanceState.getString("octopus")); } @Override protected
最先找到的文档就是通过 Activity 的 onSaveInstanceState 和 onRestoreInstanceState 方法来保存用户状态, 虽然最终测试发现这种方法不是肯靠谱, 还是记录下来了 onRestoreInstanceState 恢复状态 当系统重新回到以前被系统回收的应用时, 会调用 onRestoreInstanceState 方法, 如果之前用 onSaveInstanceState 保存了状态, 则可以通过重写 onRestoreInstanceState 方法恢复状态。 = null) { /* retain ui state */ } } 也可以在 onRestoreInstanceState 方法中读取保存的状态, 代码如下: protected override void OnRestoreInstanceState(Bundle savedInstanceState) { base.OnRestoreInstanceState(savedInstanceState
(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.d("roamer", " onRestoreInstanceState"); } 通过onSaveInstanceState()方法传递进来的Bundle对象中,存入我们想要保存的东西。 然后,当Activity被重新创建的时候,我们就可以通过onCreate()或者onRestoreInstanceState()方法的Bundle对象,来获得我们之前存入的数据。 并且系统调用onRestoreInstanceState()的时机,是在onStart()之后,onResume之前。 protected void onRestoreInstanceState(Parcelable state) { // TODO Auto-generated method stub super.onRestoreInstanceState
在这种情况下,您可以通过回调方法onSaveInstanceState()来保存Activity的一些重要信息,并通过onCreate()或者onRestoreInstanceState()回调方法来恢复这些信息 ", "onRestoreInstanceState"); } 通过onSaveInstanceState()方法传递进来的Bundle对象中,存入我们想要保存的东西。 然后,当Activity被重新创建的时候,我们就可以通过onCreate()或者onRestoreInstanceState()方法的Bundle对象,来获得我们之前存入的数据。 并且系统调用onRestoreInstanceState()的时机,是在onStart()之后,onResume之前。 ()方法 //该方法允许每个View提供自己需要保存的信息 @Override protected void onRestoreInstanceState(Parcelable state)
在Activity销毁的时候先通过onSaveInstanceState的Bundle参数里面,存储一些内容,然后在重建时候调用onRestoreInstanceState方法传递刚才那个Bundle, (Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.v (Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } 复制代码 既然我们没有做额外处理 ,那说明关键点就在super.onSaveInstanceState(outState);和super.onRestoreInstanceState(savedInstanceState);这二句话了。 然后在super.onRestoreInstanceState(savedInstanceState);方法中会再调用每个View的onRestoreInstanceState方法,我们的EditText
3.onSaveInstanceState()与onRestoreInstanceState()这两个方法。 原本以为只有在系统因为内存回收Activity时才会调用的onSaveInstanceState(),居然在转跳到其他Activity、打开多任务窗口、使用Home回到主屏幕这些操作中也被调用,然而onRestoreInstanceState 接着通过调查资料发现Activity中的onSaveInstanceState()里面有一句super.onRestoreInstanceState(savedInstanceState),Google 其实到这里大家也就明白了,就是因为这句话导致了重影的出现,于是我删除了这句话,然后onCreate()与onRestoreInstanceState()中同时使用问题一中的创建Fragment方法,然后再通过保存切换的状态 R.layout.activity_index); setTabSelection(position); } @Override protected void onRestoreInstanceState
crtl+f12切换成横屏时 onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState 发现打印了两次相同的log onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState onResume--> onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState orientation",执行步骤3 onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState onConfigChanged onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState
异常生命周期 我们看脑图就知道,在异常生命周期中,我们会额外执行二个方法:onSaveInstanceState(Bundle outState)和onRestoreInstanceState(Bundle 在Activity销毁的时候先通过onSaveInstanceState的Bundle参数里面,存储一些内容,然后在重建时候调用onRestoreInstanceState方法传递刚才那个Bundle, (Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.v super.onSaveInstanceState(outState);和super.onRestoreInstanceState(savedInstanceState);这二句话了。 然后在super.onRestoreInstanceState(savedInstanceState);方法中会再调用每个View的onRestoreInstanceState方法,我们的EditText
W/System.err( 1611): at android.view.View.onRestoreInstanceState(View.java:13772) W/System.err( 1611 ): at android.widget.TextView.onRestoreInstanceState(TextView.java:3784) W/System.err( 1611): (Activity.java:1074) W/System.err( 1611): at com.android.launcher3.Launcher.onRestoreInstanceState Launcher.java:2013) 在网上找到如下解决方法: packages/apps/Launcher3/src/com/android/launcher3/Launcher.java: public void onRestoreInstanceState catch block // ---------------------------------------------------------------------- //super.onRestoreInstanceState
当系统重建的时候会调用onRestoreInstanceState这个方法,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState 和onCreate方法,因为我们可以通过onCreate和onRestoreInstanceState方法来判断Activity是否被重建了,如果被重建了,那么我们就可以取出之前保存的数据并恢复,从上图我们可以看出 ,onRestoreInstanceState的调用时机是在onStart之后。 同时,我们知道onSaveInstanceState和onRestoreInstanceState方法当中,系统为我们做了一定得恢复工作。 这里可以简单地这么理解,系统只在Activity异常终止的时候才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,其他情况不会触发这个过程。
若系统在Activity被Destory之后想重新创建这个Activity实例时,之前的Bundle对象会(系统)被传递到你我们activity的onRestoreInstanceState()方法与 恢复Activity onRestoreInstanceState onCreate与 onRestoreInstanceState回调方法都接能收到onSaveInstanceState回调的Bundle onRestoreInstanceState方法会在 onStart方法之后执行. 系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState。
如果你是一个有经验的 Android 程序员,那么你肯定手写过许多 onSaveInstanceState 以及 onRestoreInstanceState 方法用来保持 Activity 的状态,因为 当然,恢复这个操作也可以在 onRestoreInstanceState 这个方法实现: public void onRestoreInstanceState(Bundle savedInstanceState ) { // Always call the superclass so it can restore the view hierarchy super.onRestoreInstanceState 但是并不优雅,为了保持变量的值,引入了两个方法 ( onSaveInstanceState 和 onRestoreInstanceState ) 和两个常量 ( 为了存储两个变量而定义的两个常量,仅仅为了放到
() onSaveInstanceState()和onRestoreInstanceState()使用详解 https://www.jianshu.com/p/27181e2e32d2 注意 1、如果是用户自动按下返回键,或程序调用finish()退出程序,是不会触发onSaveInstanceState()和onRestoreInstanceState()的。 即会执行onSaveInstanceState()和onRestoreInstanceState()的。 这两个方法onCreate()和onRestoreInstanceState()回调方法都会收到Bundle包含实例状态信息的相同方法。 系统onRestoreInstanceState()只有在存在保存状态的情况下才会恢复,因此您不需要检查是否Bundle为空: public void onRestoreInstanceState(Bundle
03-23 00:19:51.490 26457-26457/com.example.david.lifecircle E/TAG: onRestoreInstanceState() is invoked 注意: onSaveInstanceState和onRestoreInstanceState调用时机: 当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState 至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState 当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState 另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。
OnRestoreInstanceState的调用时机 之前已经说过,OnRestoreInstanceState虽然与onSaveInstanceState是配对实现的,但是其调用却并非完全成对的,在 可以看出,OnRestoreInstanceState的调用时机是在onStart之后,在onPostCreate之前。 接下来看一下ViewPager的恢复以及onRestoreInstanceState到底做了什么, protected void onRestoreInstanceState(Bundle savedInstanceState (state instanceof SavedState)) { super.onRestoreInstanceState(state); return; } 针对Window,如果不想让View使用恢复逻辑,在基类的FragmentActivity中覆盖onRestoreInstanceState函数即可。