2

我的应用程序有几个活动,包括StartActivity声明

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

在清单中。我也有一个Application子类,就是在这里开始一些初始化任务。初始化代码在后台线程中执行,因此StartActivity只需显示启动屏幕并等待后台初始化完成。在初始化完成之前,控制权不会传递给任何其他 Activity,这一点很重要。

有时,在我的应用程序运行后,它会通过用户按 HOME 键发送到后台,并且可能会打开其他一些应用程序。如果我的应用在一段时间后从启动器重新启动,则应用会在上次打开应用时处于活动状态的任何活动中愉快地恢复。这可以。

如果在我的应用程序重新启动之前有几个小时的延迟,那么有趣的事情就会开始发生。似乎该进程已重新启动-我可以从日志输出中得知我的Application.onCreate()已被调用,并且后台初始化任务已启动-但至关重要的StartActivity是,该进程已被绕过并且系统已尝试直接进入上次活动的任何活动应用程序已打开。

在我看来,这似乎是一个不可能的情况。进程永远不可能重新启动(在先前被终止之后,可能是由于不活动)并直接跳转到非MAIN活动。要么应用程序处于活动状态,并且可以简单地恢复上次使用的 Activity,而无需重新初始化应用程序;或者,应用程序已死,应该从头开始重新初始化,包括启动MAINActivity。它永远不应该处于这种奇怪的僵尸状态。

我的理解是错误的,还是 Android 正在做一些完全疯狂的事情?

可能相关:Android:系统何时卸载类?

4

3 回答 3

1

您的应用程序处于“停止”状态,隐藏,即您所说的“僵尸状态”。

重新启动时,它正在调用上次打开的 Activity 的 onRestart() 方法。您需要在此 Activity中实现onRestart()方法。

在那里你应该重新初始化你的应用程序。

欲了解更多信息:http: //developer.android.com/training/basics/activity-lifecycle/stopping.html

附加建议:

首先,您应该检查是否确实需要初始化。如果您的初始化过程是异步任务,您可以在此处启动它(可能使用对话框),或者您可以将用户直接发送回 SplashScreen/MainActivity。

protected void onRestart() {
    super.onRestart();
    if (!this.getApplicationContext().getIsInitialized()
      && !(this instanceof SplashScreenActivity)) {
      Log.v(TAG, "onRestart() starting Initialization of Application");
      initialize();
    } else {
       Log.v(TAG, "onRestart() Application already initialized");
    }
 }
于 2013-01-10T22:46:55.400 回答
0

您需要使用onSaveInstanceState来保留在您的活动被终止并重新启动时需要恢复的任何配置。您将在 onCreate 中重新获得此捆绑包,并且可以将应用程序更新到它停止的位置。

于 2013-01-10T22:38:23.027 回答
0

检查您在 Eclipse 中的设置。确保将启动活动设置为应用在清单中定义的任何内容。有时 Eclipse 喜欢将特定的启动器活动设置为默认值并记住该活动,即使您的清单另有说明。

于 2013-01-10T22:42:02.573 回答