我遇到了一个有趣的问题,其中一个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
,但这似乎是一个丑陋的解决方案。
我想知道我做错了什么
答案 0 :(得分:8)
这是taskAffinity
的问题。由于您未在taskAffinity
或MainActivity
的清单中指定SingleActivity
,因此这两项活动具有相同(默认)taskAffinity
。当您开始活动时,Android会检查您要启动的活动的taskAffinity
。如果它与您的任务中根活动的taskAffinity
相同,则忽略launchMode="singleInstance"
或launchMode="singleTask"
(因为这些启动模式需要Android创建一个新任务以启动活动,并在当前任务中启动活动。
不幸的是,这没有详细记录,但taskAffinity
优先于launchMode
。
如果你真的想要一个singleTask
或singleInstance
活动(这通常不是正确的事情,因为它带来了一大堆其他令人讨厌的东西,你可能会出错) ,然后您需要确保您的singleInstance
或singleTask
活动在其<activity>
定义中的清单中包含以下内容:
android:taskAffinity=""
如果您需要更多信息,请在StackOverflow或Google上搜索“launchmode taskaffinity”
答案 1 :(得分:4)
默认情况下,按BACK键完成(销毁)当前活动并将以前的活动显示给用户。
所以,这是不可能的
而不是提出已经存在的那个
因为没有活动。