当应用程序被系统杀死时清除后台堆栈

9
我有一个应用程序,其中包含许多活动。其中之一是InitialActivity,它加载核心数据。它是启动器活动,没有加载的数据,下一个活动就无法继续运行。
所以我启动应用程序,InitialActivity正在加载数据,然后导航到MainActivity,然后我浏览到一些FarAwayActivity。然后我切换到其他应用程序(其中一些是重型游戏),我的应用程序在后台被杀死。我在Application.onCreate()中插入了日志调用,并且当我切换回我的应用程序时,我可以看到它被再次调用。因此,我确定应用程序在后台被杀死。但是Android会将最后一个FarAwayActivity带到顶部,因为所有加载的数据都为空,它会立即崩溃。
因此,问题是:当(且仅当)应用程序被杀死并恢复时,如何告诉应用程序从InitialActivity重新开始?类似于“忘记我的后退堆栈”,但可能自动在清单中进行设置。
我已经阅读并尝试了来自Activity标签文档的所有内容,但没有符合我的期望。最接近的是android:clearTaskOnLaunch="true",但它在从桌面重新启动应用程序时清除堆栈中的所有其他活动(并且应用程序尚未被杀死,因此所有数据都可用)。为了明确起见,我想在应用程序实际被杀死后仅从InitialActivity开始。

当您的应用程序上下文正在被销毁时,您是否在Application类上找到任何回调?就我目前所知,没有。如果有的话,那么您可以在该点清除整个堆栈。除非您没有特定的回调点,否则您需要解决数据相关的问题。 - Amit K. Saha
@AmitK.Saha:虽然有Application.onLowMemory()Application.onTrimMemory()方法,但我怀疑我不能使用它们来清除后台堆栈。据我所知,后台堆栈清理是通过启动一个带有FLAG_ACTIVITY_CLEAR_TOP标志的单个根Activity来执行的。因此,在那个时候启动新的Activity绝对不行。 - Andrew
Application.onTrimMemory()和Application.onLowMemory()只是特殊的事件回调函数,它们并不总是被调用。因此,我们不能将它们用于此目的。 - Amit K. Saha
我使用OnResume方法检查一些基本变量。同时保留指向已启动Intents的指针副本。当变量被清除时,我调用“重置”选项,尝试关闭所有Intents并重新启动MainActivity。这不是一个理想的解决方案,因此仍在寻找更好的方法,但在此之前,这可以减少崩溃的发生。 - Danielson
1个回答

0
首先,我建议您不要将数据存储在应用程序中,而是通过Intent将数据传递给Activity。这样,当Activity恢复时,保存的Intent将带回其数据。
现在针对您实际问题的建议:
  1. 当您的Activity被恢复时,您将检查Application对象中的数据是否为null
  2. 如果是,您应该调用以下代码:

    Intent newIntent = new Intent(FarAwayActivity.this, InitialActivity.class);
    newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(newIntent);
    

现在它应该清除堆栈直到找到InitialActivity。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接