我的应用程序有多个活动,包括StartActivity,该活动用

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


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

有时,在我的应用程序运行之后,用户会按下HOME键将它发送到后台,并且可能还会打开其他一些应用程序。如果过一会儿我的应用程序从启动器重新启动,那么无论上次打开该应用程序处于活动状态时,该应用程序都会愉快地恢复。这可以。

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

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

我的理解是错误的,还是Android所做的事情完全是疯狂的?

可能相关:Android: When do classes get unloaded by the system?

最佳答案

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

重新启动时,它会调用上次打开的Activity的onRestart()方法。
您需要在本活动中实现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");
    }
 }

10-04 23:13
查看更多