发布时主要活动被绕过

时间:2013-01-10 22:02:11

标签: android android-activity android-manifest

我的应用有多项活动,包括用{/ p>声明的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活动。应用程序处于活动状态,并且可以简单地恢复上次使用的活动,而无需重新初始化应用程序;或者,该应用已经死亡,应该从头开始重新初始化,包括启动MAIN活动。永远不应该处于这种奇怪的僵尸状态。

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

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

3 个答案:

答案 0 :(得分:1)

您的应用程序处于“已停止”状态,隐藏,您称之为“僵尸状态”。

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

您应该重新初始化您的应用程序。

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

其他建议:

首先,您应该检查是否真的需要初始化。 如果您的初始化过程是Async-Task,您可以在此处启动它(可能带有对话框),或者您可以将用户直接发送回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");
    }
 }

答案 1 :(得分:0)

当您的活动被杀死并重新启动时,您需要使用onSaveInstanceState来保留任何需要恢复的配置。你将把这个软件包放回onCreate,你可以将你的应用程序更新到它停止的地方。

答案 2 :(得分:0)

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