【问题标题】:Application restart - Activity Entry Point应用程序重启 - 活动入口点
【发布时间】:2012-06-28 10:51:17
【问题描述】:

我有一个应用程序,入口点是 "login/splash" Activity,我需要从服务器预加载新数据。这个SplashActivity 被声明为:

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

在我的AndroidManifest.xml 中,加载数据后,我将一些数据保存在我的自定义Application 类中,然后继续使用我的MainActivity

我期待,在我的Application 被操作系统或用户停止(使用强制停止)之后,然后由用户重新启动,我的应用程序的入口点将是 SplashActivity再次但是系统跳过SplashActivity并显示MainActivity

问题:这是预期的行为吗?如果整个过程停止,我的应用程序不应该以SplashActivity 启动吗?这可以实现吗?

【问题讨论】:

  • 可以在manifest文件的activity标签中设置android:noHistory="true"
  • AFAIK,您的问题是错误的,强制停止的应用程序将始终从其主启动器活动开始。

标签: android-intent android


【解决方案1】:

实际上,这个问题和一些答案解决了几个问题:


回答您最初的问题,“是的,这是预期的行为”。

Android 将每个 Activity 视为一个独立的自包含实体。 Android 会记住任务堆栈中的活动状态,并且它可以随时终止您的进程(其中包含您的所有活动),因为它“知道”它总是可以在需要时重建您的活动。当然,当您有一个复杂的应用程序,其中活动之间存在依赖关系和/或您有存储在 Application 类(或类似的静态/单一位置)中的全局数据时,这个概念当然会失效。

当 Android 终止您的进程时,它会记住任务中最顶层的活动,当用户返回任务时,它会重新创建进程,然后重新创建任务中最顶层的活动。在你的情况下,MainActivity

例如,如果您的任务堆栈如下所示:

StartActivity -> ActivityB -> ActivityC -> ActivityD

并且您的任务进入后台并且 Android 会终止该进程,当用户返回任务时,只会重新创建 ActivityD。一旦ActivityD 完成,Android 将重新创建ActivityC。一旦ActivityC 完成,Android 将重新创建ActivityB 等。简而言之,当用户恢复任务时,不会重新创建完整的堆栈。

清单设置或 Intent 标志的组合无法为您提供所需的行为。如果 Android 能提供类似的功能就好了,但目前还没有。


您可以通过在应用程序派生类(或任何其他类)中使用静态(类)布尔变量来确定您的进程是否已重新启动。当进程重新启动时,此变量将始终具有值false,然后您可以从任何地方检查变量的状态,并在必要时重新初始化(重新加载数据)。然后将变量设置为true。它将保持true 直到进程被杀死并重新创建,即使您的所有活动都完成了。这样就可以只在需要的时候进行初始化。

您还可以将其用作从SplashScreen 重新启动应用程序的指示器。所以在你所有的活动中,在onCreate(),你可以检查这个布尔变量的状态,如果应用程序已经重新启动,你可以像这样简单地重定向到SplashScreen

Intent intent = new Intent(this, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

这将完成任务中的所有活动并重新启动任务根目录下的SplashScreen


接下来,如果您想防止每次用户返回应用程序时都必须下载数据(当它在后台并随后被 AndroidOS 杀死时),您应该将下载的数据存储在私有缓存区域中并在应用程序重新启动时使用它。如果您的进程被终止并重新启动,这可以避免重复下载数据。


解决此问题的另一种方法是将数据加载到服务中。如果您的进程中有Service 正在运行,那么Android 就不太可能杀死您的进程。您只需要确保在用户完成您的应用程序后关闭您的Service


我意识到这个答案是冗长的。希望你能从中有所收获。

【讨论】:

  • 是的。感谢您在这方面的时间。我真的确信,一旦操作系统停止进程,应用程序将从入口点重新启动......因为这就是当我们停止它时发生的事情......通过 DDMS 或 Settings->Applications。跨度>
  • 不,这实际上不是真的。当你停止它时会发生什么:调试器向进程发送信号以杀死它,因此进程终止。 Android 看到这个并说“哦,该应用程序中有一个行为不良的活动导致它死机。所以我将为用户重新启动该进程,但在此之前,我将删除该行为不良的活动从堆栈中”。所以你看到的是你的根活动重新启动的过程。
  • 感谢你们俩十亿...我花了几天时间解决类似的问题stackoverflow.com/questions/11190469/…...问题和您的回答真的很有帮助...
  • @DavidWasser... 我怎么知道为什么 android 重新启动了我的活动?我有 JNI 代码和十几个可访问的主题...应用程序正在重新启动,但我不知道为什么?请在stackoverflow.com/questions/11190469/…查看我的问题
【解决方案2】:

可以这样做:

1. SplashActivity 毫无疑问每次都会开始。

2. 下载数据并保存检查(布尔值)表示加载完成。您可以使用SharedPreferences

3.下次检查条件并立即启动您的MainActivity

【讨论】:

  • 是的,但是一旦我将“检查”设置为真,我什么时候将其设置为“假”?
  • 关于“1”,你怎么能说Splash每次都会启动呢?在应用程序重新启动后,这里有人遇到同样的问题stackoverflow.com/questions/11190469/…
  • 你的应用每次启动都需要下载数据吗?
  • 是的。然后将其保留在应用程序中,直到应用程序重新启动。
  • 链接说应用重启和应用重启意味着你所做的应用启动器的活动将被调用。
猜你喜欢
  • 2017-03-23
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多