onCreate和onrestoreinstancestate这两种回复暂存数据的区别

kirophl 2018-02-06 06:04:29
两种都可以回复数据,暂时知道一个差别是onrestoreinstancestate不需要super父方法,oncreate不行,感觉不出来两者根本上的区别,就是只能用其中一个恢复数据的场景,求各路大神指教。
...全文
1462 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kirophl 2018-02-07
  • 打赏
  • 举报
回复
或者说我没读懂哪个地方,画个重点。。。
kirophl 2018-02-07
  • 打赏
  • 举报
回复
引用 2 楼 fenggering 的回复:
http://blog.csdn.net/fenggering/article/details/53907654 ---onCreate()里也有Bundle参数,可以用来恢复数据,它和onRestoreInstanceState有什么区别? 因为onSaveInstanceState 不一定会被调用,所以onCreate()里的Bundle参数可能为空,如果使用onCreate()来恢复数据,一定要做非空判断。 而onRestoreInstanceState的Bundle参数一定不会是空值,因为它只有在上次activity被回收了才会调用。 而且onRestoreInstanceState是在onStart()之后被调用的。有时候我们需要onCreate()中做的一些初始化完成之后再恢复数据,用onRestoreInstanceState会比较方便。下面是官方文档对onRestoreInstanceState的说明: This method is called after onStart() when the activity is being re-initialized from a previously saved state, given here in savedInstanceState. Most implementations will simply use onCreate(Bundle) to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation. 注意这个说明的最后一句是什么意思? to allow subclasses to decide whether to use your default implementation. 它是说,用onRestoreInstanceState方法恢复数据,你可以决定是否在方法里调用父类的onRestoreInstanceState方法,即是否调用super.onRestoreInstanceState(savedInstanceState); 而用onCreate()恢复数据,你必须调用super.onCreate(savedInstanceState);
谢谢大哥,这个我看过了
kirophl 2018-02-07
  • 打赏
  • 举报
回复
引用 1 楼 u012761076 的回复:
我一个一个回答你的问题: 一.onCreate是什么: onCreate是Activity调用create()的时候的回调方法,每一次创建Activity的时候都会调用,它的参数中有Bundle参数可以用来恢复数据。但是这个参数Bundle是从哪里来的呢?它是来自于onSaveInstanceState调用的时候保存的参数(onRestoreInstanceState的Bundle参数也是来自于这个方法),当activity有可能被系统回收的情况下,注意是有可能,如果是已经确定会被销毁,比如用户按下了返回键,或者调用了finish()方法强制销毁activity,则onSaveInstanceState不会被调用,Bundle就为null。注意onSaveInstanceState是在onStop之前调用。 二.onRestoreInstanceState是什么: onRestoreInstanceState是在Activity被系统回收了,但是你又需要创建一个新的对象,例如你从竖屏切换到横屏,系统就把你竖屏的Activity销毁并且回收,这时候调用了onSaveInstanceState保存了一个bundle对象,同时创建新的横屏Activity,这时候onRestoreInstanceState被调用传入之前保存的那个bundle。所以一旦onRestoreInstanceState被调用,它的Bundle必定不为null。 三.两者的区别: 1。onSaveInstanceState和onRestoreInstanceState是一 一对应的,一个保存状态Bundle,另一个Budle恢复状态。 2。onCreate 的bundle可能为null,而onRestoreInstanceState的Bundle必定不为null。所以恢复数据建议用onRestoreInstanceState 3。生命周期,这是上面说过横竖屏例子的生命周期 第一次创建onCreate -> onStart -> onResume->onPause -> 保存状态onSaveInstanceState -> onStop -> 销毁onDestroy -> 重新创建onCreate -> onStart -> 恢复之前保存的状态onRestoreInstanceState -> onResume 4。为什么一个可以super一个不可以super。 首先说说super()是什么:Java的多态性,一个子类继承父类,子类的方法可以继承父类的方法进行重载和重写,Override重载super()就是子类调用父类的方法,相当于把父类的该方法的代码全部拷贝到子类方法里面,然后子类再添加自己的代码。 而重写就是不要调用super(),相当于父类该方法只是做个声明,它的实现完全由子类代码决定。 由于onCreate中Activity的父类是有一些重要代码段必须要调用的,所以你必须先调用父类的onCreate。 而onRestoreInstanceState却不需要,在这个回调中你只要处理恢复好自己的业务逻辑就好了
感谢2楼说的这么详细,知识点是明白了,最近在看一看基础知识,突然这里就有点蒙蔽。 但有个疑惑: 恢复数据的时候,为什么还要用onrestoreinstancestate这个方法,只要在oncreate做一个非空判断就行了。
Smoyan_ 2018-02-07
  • 打赏
  • 举报
