首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《Android编程权威指南》之UI状态的保存与恢复篇

三、进程销毁时保存数据 上面讲述的是发生屏幕旋转等配置更改的情况下,activity会被销毁和重启,这个时候可以用viewmodel来自动保存数据与获取数据。...3.1 覆盖onSaveInstanceState(Bundle)函数 通过覆盖Activity.onSaveInstanceState(Bundle)的方式,就可以解决上述问题,当应用进程在意外被系统...通常,覆盖onSaveInstanceState(Bundle)函数,在Bundle对象中,保存当前activity小的或暂存状态的数据;覆盖onStop()函数,保存永久性数据,比如用户编辑的文字等。...因此,要处理设备配置更改 加上 系统发起的进程终止 两种情况,就结合使用 ViewModel 和 onSaveInstanceState() 方式来保存数据状态。...参考:https://developer.android.com/jetpack 六、深入学习:解决问题要彻底 意思就是通过禁止应用屏旋转,以此解决设备配置改变带来的UI状态丢失问题的方式太粗暴,也不能从根本解决问题

63010

ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

ViewModel 允许数据在例如屏幕旋转这样的配置更改后依然保留。...ViewModel 被设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。ViewModel 允许数据在例如屏幕旋转这样的配置更改后依然保留。...你通过 onSaveInstanceState() 的 bundle 将查询传入 ViewModel,这将决定它已加载了必须的数据从而不需要重新查询数据库。...复杂数据通过本地持久化保存然后用 onSaveInstanceState() 来保存那些复杂数据的唯一 ID。ViewModel 在数据加载后将他们保存在内存中。...在这个场景下,ViewModel 在 activity 旋转或者进入后台时仍保留数据,而单纯用 onSaveInstanceState() 并没那么容易实现。

