1

我注意到,当我从 Gingerbread 升级到 ICS 后,我的应用程序在 Gingerbread 下运行良好时开始崩溃。

应用程序的主要活动(活动 A)有一个菜单选项,可打开从数据库填充的 ListActivity(活动 B);当单击列表中的条目时,会打开第三个活动(活动 C)。当使用返回按钮关闭活动 C 时,应该重新显示活动 B。

在 Gingerbread(和更早的 Android 版本)中,这运行良好,并且大部分时间在 ICS 中继续运行良好。但是,如果我离开应用程序,让活动 C 长时间打开,它就会崩溃。返回应用程序并尝试从活动 C 退回到活动 B 时,应用程序将停止。由于活动 B 的 onResume 中出现空指针异常,LogCat 报告“无法恢复活动”。

onResume 方法中的违规行包含对活动 A 的 onCreate 方法中定义的 DBAdapter 的引用。通过记录对活动 B 的各种生命周期方法的调用,我发现活动 B 在打开活动 C 时总是(如预期的那样)停止. 如果它只是停止就没有问题:在调用 onResume 时仍必须定义 DBAdapter。但是,如果应用程序离开较长时间,则活动 B 被销毁,在这种情况下,DBAdapter(在活动 A 的 onCreate 方法中定义)也必须变为未定义。

解决此问题的方法似乎是插入 if (Global.mDBAdapter== null) {Global.mDBAdapter = new DBAdapter( this, "DatabaseName" );}到活动 B 的 onCreate 方法中。

我想检查一下我是否正确理解了这一点。是否有描述 SQLite 数据库适配器/助手生命周期行为变化(姜饼和 ICS 之间)的文档?

4

1 回答 1

1

似乎您做出了没有根据的假设,而您恰好在 Gingerbread 设备上侥幸逃脱。

一个 Activity 的进程在被调用后的任何时候都是可以杀死的onStop(),所以在结束时onStop(),你必须准备好你的下一个生命周期回调是以下三个中的任何一个:

  1. onRestart()-- 如果进程没有被杀死并且Activity很快被重新启动。
  2. onDestroy()-- 如果系统已决定停止活动,并且觉得方便时通知您。
  3. onCreate()- 如果进程没有调用就被杀死了onDestroy()

(Honeycomb 之前,该过程甚至可以在之后杀死onPause()。)

因此,听起来正在发生的是,当您长时间远离活动 C 时,整个过程都会被终止。当您返回 Activity C,然后按 BACK 时,Activity B 将通过onCreate()-> onStart()-> onResume(),您似乎假设您已通过 Activity A 设置了全局状态,但事实并非如此。

这不是 Gingerbread 和 ICS 之间的变化。你以前只是走运。

阅读和理解的好资源:

更新:您在下面的评论中询问了 Android 在销毁应用程序时究竟保留了哪些有关您的应用程序状态的信息。我的印象是它基本上只是 Activity 堆栈和来自onSaveInstanceState(). (它不会特别记住哪个 Activity 是打开的,那只是堆栈的顶部。)这是有道理的:Android 处理它的结束(活动堆栈),而你处理你的(通过保存最重要的内容并准备好重新创建其余部分)。

默认实现onSaveInstanceState()在所有视图上调用同名方法,这可以让您看起来像是在免费保存和恢复一些数据。但是,如果不覆盖该方法,您肯定不会保存任何自己的数据成员,无论是静态的还是其他的。这对我来说很有意义:自动这样做需要反思,而且效率低下,经常浪费,而且相当混乱。保存重要的内容由您决定,Android 为您提供回调以简化此操作。

这是您的另一个资源:

但是,您不一定需要处理onSaveInstanceState();有些东西重新创建更有意义,例如您的数据库适配器。

于 2012-07-03T21:55:51.790 回答