单是singleTask和singleInstance不是答案。
我在堆栈中有活动... n, n+1, n+2
n+2
中的元素可以打开n+1
创建堆栈
... n, n+1, n+2, n+1
我想让它创建堆栈
... n, n+2, n+1
,其中n+1
被移到栈顶
singleTask创建堆栈
... n, n+1
和singleInstance创建堆栈
n+1
,其中所有先前的活动都关闭。
我都不想要。
有我可以使用的启动模式吗?
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
只使得这个活动不再从头开始加载,但不清除历史上重复的活动,也许有我可以使用的标志组合?或者我可以在活动堆栈的索引中找到该活动并删除它,如果它不是最近的活动?
我认为你应该使用FLAG_ACTIVITY_REORDER_TO_FRONT。
如果在传递给Context.startActivity()的Intent中设置,这个标志将导致启动的activity被带到它的任务历史堆栈的前面,如果它已经在运行。例如,考虑一个由四个活动组成的任务:a, B, C, D。如果D调用startActivity(),其意图是解析活动B的组件,那么B将被带到历史堆栈的前面,结果顺序是:a, C, D, B。如果还指定了FLAG_ACTIVITY_CLEAR_TOP,则忽略该标志。
你应该只添加FLAG_ACTIVITY_REORDER_TO_FRONT到你的意图。如果没有该标志,您的场景创建如下堆栈:(启动活动a, a启动B,然后B再次启动a)
TaskRecord{41ab0370 #23 A com.example.testproject U 0}
Run #7: ActivityRecord{41c655a8 u0 com.example.testproject/.MainActivity}
Run #6: ActivityRecord{41d378d0 u0 com.example.testproject/.SecondActivity}
Run #5: ActivityRecord{41bf99b8 u0 com.example.testproject/.MainActivity}
但是使用标志,没有任何特定的启动模式,您将得到以下堆栈,我认为这是您需要的:
TaskRecord{41d8a838 #25 A com.example.testproject U 0}
Run #6: ActivityRecord{41d89590 u0 com.example.testproject/.MainActivity}
Run #5: ActivityRecord{41c52b80 u0 com.example.testproject/.SecondActivity}