想象一下这个活动历史堆栈:
A> B> C> D> E.
方案1:
如果用户在E上然后点击后退按钮,则应导航到D> C> B> A.
方案2:
如果用户在E上,然后点击自定义按钮“显示B”,则应清除E> D> C.这与Finish()类似。
如果X> Y,如果我们在Y上设置完成,则会显示X.类似如果我在E上录制显示B,则应从堆栈中清除E> D> C.
我需要实现这两种方案。
(用场景编辑^^^^)
如果用户正在进行E活动并且想要移动B.如果B在历史堆栈中,我们可以清除C> D> E,以便用户可以在没有startActivity(B)的情况下导航到B.和A应该是历史。
如果堆栈中有活动,那么它应该从历史加载,如果不是startActivity(B)。
如果我使用FLAG_ACTIVITY_CLEAR_TOP / FLAG_ACTIVITY_NEW_TASK,它将清除完整历史记录并开始新活动。
我想清楚部分历史。
有可能实现吗?如果是这样,该怎么办呢?
这都非常标准。不要使用任何特殊的启动模式。通常情况下,按BACK将完成当前的Activity
并让您回到上一个。
对于这种情况:
如果用户在E上,然后点击自定义按钮“显示B”,则应清除E> D> C.这与Finish()类似。
在E
,回到现有的B
实例,这样做:
Intent intent = new Intent(this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
这将完成E,D和C并返回到现有的B实例。
标志FLAG_ACTIVITY_CLEAR_TOP
告诉Android清除当前Activity
和目标Activity
之间的所有活动。如果未指定FLAG_ACTIVITY_SINGLE_TOP
,则目标Activity
的现有实例也将完成,并将创建一个新实例。如果确实指定了FLAG_ACTIVITY_SINGLE_TOP
,则目标Activity
的现有实例将不会完成,并且不会创建新实例。
你可以使用这个来实现
android:launchMode="singleTask"
在您的清单文件中。有关更多信息,请参阅此文档https://android.jlelse.eu/android-activity-launch-mode-e0df1aa72242