回复
引用 3 楼 kirophl 的回复:
[quote=引用 1 楼 u012761076 的回复:] 我一个一个回答你的问题: 一.onCreate是什么: onCreate是Activity调用create()的时候的回调方法,每一次创建Activity的时候都会调用,它的参数中有Bundle参数可以用来恢复数据。但是这个参数Bundle是从哪里来的呢?它是来自于onSaveInstanceState调用的时候保存的参数(onRestoreInstanceState的Bundle参数也是来自于这个方法),当activity有可能被系统回收的情况下,注意是有可能,如果是已经确定会被销毁,比如用户按下了返回键,或者调用了finish()方法强制销毁activity,则onSaveInstanceState不会被调用,Bundle就为null。注意onSaveInstanceState是在onStop之前调用。 二.onRestoreInstanceState是什么: onRestoreInstanceState是在Activity被系统回收了,但是你又需要创建一个新的对象,例如你从竖屏切换到横屏,系统就把你竖屏的Activity销毁并且回收,这时候调用了onSaveInstanceState保存了一个bundle对象,同时创建新的横屏Activity,这时候onRestoreInstanceState被调用传入之前保存的那个bundle。所以一旦onRestoreInstanceState被调用,它的Bundle必定不为null。 三.两者的区别: 1。onSaveInstanceState和onRestoreInstanceState是一 一对应的,一个保存状态Bundle,另一个Budle恢复状态。 2。onCreate 的bundle可能为null,而onRestoreInstanceState的Bundle必定不为null。所以恢复数据建议用onRestoreInstanceState 3。生命周期,这是上面说过横竖屏例子的生命周期 第一次创建onCreate -> onStart -> onResume->onPause -> 保存状态onSaveInstanceState -> onStop -> 销毁onDestroy -> 重新创建onCreate -> onStart -> 恢复之前保存的状态onRestoreInstanceState -> onResume 4。为什么一个可以super一个不可以super。 首先说说super()是什么:Java的多态性,一个子类继承父类,子类的方法可以继承父类的方法进行重载和重写,Override重载super()就是子类调用父类的方法,相当于把父类的该方法的代码全部拷贝到子类方法里面,然后子类再添加自己的代码。 而重写就是不要调用super(),相当于父类该方法只是做个声明,它的实现完全由子类代码决定。 由于onCreate中Activity的父类是有一些重要代码段必须要调用的,所以你必须先调用父类的onCreate。 而onRestoreInstanceState却不需要,在这个回调中你只要处理恢复好自己的业务逻辑就好了
感谢2楼说的这么详细,知识点是明白了,最近在看一看基础知识,突然这里就有点蒙蔽。 但有个疑惑: 恢复数据的时候,为什么还要用onrestoreinstancestate这个方法,只要在oncreate做一个非空判断就行了。[/quote] 的确,如果onCreate中bundle不为null的话,两者都可以进行恢复数据。没有区别,至于你说为什么要在onRestoreInstanceState方法中,那是因为我们的代码控制,一般是view都生成好了,然后往view上面填数据。 而onCreate的生命周期是在最初的一创建的时候,它可以用来初始化控件,onRestoreInstanceState是在onStar之后,onResume之前,可以用来填入状态数据。看个人习惯,在onCreate中一口气将view初始化完然后立刻填入数据也是可以的。 在一些特殊需求下,有可能某些动态控件并不是在onCreate里面初始化完,而是在更后面的生命周期,这时候你在onCreate里面进行恢复数据的话,那些控件还没有初始化完。 所以一般情况下你直接在onCreate中判空然后进行恢复状态是完全没有任何问题的。
此去正年少 2018-02-06
  • 打赏
  • 举报
