Bev*_*vor 5 android activity-lifecycle android-lifecycle
目前我对 Android 中的生命周期管理有点困惑。Activity 回到前台后,至少有 4 种可能来恢复保留的数据:
Android处理:如果有足够的内存,Android在Activity重启后存储和恢复重要数据(选中的单选按钮,EditText的文本,-...等),用户与Activity进入之前的状态相同背景。
onPause、onResume:覆盖onPause,将重要数据保存到数据库或文本文件中,下次执行onResume时恢复。
onSavedInstance(Bundle), onRestoreInstance(Bundle):我可以将数据作为键值对保存到包中,并在执行 onRestoreInstance 后恢复它们。
onRetainNonConfigurationInstance()、getLastNonConfigurationInstance():我在一个大对象中处理所有存储问题,并在执行 onCreate 时读取 getLastNonConfigurationInstance()。
尽管哪种方法最好令人困惑,但我想它依赖于开发经验来知道何时使用哪种可能性。如果你有一些很好的例子,我会很高兴,但这不是我的问题。我想知道当我有不同的 Activity 并且一个 Activity 在后台暂停时会被 Android 杀死时如何处理所有这些:
就我而言,我有一个 MainActivity 和一个 MessageActivity。MessageActivity 由一个 ViewSwitcher 组成,该 ViewSwitcher 由两个状态组成。状态一是单选按钮选择列表。状态二是一个带有两个按钮(发送和中止)的 EditText。当我对每个状态进行猴子测试,点击 Android 主页按钮并重新启动应用程序时,当我将处理留给 Android 时,具有正确状态和旧数据的正确 Activity 进入前台。所以这有效。
但是当Android在后台销毁MessageActivity时会发生什么:如果我使用Android方式,数据会丢失,我猜MainActivity(而不是MessageActivity->state(1或2))将在我重新启动应用程序(是对吗?)。所以当我想保留 MessageActivity 的数据时,我必须使用其他三种可能性之一。
当应用程序入口点(即 MainActivity)与上一个活动 Activity 不同时,如何巧妙地做到这一点。问题是我必须恢复具有特殊状态的 ViewSwitcher 的特殊活动。我可以使用 onStart() 或 onResume() 方法中的 startActivity(Intent) 从 MainActivity 启动 MessageActivity(因为 MainActivity 可能是入口点),但随后我在生命周期管理中遇到了很多逻辑问题。由于这个事实,我不认为这是做到这一点的正确方法。
但是,这样做的正确和最佳方法是什么?
我想 MainActivity (而不是 MessageActivity->state(1 或 2))将在我重新启动应用程序后下次启动(正确吗?)
不,我不认为这是正确的,具体取决于您的代码在 onCreate() 中的作用。如果你以正确的方式做事,它当然不一定是正确的。测试这一点的一个简单方法是旋转屏幕,这会重新创建正在运行的活动,除非您已覆盖默认配置更改行为。
我建议仔细阅读 android 文档中的这一部分:
http://developer.android.com/guide/topics/fundamentals/activities.html#SavingActivityState
尤其:
即使您不执行任何操作并且不实现 onSaveInstanceState(),某些活动状态也会通过 Activity 类的 onSaveInstanceState() 默认实现来恢复。具体来说,默认实现为布局中的每个视图调用 onSaveInstanceState(),这允许每个视图提供应保存的有关其自身的信息。Android 框架中的几乎每个小部件都适当地实现了此方法,以便在重新创建 Activity 时自动保存和恢复对 UI 的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,而 CheckBox 小部件保存是否选中。您所需要做的唯一工作就是为要保存其状态的每个小部件提供唯一的 ID(带有 android:id 属性)。如果小部件没有 ID,则它无法保存其状态。
这意味着,只要您不在任何onCreate()调用中强制任何 UI 状态,您的活动堆栈和 UI 状态就会恢复。
就个人而言,我的首选方法是在活动的成员变量中保留尽可能少的状态,使用 保存和恢复它onSave/RestoreInstanceState(),并依靠默认实现来保存其余的 UI 状态(文本框内容等)。应该在会话之间保留的数据一旦发生更改(例如在单击处理程序中),我就会直接提交到我的数据库或首选项。这意味着我不需要为此担心活动生命周期。我的 UI 尽可能地呈现数据库中数据的视图(使用 CursorAdapter 等)。
编辑:
关于整个活动堆栈的恢复:
当用户按 HOME 键离开任务时,...系统保留任务中每个活动的状态。如果用户稍后通过选择开始该任务的启动器图标来恢复该任务,则该任务将进入前台并恢复堆栈顶部的 Activity。
(请参阅http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html)
| 归档时间: |
|
| 查看次数: |
4773 次 |
| 最近记录: |