按下后退按钮时android singleinstance活动不单

按下后退按钮时android singleinstance活动不单,android,android-activity,single-instance,launchmode,Android,Android Activity,Single Instance,Launchmode,我遇到了一个有趣的问题,一个活动被多次创建,甚至它在清单中被定义为singleTask或SingleInstance活动。这是如何复制的。比如,在主要活动中: @Override protected void onResume() { Intent i = new Intent(MainActivity.class, SingleActivity.class); startActivity(i); } 在我的活动中,我有: @Override protected void on

我遇到了一个有趣的问题,一个活动被多次创建,甚至它在清单中被定义为singleTask或SingleInstance活动。这是如何复制的。比如,在主要活动中:

@Override
protected void onResume() {
    Intent i = new Intent(MainActivity.class, SingleActivity.class);
    startActivity(i);
}
在我的活动中,我有:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    Log.i("SingleActivity", "onCreate " + System.identityHashCode(this));
    ...
}
在舱单中,我有:

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

现在,如果我启动该应用程序,情况似乎没有问题,除了一种情况:如果我在
SingleActivity
前面按下“后退”按钮,它会导航回
MainActivity
,其中
MainActivity.onResume()
将创建另一个
SingleActivity
实例,而不是提出一个已经存在的。这是我知道的,因为在日志上显示了不同的身份哈希代码

如果启动模式为singleTask,情况似乎也是如此

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


我想知道我做错了什么

默认情况下,按后退键完成(销毁)当前活动并向用户显示上一个活动

所以,这是不可能的

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


因为不存在任何活动。

这是
任务亲缘关系的问题。由于您没有在
main活动
SingleActivity
的清单中指定
taskAffinity
,因此这两个活动具有相同的(默认)
taskAffinity
。启动活动时,Android会检查要启动的活动的
taskafinity
。如果它与任务中根活动的
taskAffinity
相同,则它将忽略
launchMode=“singleInstance”
launchMode=“singleTask”
(因为这些启动模式需要Android创建新任务来启动活动),并在当前任务中启动活动

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

如果你真的想要一个
singleTask
singleInstance
活动(这通常不是正确的做法,因为它会带来一大堆你可能会出错的糟糕事情),然后,您需要确保您的
singleInstance
singleTask
活动在其
定义的清单中具有以下内容:

android:taskAffinity=""

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

您好,我的回答有用吗?有什么反馈吗?是的,很有帮助,谢谢:)然后你应该投票支持解决问题的答案,这就是Stackoverflow的工作原理!哦,我看到你在寻找业力点:)好了……如果所有活动都完成了,任务将被破坏,因此当重新启动活动时,即使活动指定了
singleInstance
标志,它也会重新创建活动。这是什么意思“它带来了一大堆你可能会弄错的糟糕事情”?在我的例子中,我使用的是launchMode=“singleInstance”和android:taskAffinity=”“对于我的Launcher应用程序,一切正常。@Pascal如果你的应用程序中有多个活动,这会变得复杂。此外,如果你的应用程序可以由另一个应用程序启动,它会变得复杂。通常,使用
singleTask
singleInstance
会导致比解决问题更微妙的行为问题。很少需要使用特殊的启动模式。根据我的经验,大多数人试图用它来解决他们并不真正理解的问题。在我的情况下,我只是在我的发射器中这样做,我对此没有问题。谢谢你确定活动被破坏了吗?我还没有看过代码,但每次我按下手机上的键,我都可以在以后继续活动(它永远不会被破坏)。这发生在我身上