【问题标题】:Clear back stack when application object gets killed by the system当应用程序对象被系统杀死时清除回栈
【发布时间】: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


【解决方案1】:

首先,我建议您不要将其存储在应用程序中,而是可以通过 Intent 将数据传递给您的 Activity。 这样,当 Activity 恢复时,保存的 Intent 将带回其数据。

现在对您的实际问题提出建议:

  1. 当您的 Activity 恢复时,您将检查 Application 对象中的数据是否为空
  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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多