回复
http://blog.csdn.net/fenggering/article/details/53907654 ---onCreate()里也有Bundle参数,可以用来恢复数据,它和onRestoreInstanceState有什么区别? 因为onSaveInstanceState 不一定会被调用,所以onCreate()里的Bundle参数可能为空,如果使用onCreate()来恢复数据,一定要做非空判断。 而onRestoreInstanceState的Bundle参数一定不会是空值,因为它只有在上次activity被回收了才会调用。 而且onRestoreInstanceState是在onStart()之后被调用的。有时候我们需要onCreate()中做的一些初始化完成之后再恢复数据,用onRestoreInstanceState会比较方便。下面是官方文档对onRestoreInstanceState的说明: This method is called after onStart() when the activity is being re-initialized from a previously saved state, given here in savedInstanceState. Most implementations will simply use onCreate(Bundle) to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation. 注意这个说明的最后一句是什么意思? to allow subclasses to decide whether to use your default implementation. 它是说,用onRestoreInstanceState方法恢复数据,你可以决定是否在方法里调用父类的onRestoreInstanceState方法,即是否调用super.onRestoreInstanceState(savedInstanceState); 而用onCreate()恢复数据,你必须调用super.onCreate(savedInstanceState);
Smoyan_ 2018-02-06
  • 打赏
  • 举报
回复 5
我一个一个回答你的问题: 一.onCreate是什么: onCreate是Activity调用create()的时候的回调方法,每一次创建Activity的时候都会调用,它的参数中有Bundle参数可以用来恢复数据。但是这个参数Bundle是从哪里来的呢?它是来自于onSaveInstanceState调用的时候保存的参数(onRestoreInstanceState的Bundle参数也是来自于这个方法),当activity有可能被系统回收的情况下,注意是有可能,如果是已经确定会被销毁,比如用户按下了返回键,或者调用了finish()方法强制销毁activity,则onSaveInstanceState不会被调用,Bundle就为null。注意onSaveInstanceState是在onStop之前调用。 二.onRestoreInstanceState是什么: onRestoreInstanceState是在Activity被系统回收了,但是你又需要创建一个新的对象,例如你从竖屏切换到横屏,系统就把你竖屏的Activity销毁并且回收,这时候调用了onSaveInstanceState保存了一个bundle对象,同时创建新的横屏Activity,这时候onRestoreInstanceState被调用传入之前保存的那个bundle。所以一旦onRestoreInstanceState被调用,它的Bundle必定不为null。 三.两者的区别: 1。onSaveInstanceState和onRestoreInstanceState是一 一对应的,一个保存状态Bundle,另一个Budle恢复状态。 2。onCreate 的bundle可能为null,而onRestoreInstanceState的Bundle必定不为null。所以恢复数据建议用onRestoreInstanceState 3。生命周期,这是上面说过横竖屏例子的生命周期 第一次创建onCreate -> onStart -> onResume->onPause -> 保存状态onSaveInstanceState -> onStop -> 销毁onDestroy -> 重新创建onCreate -> onStart -> 恢复之前保存的状态onRestoreInstanceState -> onResume 4。为什么一个可以super一个不可以super。 首先说说super()是什么:Java的多态性,一个子类继承父类,子类的方法可以继承父类的方法进行重载和重写,Override重载super()就是子类调用父类的方法,相当于把父类的该方法的代码全部拷贝到子类方法里面,然后子类再添加自己的代码。 而重写就是不要调用super(),相当于父类该方法只是做个声明,它的实现完全由子类代码决定。 由于onCreate中Activity的父类是有一些重要代码段必须要调用的,所以你必须先调用父类的onCreate。 而onRestoreInstanceState却不需要,在这个回调中你只要处理恢复好自己的业务逻辑就好了

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