如果按下后退按钮,android singleinstance活动不单

时间:2013-02-20 18:19:35

标签: android android-activity single-instance launchmode

我遇到了一个有趣的问题,其中一个Activity被多次创建,甚至它被定义为清单中的singleTask或singelInstance活动。以下是如何重现这一点。比如,在主要活动中:

@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时按下“后退”按钮,它会导航回MainActivity,其中{ {1}}将创建另一个MainActivity.onResume()实例,而不是提出已存在的实例。这是我所知道的,因为在日志中会显示不同的身份哈希码。

如果启动模式是singleTask,那么情况似乎也是如此。

唯一的解决方法似乎是覆盖SingleActivity,但这似乎是一个丑陋的解决方案。

我想知道我做错了什么

2 个答案:

答案 0 :(得分:8)

这是taskAffinity的问题。由于您未在taskAffinityMainActivity的清单中指定SingleActivity,因此这两项活动具有相同(默认)taskAffinity。当您开始活动时,Android会检查您要启动的活动的taskAffinity。如果它与您的任务中根活动的taskAffinity相同,则忽略launchMode="singleInstance"launchMode="singleTask" (因为这些启动模式需要Android创建一个新任务以启动活动,并在当前任务中启动活动。

不幸的是,这没有详细记录,但taskAffinity优先于launchMode

如果你真的想要一个singleTasksingleInstance活动(这通常不是正确的事情,因为它带来了一大堆其他令人讨厌的东西,你可能会出错) ,然后您需要确保您的singleInstancesingleTask活动在其<activity>定义中的清单中包含以下内容:

android:taskAffinity=""

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

答案 1 :(得分:4)

默认情况下,按BACK键完成(销毁)当前活动并将以前的活动显示给用户。

所以,这是不可能的

  

而不是提出已经存在的那个

因为没有活动。