如果已作为根用户在backbackback中,Android活动未启动?

如果已作为根用户在backbackback中,Android活动未启动?,android,android-intent,Android,Android Intent,我有一个包含3个活动的示例应用程序:Main、a和B。它们都没有任何启动模式 现在我这样做: 打开应用程序,将显示主要活动 使用“后退”按钮离开应用程序,以便没有活动正在运行 接收启动新活动a(新任务标志)的广播 单击活动a中的按钮打开活动B(无标志) 接收启动新活动a(新任务标志)的广播 新活动A未启动 (如果我回去,仍然有上一个活动A) 在第6步,活动A应该呈现,但没有呈现。 如果我尝试呈现活动C(在#5中),它将按预期呈现 如果在#2中,我通过homebutton离开应用程序,则一切正常

我有一个包含3个活动的示例应用程序:Main、a和B。它们都没有任何启动模式

现在我这样做:

  • 打开应用程序,将显示主要活动
  • 使用“后退”按钮离开应用程序,以便没有活动正在运行
  • 接收启动新活动a(新任务标志)的广播
  • 单击活动a中的按钮打开活动B(无标志)
  • 接收启动新活动a(新任务标志)的广播
  • 新活动A未启动 (如果我回去,仍然有上一个活动A)
  • 在第6步,活动A应该呈现,但没有呈现。

    如果我尝试呈现活动C(在#5中),它将按预期呈现

    如果在#2中,我通过homebutton离开应用程序,则一切正常

    这怎么可能?我如何确保活动始终呈现?我可以使用
    标记活动\u清除\u顶部|标记活动\u单个\u顶部
    ,但我想保持后台

    更新-来源: 您可以查看,但我使用的是Xamarin(它基本上是用C#编写的原生Android,非常类似于Java)。 这是构建清单的内容(删除了Xamarin内容):


    更新选项3:这将使活动处于最佳状态

    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    
    选项1:在启动活动A时,将标志“活动”重新排序设置为“最前面”。这将使活动A位于堆栈顶部

    activityAIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    
    选项2:浏览Android文档,只有“标准”启动模式才能创建活动的多个实例

    请参阅下表

    本文档说明了每种模式的用法:

    如果每次都需要新实例,请将标准启动模式添加到活动A中

    android:launchMode="standard"
    

    好的,让我们按照操作顺序来看看这一点

  • 打开应用程序,将显示主要活动

    回撤状态:
    主活动(根)

  • 使用“后退”按钮离开应用程序,以便没有活动正在运行

    回撤状态:

  • 接收启动新活动a(新任务标志)的广播

    后退状态:
    ActivityA(根)

  • 单击活动a中的按钮打开活动B(无标志)

    后退状态:
    ActivityA(根)->ActivityB(顶)

  • 接收启动新活动a(新任务标志)的广播

    后退状态:
    ActivityA(根)->ActivityB(顶)

    此处未启动ACTIVITY A,因为它是使用意向标志“flag_ACTIVITY_NEW_TASK”启动的,该标志包含以下文档:

  • 使用此标志时,如果活动的任务已在运行 您现在正在启动,那么新的活动将不会启动; 相反,当前任务将被简单地带到 显示最后一次进入的状态的屏幕。

  • 新活动A未启动(如果我返回,则仍存在上一个活动A)
  • 在第6步,活动A应该呈现,但没有呈现。

    因此当前任务看起来像这样
    ActivityA(root)->ActivityB(top)
    ActivityA
    已存在于任务中,因此任务 作为一个整体,这意味着
    活动b
    是 仍然处于任务的顶端

    如果我尝试呈现活动C(在#5中),它将按预期呈现。

    ActivityC
    是任务中不存在的新活动,因此 是为您创建的

    如果在#2中,我通过homebutton离开应用程序,则一切正常。

    homebutton press的问题是,在本例中,main活动没有被破坏,只是被推到了后台

    因此,在#2之后,backback的状态看起来仍然将MainActivity实例作为根:

    主要活动(根)

    现在,在#5之前,backbackback应该是这样的:

    Main Activity(root)->ActivityA->ActivityB(top)

    在#5之后,你的后背看起来像这样:

    Main Activity(root)->ActivityA->ActivityB->ActivityA(top)

    我认为这似乎是因为默认情况下启动
    MainActivity
    时带有意图标志:

    标记活动新任务标记活动重置任务如果需要

    这还会触发任务重新分配,因此它可以控制使用新任务标志(与父应用程序具有相同的关联性)创建的新活动,以及如何将此类活动移动到其任务

    你可以找到更多关于这个的信息

    我如何确保活动始终呈现?我可以使用FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP,但我想保留backbackback。

    由于这是一个堆栈数据结构,您无法对活动进行重新排序,但是,您可以通过在创建ActivityA的接收器中添加以下标志来解决此问题:
    flag_ACTIVITY_NEW_TASK | flag_ACTIVITY_MULTIPLE_TASK
    ,因为这将确保为该活动创建新实例/任务,而不管它是否已经存在。(不是推荐的解决方案 -(但有效)

    但是,如果要维护相同的
    ActivityA
    实例,则必须向清单中的活动添加taskAffinity参数

    <activity android:name=".ActivityB" android:taskAffinity="com.example.pendingintent"></activity>
    <activity android:name=".ActivityA" android:taskAffinity="com.example.abctest" />
    

    是一个很好的幻灯片,它解释了taskAffinity及其如何影响活动的创建。

    这些活动是否具有任务affinity?不,我对任务affinity了解不多。应该吗?它没有蜜蜂
    <activity android:name=".ActivityB" android:taskAffinity="com.example.pendingintent"></activity>
    <activity android:name=".ActivityA" android:taskAffinity="com.example.abctest" />