android – 在使用多个Activity时Activity如何处理前景后如何处理保留的数据?

目前我对Android的生命周期管理有点困惑.在Activity返回到前台后,至少有4种可能性来恢复保留的数据:

> Android处理:如果有足够的内存,Android会在Activity重启后存储并恢复重要数据(检查单选按钮,EditText文本,-…等),用户具有与之前相同的状态进入背景.
> onPause,onResume:覆盖onPause并将重要数据保存到数据库或文本文件中,并在下次执行onResume时恢复它.
> onSavedInstance(Bundle),onRestoreInstance(Bundle):我可以将数据作为键值对保存到包中,并在执行onRestoreInstance后恢复它们.
> onRetainNonConfigurationInstance(),getLastNonConfigurationInstance():我处理一个大对象中的所有存储问题,并在执行onCreate时读取getLastNonConfigurationInstance().

尽管令人困惑的是哪种方法最好,但我认为它依赖于开发经验来知道何时使用哪种可能性.如果你有一些很好的例子我会很高兴,但这不是我的问题.我想知道当我有不同的活动时如何处理所有这些,并且当它在后台暂停时,一个Activity将被Android杀死:

在我的例子中,我有一个MainActivity和一个MessageActivity. MessageActivity由一个ViewSwitcher组成,它由两个状态组成.状态1是单选按钮选择列表.状态二是带有两个按钮的EditText(发送和中止).当我测试每个状态时,点击Android主页按钮,然后重启应用程序,当我将处理留给Android时,具有正确状态的正确活动和旧数据进入前台.这样才行.
但是当Android在后台销毁MessageActivity时会发生什么:
如果我使用Android方式,数据会丢失,我想MainActivity(而不是MessageActivity-> state(1或2))将在我重新启动应用程序后下次启动(这是正确的吗?).因此,当我想保留MessageActivity的数据时,我必须使用其他三种可能性中的一种.
当应用程序入口点(因此MainActivity)与上一个活动的Activity不同时,如何巧妙地做到这一点.问题是我必须使用特殊状态的ViewSwitcher恢复一个特殊的Activity.我可以使用onStart()或onResume()方法中的startActivity(Intent)从MainActivity启动MessageActivity(因为MainActivity可能是入口点)但是我在生命周期管理中遇到了很多逻辑问题.由于这个事实,我不认为这是正确的方法.

但是,做到这一点的正确和最好的方法是什么?

最佳答案

I guess MainActivity (instead of MessageActivity->state(1 or 2)) will start next time after I relaunch the application (is that correct?)

不,我不相信这是正确的,这取决于你的代码在onCreate()中的作用.如果你以正确的方式去做事,那当然不需要是正确的.测试此操作的一种简单方法是旋转屏幕,重新创建正在运行的活动,除非您已覆盖默认配置更改行为.

我建议仔细阅读android文档中的这一部分:

http://developer.android.com/guide/topics/fundamentals/activities.html#SavingActivityState

特别是:

even if you do nothing and do not implement onSaveInstanceState(), some of the activity state is restored by the Activity class’s default implementation of onSaveInstanceState(). Specifically, the default implementation calls onSaveInstanceState() for every View in the layout, which allows each view to provide information about itself that should be saved. Almost every widget in the Android framework implements this method as appropriate, such that any visible changes to the UI are automatically saved and restored when your activity is recreated. For example, the EditText widget saves any text entered by the user and the CheckBox widget saves whether it’s checked or not. The only work required by you is to provide a unique ID (with the android:id attribute) for each widget you want to save its state. If a widget does not have an ID, then it cannot save its state.

这意味着,只要您不在任何onCreate()调用中强制执行任何UI状态,就会恢复活动堆栈和UI状态.

就个人而言,我首选的方法是在我的活动的成员变量中保持尽可能少的状态,使用onSave / RestoreInstanceState()保存和恢复它,并依靠默认实现来保存其余的UI状态(文本框内容,等等).应该在会话之间保留的数据我会在更改后立即提交到我的数据库或首选项(例如,在点击处理程序中).这意味着我不需要担心活动的生命周期.我的UI尽可能地呈现了我的数据库中的数据视图(使用CursorAdapter等).

编辑:

关于恢复整个活动堆栈:

When the user leaves a task by pressing the HOME key, … The system retains the state of every activity in the task. If the user later resumes the task by selecting the launcher icon that began the task, the task comes to the foreground and resumes the activity at the top of the stack.

(见http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html)

转载注明原文:android – 在使用多个Activity时Activity如何处理前景后如何处理保留的数据? - 代码日志