【发布时间】:2015-04-22 16:49:28
【问题描述】:
我有一个包含很多活动的应用程序。其中有InitialActivity加载核心数据。这是一个启动器活动,如果没有加载的数据,接下来的任何活动都无法生存。
所以我启动应用程序,InitialActivity 正在加载数据,然后导航到 MainActivity,然后我正在浏览一些 FarAwayActivity。然后我切换到其他应用程序(其中一些是重型游戏)并且我的应用程序在后台被杀死。我在Application.onCreate() 中插入了日志调用,当我切换回我的应用程序时,我可以看到它再次被调用。所以我确定该应用程序在后台被杀死。但 Android 将最后一个 FarAwayActivity 置顶并立即崩溃,因为所有加载的数据都是空值。
所以问题是:当(且仅当)它被杀死和恢复时,我如何告诉应用程序从InitialActivity 重新开始?类似“忘记我的后台堆栈”之类的东西,但大概是在清单中自动发生的。
我已经阅读并尝试了 Activity tag docs 的所有内容,但没有任何内容符合我的期望。最接近的是android:clearTaskOnLaunch="true",但它会在从桌面重新启动应用程序时清除堆栈上的所有其他活动(并且应用程序尚未被终止,因此所有数据都可用)。需要明确的是,我只想在应用实际被杀死后才开始使用 InitialActivity。
【问题讨论】:
-
当您的应用程序上下文被杀死时,您是否在 Application 类上找到任何回调?据我所知,没有。如果有,那么您可以在那时清除您的全部筹码。除非你没有那个特定的回调点,否则你需要解决这个问题来决定数据。
-
@AmitK.Saha :有
Application.onLowMemory()和Application.onTrimMemory()方法,但我怀疑我可以使用它们来清除后台堆栈。据我所知,通过启动带有FLAG_ACTIVITY_CLEAR_TOP标志的单个根Activity来执行回栈清理。所以在那个时候启动新的Activity肯定不行。 -
Application.onTrimMemory() 和 Application.onLowMemory() 只是特殊事件回调,它们并不总是被调用。所以我们不能将它们用于此目的。
-
我使用 OnResume 方法检查一些基本变量。还要保留一份指向 Intents 的指针的副本。清除变量后,我调用“reset”选项,它会尝试关闭所有 Intent 并重新启动 MainActivity。不是一个理想的解决方案,所以仍在寻找一个,但在那之前,这会减少崩溃。
标签: android back-stack