1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    《Android编程权威指南》之Activity的生命周期篇

    通常,通过覆盖 onCreate(Bundle) 方法,activity 可以预处理以下 UI 相关工作: 实例化组件并将它们放置在屏幕上(调用setContentView(int)方法); 引用已实例化的组件...【 Bundle 是存储字符串键与限定类型值之间映射关系(键-值对)的一种结构】 所以,可通过覆盖 onSaveInstanceState(Bundle) 方法,将一些数据保存在 bundle 中,然后在...onCreate(Bundle) 方法中取回这些数据,解决旋转问题。...在 Bundle 中保存定制类对象不是个好主意,因为你取回的对象可能已经没用了。比较好的做法是,通过其他方式保存定制类对象,而在Bundle中保存标识对象的基本类型数据。...} 为了解决旋转问题,所以是否回答过问题的数组也要保持下来,定义一个KEY,再在 onSaveInstanceState() 保存数组 private const val KEY_QUESTION_ANSWERED

    64510

    1.2、Activity的状态保存

    在这种情况下,您可以通过回调方法onSaveInstanceState()来保存Activity的一些重要信息,并通过onCreate()或者onRestoreInstanceState()回调方法来恢复这些信息...onSaveInstanceState()方法传递进来的Bundle对象中,存入我们想要保存的东西。...然后,当Activity被重新创建的时候,我们就可以通过onCreate()或者onRestoreInstanceState()方法的Bundle对象,来获得我们之前存入的数据。...你不应该去保存那些持久化的数据,那些持久化的数据应该放到onPause方法里面去执行(比如将数据存储到数据库中)。...所以我们可以用下面的办法,来测试Activity的状态保存。 就是旋转设置,让屏幕方向变化(当然前提是你没有锁定设置的旋转功能,Activity也没有设置屏幕方向)。

    86330

    Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

    当然了,应对这种情况,Android给出了几种方案: a、如果是少量数据,可以通过onSaveInstanceState()和onRestoreInstanceState()进行保存与恢复。...这里,如果在异步数据完成加载之后,旋转屏幕,使用上述a、b两种方法都不会很难,无非是保存数据和恢复数据。...Fragment保存大量数据", "onSaveInstanceState保存数据", "getLastNonConfigurationInstance已经被弃用", "RabbitMQ...,这里使用Thread.sleep模拟了一个耗时操作;当用户旋转屏幕发生重新启动时,会onSaveInstanceState中进行数据的存储,在onCreate中对数据进行恢复,免去了不必要的再加载一遍...Fragment保存大量数据", "onSaveInstanceState保存数据", "getLastNonConfigurationInstance已经被弃用", "RabbitMQ

    2.1K20

    Android经典面试题之ViewModel生命周期穿透的3种黑科技实现

    在Android开发中,屏幕旋转导致页面重建是开发者最头疼的问题之一。 传统方案通过onSaveInstanceState保存数据,但存在序列化性能瓶颈和数据量限制(Bundle最大1MB)。...而ViewModel的诞生,通过“生命周期穿透”能力,彻底解决了配置变更导致的数据丢失问题。 但它的实现原理究竟是什么?本文将揭开其底层三大黑科技。...二、ViewModelStoreOwner:多组件共享的“数据枢纽” 场景痛点 传统开发中,Activity与Fragment间的数据传递需要通过Bundle或接口回调,而ViewModel通过ViewModelStoreOwner...通过集成SavedStateHandle,可将数据写入系统管理的Bundle,实现跨进程销毁的数据恢复。...跨屏幕旋转:HolderFragment + ViewModelStore机制 2. 跨组件通信:ViewModelStoreOwner的多级作用域控制 3.

    5810

    ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

    ViewModel 被设计用来以与生命周期相关的方式保存和管理 UI 相关的数据。ViewModel 允许数据在例如屏幕旋转这样的配置更改后依然保留。...你通过 onSaveInstanceState() 的 bundle 将查询传入 ViewModel,这将决定它已加载了必须的数据从而不需要重新查询数据库。...ViewModel 不是 onSaveInstanceState() 的替代品,因为他们在与配置更改相关的销毁时保存数据,而不能在系统杀死应用进程时保存。...复杂数据通过本地持久化保存然后用 onSaveInstanceState() 来保存那些复杂数据的唯一 ID。ViewModel 在数据加载后将他们保存在内存中。...在这个场景下,ViewModel 在 activity 旋转或者进入后台时仍保留数据,而单纯用 onSaveInstanceState() 并没那么容易实现。

    3.8K30

    Android基础部分再学习---activity的状态保存

    在这种情况下,您可以通过回调方法onSaveInstanceState()来保存Activity的一些重要信息,并通过onCreate()或者onRestoreInstanceState()回调方法来恢复这些信息...你不应该去保存那些持久化的数据,那些持久化的数据应该放到onPause方法里面去执行(比如将数据存储到数据库中)。...所以我们可以用下面的办法,来测试Activity的状态保存。 就是旋转设置,让屏幕方向变化(当然前提是你没有锁定设置的旋转功能,Activity也没有设置屏幕方向)。...他保存的数据是持有化的,还是永久性的呢 onSaveInstanceState()  这个方法适合临时保存一些非永久性的数据.如果要持久化保存数据,就要将操作放在onStop(), onDestroy...也即是key-value模式了 因为在android的设计中中,这个函数的主要的作用是用来保存UI状态的,现在怎么去保存一些自己的数据呢 保存: @Override public void onSaveInstanceState

    1.1K20

    Activity详解(二)——异常情况下的生命周期分析

    和onCreate方法,因为我们可以通过onCreate和onRestoreInstanceState方法来判断Activity是否被重建了,如果被重建了,那么我们就可以取出之前保存的数据并恢复,从上图我们可以看出...关于保存和恢复View层次结构,系统的工作流程是这样的:首先Activity被意外终止时,Activity会调用onSaveInstanceState去保存数据,然后Activity会委托Window去保存数据...最后顶层容器再去意义通知它的子元素来保存数据,这样整个数据保存过程就完成了。可以发现,这就是一种典型的委托思想,上层委托下次,父容器委托子元素去处理一件事情。...比如我们上文提到的旋转屏幕所造成的Activity异常销毁,这个过程和正常停止Activity是不一样的,因为旋转屏幕后,Activity被销毁的同时会立刻创建Activity实例,这个时候Activity...3)后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低 当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并且后续通过onSaveInstanceState

    1.8K40

    Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)

    这种方法中通经常使用来提交一些还没保存的更改到持久数据 中,停止一些动画或其他一些耗 CPU 的操作等等。...注:由于 onSaveInstanceState 方法不一定会被调用,所以你应该仅仅是用它来保存一些 activity 的转换过程状态(即 UI 的状态),而不能用来保存永久性数据。...但你能够用 onPause 方法在用户离开 activity 时来保存永久性数据,比方须要保存到数据库的数据。...有一个非常好的方法能够用来检验应用程序保存状态的能力,就是简单地旋转你的设备来改变屏幕的方向。...由于这个原因,你的 activity 能否在其又一次创建时完毕保存状态就显得尤为重要,由于用户常常会在使用应用程序时旋转屏幕的。

    39810

    安卓activity生命周期_请描述activity的生命周期

    此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。...恢复数据的方式跟随生命周期的不同有两种情况。 系统在销毁 Activity 后重建 Activity,Activity 必须恢复之前保存的状态。...Activity 的瞬态(UI 的状态)切勿使用它来存储持久性数据,而应使用onPause在用户离开 Activity 后存储持久性数据,例如应保存到数据库的数据。...例如,EditText 小部件保存用户输入的任何文本,CheckBox小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过 android:id 属性)。...如果小部件没有 ID,则系统无法保存其状态。(默认情况下系统不会恢复储存成员值(变量)) 你只需旋转设备,让屏幕方向发生变化,就能有效地测试您的应用的状态恢复能力。

    57410

    Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)

    类 通过上面的方法能够启动新的Activity了,但假设我要从当前的Activity中传递数据到新的Activity呢?...虽然如此,即使你没做不论什么操作或没有实现 onSaveInstanceState() 方法,你的 activity 状态也能通过Activity 类里面默认实现的 onSaveInstanceState...所以你应该仅仅是用它来保存一些 activity 的转换过程状态(即 UI 的状态),而不能用来保存永久性数据。但你能够用 onPause 方法在用户离开 activity 时来保存永久性数据。...比方须要保存到数据库的数据。 有一个非常好的方法能够用来检验应用程序保存状态的能力。就是简单地旋转你的设备来改变屏幕的方向。...由于这个原因,你的 activity 能否在其又一次创建时完毕保存状态就显得尤为重要,由于用户常常会在使用应用程序时旋转屏幕的。

    1.1K20

    【Android 应用开发】Activity 状态保存 OnSaveInstanceState参数解析

    或者 onRestoreInstanceState 中保存的数据; -- 注意 : 只有是系统自动回收的时候才会保存 Bundle 对象数据; -- Bundle 对象来源 : onCreate()...(Bundle outState) 方法 outState 参数作用 :  -- 数据保存 : Activity 声明周期结束的时候, 需要保存 Activity 状态的时候, 会将要保存的数据使用键值对的形式...保存在 Bundle 对象中; -- 恢复数据 : 在 Activity 的 onCreate()方法 创建 Activity 的时候会传入一个 Bundle 对象, 这个 Bundle 对象就是这个..., 会自动保存组件的状态, 注意, 只有有 id 的组件才会保存; -- 关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的; (..., 如果内存充足, 系统没有销毁这个 Activity, 就不需要调用; -- Bundle 对象传递 : 该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate

    40820

    Android 生命周期备忘录 — 第一部分:单一 Activities

    当状态发生变化时,系统会通过一个生命周期回调方法通知你。...activity 的应用被用户开启,结束,和重启时发生了什么: 场景 1:应用被终止并且重启 状态处理 onSaveInstanceState 不会被调用 (因为 activity 被结束了,你不需要保存状态...状态处理 当你的 activity 进入 Stopped 状态,系统会使用 onSaveInstanceState 去保存应用的状态以防系统一段时间后终止这个应用的进程 (请看下面)。...假设应用的进程没有被终止,这个应用的实例会常驻在内存,保存所有状态。当这个 activity 回到前台工作时,它会恢复这些状态。你不需要重新初始化这些之前已生成的组件。...activity 会被完全 destroy,但是 activity 的状态会被保存下来并在下一个实例中恢复。

    31810

    Android 生命周期备忘录 — 第一部分:单一 Activities

    当状态发生变化时,系统会通过一个生命周期回调方法通知你。 为了更好解释生命周期是怎么运作的,我们定义了根据现有组件进行分类的一系列用户场景。...场景 1:应用被终止并且重启 状态处理 onSaveInstanceState 不会被调用 (因为 activity 被结束了,你不需要保存状态) onCreate 没有 Bundle 对象,如果重新打开应用的话...状态处理 当你的 activity 进入 Stopped 状态,系统会使用 onSaveInstanceState 去保存应用的状态以防系统一段时间后终止这个应用的进程 (请看下面)。...activity 会被完全 destroy,但是 activity 的状态会被保存下来并在下一个实例中恢复。...---- 单一 Activity — 场景 4:应用被系统暂停 触发原因: 开启多窗口模式 (API 24+)并且应用失去焦点 另一个应用部分地覆盖在正在运行的应用上面(例如一个购买对话框,一个运行时权限确认对话框

    63030

    ViewModel

    二.VIewModel的生命周期特性   由于Android平台的特殊性,若应用程序支持横竖屏切换,那么当用户旋转手机屏幕的时候,我们还需要考虑数据的存储和恢复。...为了验证这一点,我们在ViewModel中创建一个计时器,每隔1s钟,通过接口OnTimeChangeListener通知它的调用者,并通过这个示例来学习一下ViewModel的使用。   ...可以看到,当屏幕发生旋转的时候,计时器仍然在继续,这意味着横竖屏下的Activity对应的ViewModel是同一个,它所持有的数据一直存在着。...五.ViewModel和onSaveInstanceState()方法   对于页面数据的保存和恢复,也许你有这样的疑问,onSaveInstanceState()方法同样可以解决屏幕旋转带来的数据丢失问题...但是要注意,onSaveInstanceState()方法只能存储少量的,能支持序列化的数据,而ViewModel没有这个限制,ViewModel支持页面中的所有数据。

    24130

    Android 进阶解密笔记-插件化

    现在知道的做法也就只有在使用ActionBarDrawerToggle的使用在onPostCreate需要在屏幕旋转时候等同步下状态,Google官方提供的一些实例就是如下做法: @Overrideprotected...在系统内存不足的时候可能不会执行onStop方法,因此程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。...而onRestoreInstanceState是在onStart之后、onResume之前调用的** onSaveInstanceState调用 在Activity被覆盖或退居后台之后,系统资源不足将其杀死...第一种情况我们无法保证什么时候发生,系统根据资源紧张程度去调度;第二种是屏幕翻转方向时,系统先销毁当前的Activity,然后再重建一个新的,调用此方法时,我们可以保存一些临时数据;第三种情况系统调用此方法是为了保存当前窗口各个...onSaveInstanceState的调用顺序是在onStop中调用。

    82710

    美团技术报告:83%的Android开发者因这5个源码盲区错失年薪50万(附50k+面试答案)

    一、年薪50万的技术鸿沟:源码级认知差异 真实案例:某候选人在美团L8面试中,被要求解释"ViewModel为何能跨屏幕旋转保存数据",仅回答"通过onSaveInstanceState实现",面试官当场摇头...二、大厂必问的7个Jetpack源码命题 1. ViewModel的"僵尸复活"机制(字节跳动压轴题) 场景:某电商App屏幕旋转后购物车数据丢失,如何用ViewModel解决?...源码真相: 生命周期隔离:通过HolderFragment持有ViewModelStore 数据存储:Activity#onRetainNonConfigurationInstance()传递非配置实例...()强制回调 线程陷阱:postValue()存在数据覆盖风险(竞态条件概率达21%) 解决方案: class SingleLiveEvent : MutableLiveData() {...Navigation的"时空折叠"导航图(华为系统调度题) 致命问题:Fragment转场动画导致页面重叠(发生概率29%) 核心原理: 导航栈管理:NavController通过BackStackEntry

    8510

    Android技能树 — Activity小结

    在Activity销毁的时候先通过onSaveInstanceState的Bundle参数里面,存储一些内容,然后在重建时候调用onRestoreInstanceState方法传递刚才那个Bundle,...我们先来看什么时候会出现异常生命周期: 资源相关的系统配置改变(最常见的就是旋转屏幕) 内存不足时候,会杀死优先级低的Activity 我们来分别查看: 旋转屏幕 最简单的还是用例子来说明,我们写了一个...简单来说:super.onSaveInstanceState(outState);它会帮我们保存Activity的相关视图,然后分别调用每个View的onSaveInstanceState方法,比如EditText...在自己的类中的这个方法就是保存了输入的内容。...就是会调用自己的这个方法,然后再把保存好的内容再赋值进去。

    51010
    领券