0

与此相关的 SO 有很多问题,但我找不到这样直接的问题。

我的应用程序有一个主活动 M 和一个子活动 S。

MlaunchModesingleTask因为我只希望一个实例运行,并且我希望 S 与 M 存在于同一任务中。

SlaunchModestandard,因为它可以有很多实例。

在 S 中,有一个向上按钮,必须始终将用户带到 M。

有两种类型的任务堆栈(顶部有 S):

  1. MSSSS...S

如果用户在 S 中按下 Up,则堆栈应变为:

M(其中 M 应该处于与用户离开它的状态相同的状态)

  1. SSSS...S

如果用户在 S 中按下 Up,则堆栈应变为:

M(新实例)

--

那么如何构造Intent向上按钮...

在第一种情况下,FLAG_ACTIVITY_CLEAR_TOP应该可以解决问题,但是如果我们将其应用于第二种情况,那么用户将被转储回 Home。

在第二种情况下,FLAG_ACTIVITY_CLEAR_TASK可以解决问题,但是如果我们将其应用于第一种情况,我们会发现 M 已完成并重新启动。

人们可能也想尝试一下FLAG_ACTIVITY_NEW_TASK,但是我们发现从 M 中点击 Back 会将用户带到他/她点击 Up 的屏幕。

旁注:当 M 是singleTask并且活动都具有相同的(默认)任务亲和力时,这怎么可能?

Intent那么在这种情况下如何正确构造Up呢?

4

2 回答 2

1

你不能构建一个Intent可以做你想做的事情的 UP。这些东西是相互排斥的。您可以执行以下操作:

将启动模式更改MsingleTop

在中M.onCreate(),使用 . 检查是否M位于任务的根目录isTaskRoot()。如果它不是任务根,M请自行重启并清除任务,如下所示:

Intent relaunch = new Intent(this, M.class);
relauch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(relaunch);

在您的 UPIntent中,添加以下标志:Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP.

这将确保如果M任务中已经存在 的实例,它将清除该实例之上的所有内容并调用onNewIntent()现有实例。

如果任务中没有现有的实例M,它将在堆栈顶部启动一个新实例。该实例将识别出它不是根活动,并将清除任务并重新启动自身。

注意:这仅适用于 Android 3.0 及更高版本(API 11 或更高版本)。

于 2015-01-26T14:17:31.043 回答
0

这是使用(Lollipop)已弃用的 API 的解决方法/hack:

ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
if (M_CLASS_NAME.equals(am.getRunningTasks(1).get(0).baseActivity.getClassName()) {
    // we should be able to just clear top - because M is already running
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}
else {
    // okay to assume M is not running (because it is always root of task)
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
}
于 2015-01-26T12:23:58.853 回答