通过关闭上面的所有活动(包括特定活动)再次从堆栈中间重新启动特定活动
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 活动)
我尝试使用singleTask
到Activity
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 上的重写方法中执行的任务。
【讨论】:
以上是关于通过关闭上面的所有活动(包括特定活动)再次从堆栈中间重新启动特定活动的主要内容,如果未能解决你的问题,请参考以下文章