按下后退按钮时android singleinstance活动不单
我遇到了一个有趣的问题,一个活动被多次创建,甚至它在清单中被定义为singleTask或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
@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
会导致比解决问题更微妙的行为问题。很少需要使用特殊的启动模式。根据我的经验,大多数人试图用它来解决他们并不真正理解的问题。在我的情况下,我只是在我的发射器中这样做,我对此没有问题。谢谢你确定活动被破坏了吗?我还没有看过代码,但每次我按下手机上的键,我都可以在以后继续活动(它永远不会被破坏)。这发生在我身上