8

我遇到了一个有趣的问题,一个 Activity 被创建了多次,即使它在 manifest 中定义为一个 singleTask 或一个 singleInstance Activity。这是如何复制的。说,在主要活动中:

@Override
protected void onResume() {
    Intent i = new Intent(MainActivity.class, SingleActivity.class);
    startActivity(i);
}

在我的 SingleActivity 中,我有:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    Log.i("SingleActivity", "onCreate " + System.identityHashCode(this));
    ...
}

在清单中,我有:

    <activity android:name=".SingleActivity"
              android:launchMode="singleInstance"
    />

现在,如果我启动应用程序,一切似乎都还好,在一种情况下可以预期:如果我SingleActivity在前面按下“后退”按钮,它会导航回MainActivityMainActivity.onResume()将在其中创建另一个SingleActivity实例,而不是把已经存在的那个. 这是我知道的,因为在日志上显示了不同的身份哈希码。

如果启动模式是 singleTask,似乎也是如此。

唯一的解决方法似乎是 override onBackPressed(),但这似乎是一个丑陋的解决方案。

我想知道我做错了什么

4

2 回答 2

13

这是一个问题taskAffinity。因为您没有在您的或您taskAffinity的清单中指定,所以这两个活动具有相同的(默认)。当您启动一个活动时,Android 会检查您要启动的活动。如果它与您的任务中的根 Activity 相同,那么它将忽略(因为这些启动模式需要 Android 创建一个新任务来启动该 Activity)并在当前任务中启动该 Activity。MainActivitySingleActivitytaskAffinitytaskAffinitytaskAffinitylaunchMode="singleInstance"launchMode="singleTask"

不幸的是,这没有很好的记录,但taskAffinity优先于launchMode.

如果你真的想要一个singleTaskorsingleInstance活动(这通常不是正确的做法,因为它会带来一大堆其他令人讨厌的事情,你可能会出错),那么你需要确保你的singleInstanceorsingleTask活动具有在清单中的<activity>定义中如下:

android:taskAffinity=""

如果您需要更多信息,请在 StackOverflow 或 Google 中搜索“launchmode taskaffinity”

于 2013-02-20T22:42:51.697 回答
5

默认情况下,按下 BACK 键会结束(销毁)当前活动并向用户显示上一个活动。

所以,这是不可能的

而不是提出已经存在的

因为不存在活动。

于 2013-02-20T18:23:03.470 回答