我使用startActivityForResult()
启动一个活动,并希望防止在活动堆栈顶部启动多个实例。所以我希望android:launchMode="singleTop"
能完成它的工作,但由于某种原因,这个标志被忽略了。
经过一些调查,我设法通过向意图添加FLAG_ACTIVITY_REORDER_TO_FRONT
来启动一个实例,但如果有人能解释为什么"singleTop"在这种情况下不起作用,我将不胜感激。代码非常简单。
// Activity class
Intent intent = new Intent(this, DetailsActivity.class);
// multiple instances can be launched without this line
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivityForResult(intent, REQUEST_CODE_DETAILS);
// AndroidManifest.xml
<activity
android:name=".DetailsActivity"
android:launchMode="singleTop"/>
SingleTop 如何工作?
假设您当前有活动堆栈,例如
A->B->C
现在从当前活动 C 开始,如果您启动 A 活动,这是一个 singleTop,那么在这种情况下,系统将创建一个新的A实例并将该实例置于顶部。(如果指定的活动不在顶部,则将创建新实例(
所以堆栈看起来像
A->B->C->A
现在,如果您尝试再次打开 A,那么在这种情况下,A已经在顶部,因此不会创建新实例。相反,A 将在onNewIntent((方法中接收回调
旗
FLAG_ACTIVITY_REORDER_TO_FRONT
它从堆栈的前面扫描到堆栈的后面,如果找到指定活动的实例,则将该活动带到前面。
因此,在您的情况下,如果系统中已经存在DetailsActivityinstacne,那么此标志会将DetailsActivity置于前面
在这种情况下,必须忽略标志FLAG_ACTIVITY_SINGLE_TOP
,因为当您使用startActivityForResult()
启动Activity
时,您基本上是在说要启动Activity
并让Activity
返回结果。
如果堆栈中已存在此Activity
的实例(无论它在堆栈中的哪个位置(,则该实例尚未设置为将结果返回到您的Activity
。该实例可能是使用startActivity()
启动的,在这种情况下,它根本不设置为返回结果。可能是它是使用来自另一个Activity
startActivityForResult()
启动的,在这种情况下,它被设置为将结果返回给启动它的Activity
,而不是您的Activity
。
因此,这两件事:FLAG_ACTIVITY_SINGLE_TOP
和startActivityForResult()
是冲突的。