5

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

  • Android 处理:如果内存足够,Android 会在 Activity 重启后存储和恢复重要数据(选中的单选按钮、EditText 的文本、-...等),用户的状态与 Activity 进入之前的状态相同背景。

  • onPause, onResume:覆盖 onPause 并将重要数据保存到数据库或文本文件中,并在下次执行 onResume 时恢复。

  • onSavedInstance(Bundle), onRestoreInstance(Bundle):我可以将数据作为键值对保存到包中,并在执行 onRestoreInstance 后恢复它们。

  • onRetainNonConfigurationInstance()、getLastNonConfigurationInstance():我在一个大对象中处理所有存储问题,并在执行 onCreate 时读取 getLastNonConfigurationInstance()。

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

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

但是,这样做的正确和最佳方法是什么?

4

4 回答 4

2

这不是我寻求最佳答案的尝试,但是评论部分太长了。

首先,我建议不要依赖“Android 方式”——这将导致应用程序行为不一致,具体取决于设备的可用内存——这是不好的做法。

我的建议是SharedPreferences每次onPause()进入MessageActivity. 在 中存储一个标志SharedPreferences,指示哪个是最后打开的活动(如果你只有两个活动,你可以轻松地使用 0/1 或真/假标志)。当您重新启动应用程序时,启动 AndroidManifest.xml 中标记为“入口点”的 Activity 是正常的。所以很自然地,你会检查你的标志并onResume()MainActivity需要时启动另一个活动。MessageActivity's onResume()检查中的值并SharedPreferences填写必要的内容...如果您的应用程序“恢复”到ActivityStack 中的最后一个 Activity这将调用ActivityStack 中onResume()最后一个 Activity

于 2012-01-05T18:03:33.563 回答
2

我猜 MainActivity(而不是 MessageActivity->state(1 或 2))将在我重新启动应用程序后启动(对吗?)

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

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

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

尤其:

即使你什么都不做也没有实现onSaveInstanceState(),Activity 类的默认实现onSaveInstanceState() 会恢复一些活动状态。具体来说,默认实现为布局中的每个视图调用 onSaveInstanceState(),这允许每个视图提供有关其自身的应保存的信息。几乎 Android 框架中的每个小部件都适当地实现了此方法,以便在重新创建活动时自动保存和恢复对 UI 的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,而 CheckBox 小部件保存它是否被选中。您唯一需要的工作是为每个要保存其状态的小部件提供唯一 ID(带有 android:id 属性)。如果小部件没有 ID,

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

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

编辑:

关于整个活动堆栈的恢复:

当用户通过按 HOME 键离开任务时,... 系统保留任务中每个活动的状态。如果用户稍后通过选择启动任务的启动器图标来恢复任务,则任务将进入前台并恢复堆栈顶部的活动。

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

于 2012-01-05T20:03:22.220 回答
1

我过去处理此类问题的方式是让服务在后台运行,该服务通过 Intent 和 listener 处理来自不同活动的信息流(最好,因为它们是最容易解耦的解决方案),或者如果您非常小心,并且由于某种原因唯一可行的解​​决方案是通过直接属性访问或方法调用来存储数据,您也可以在服务类上使用静态属性/方法。但是,我强烈建议使用 Intent/listener 方法,因为它通常更灵活、线程安全且解耦。此外,明智的做法是确保在任何时间点都不会发生太多事情(换句话说,只有在不需要时使用此服务进行 Intent 处理),否则在不需要时,该服务将倾向于占用 CPU 时间和 RAM。

当涉及到这种方法时,需要查看的一些资源是IntentService及其相关类,包括超类 Service。然而,IntentService 值得注意的是,它处理了一些关于异步 Intent 处理等服务不会自动附带的事情。

希望这对你有帮助!

于 2012-01-05T18:02:46.833 回答
1
login.setOnClickListener(new View.OnClickListener()      {
    public void onClick(View view)         {
        String name=username.getText().toString();
        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        SharedPreferences.Editor editor = settings.edit();
        editor.putString("username", name);
        if(name.equals("xxx"))                 {
            Intent intent=new Intent(currentactivity.this,nextactivity.class);
            intent.putExtras(bundle);
            startActivityForResult(intent,0);
        }
    }
});
于 2012-02-18T06:59:46.717 回答