通过关闭上面的所有活动(包括特定活动)再次从堆栈中间重新启动特定活动

Posted

技术标签:

【中文标题】通过关闭上面的所有活动(包括特定活动)再次从堆栈中间重新启动特定活动【英文标题】:Relaunch specific activity from middle of the stack again by closing all activities above (including specific one) 【发布时间】:2020-05-21 09:59:45 【问题描述】:

我有活动堆栈

A>B>C>D>E>F

Αctivity F 我想重新开始Αctivity C 并关闭所有C、D、E、F 活动,因此新的Αctivity 堆栈将是:

A>B>C(C as a Fresh 活动)

我尝试使用singleTaskActivity C,但它没有重新启动Activity C。它正在恢复Activity C

【问题讨论】:

完成 C 活动并再次启动 C 活动 不工作。它使堆栈 A>B>D>E>F>C 在你去之前C>D>E>F(current activity)在移动到下一个时完成所有活动。然后去活动 C 并完成活动 F 然后你的活动堆栈应该 A>B>C 为什么要创建一个新活动,然后将其留在堆栈中间?您需要保留代码流。 【参考方案1】:

使用startActivityForResult启动C、D、E、F活动

  public static void start(@NonNull Context context, @NonNull Intent intent) 
         context.startActivityForResult(intent, REQUEST_CODE);
        

在F Activity结束的时候调用这个方法(你要重新启动C Activity的地方)

 public static void finishAct(@NonNull Context context) 
       Intent data = new Intent();
        data.putExtra("recreateC", true);
          context.setResult(RESULT_OK, data);
            context.finish();
    

在 E 和 D 活动中

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
 // handle result
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null && data.getData() != null) 
finishAct(this)


在 C 活动中

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    // handle result
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null && data.getData() != null) 
      finishAct(this)
      // todo start C Activity again 
    
  

【讨论】:

【参考方案2】:

最后,我要回答我自己的问题。如果有人遇到同样的问题,您可以参考答案。

由于我对我想要实现的目标进行了很多研究,我发现无法重新启动 Activity C。所以我通过将 launchmode singleTask 添加到 Activity C 来解决它。并且从 Activity FI 启动该活动再次 C 并执行我想在 onNewIntent() 活动 C 上的重写方法中执行的任务。

【讨论】:

以上是关于通过关闭上面的所有活动(包括特定活动)再次从堆栈中间重新启动特定活动的主要内容,如果未能解决你的问题,请参考以下文章

从堆栈中清除后台活动/活动的正确方法是什么?

Android:清除活动堆栈

Android:如何在按下按钮时关闭一个活动并在按下另一个按钮时关闭整个后台堆栈? [复制]

完成活动前开始的所有活动

如何清除背压事件的活动堆栈跟踪?

Android:从后台堆栈中删除所有以前的活动