启动模式 "singleTop" 在使用 startActivityForResult 启动活动时被忽略



我使用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()启动的,在这种情况下,它根本不设置为返回结果。可能是它是使用来自另一个ActivitystartActivityForResult()启动的,在这种情况下,它被设置为将结果返回给启动它的Activity,而不是您的Activity

因此,这两件事:FLAG_ACTIVITY_SINGLE_TOPstartActivityForResult()是冲突的。

相关内容

  • 没有找到相关文章

最新更新