Ui

2019-04-21 android 应用程序之间的任务栈

2019-04-23  本文已影响0人  LoveXiaer

4种模式,这四种模式均是修饰这个要跳转的activity:
1、standard(默认):在当前程序界面的新建一个activity实例,故与当前程序界面在同一个任务栈中;
2、singleTop:栈顶复用模式,比standard模式多一个情况是,若当前栈顶已有该activity实例,则通过onNewIntent()复用该实例;若没有,则新建。
如果是外部程序启动singleTop的Activity,在Android 5.0之前新创建的Activity会位于调用者的Task中,5.0及以后会放入新的Task中,返回时会直接返回调用的地方,这点与singleTask不同。
3、singleTask:栈内复用模式,栈内有该acitivity则出栈至该位置,并onNewIntent()进行复用;如没有,则新建一个Task栈中创建acitivity实例;
Android的APP切换,实际上是以Task为单位来进行切换,将被选中的Activity所在的Task移动到Stack任务栈的最前端,然后在Task内部根据Activity的启动模式,使用LaunchModel规则对Task内部的Activity进行操作。
4、singleInstance:

若是外部程序通过以下flag调用一个standard模式的activity,之后返回,还是会直接返回到调用的界面。
如果是内部调用
一些flag
1、FLAG_ACTIVITY_NEW_TASK:
链接:https://www.jianshu.com/p/890d8897caf4
首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性相同);
如果有,则直接把这个栈整体移动到前台,并保持栈中旧activity的顺序不变,然后被启动的Activity会被压入栈;
如果没有,则新建一个栈来存放被启动的activity,注意,默认情况下同一个应用中的所有Activity拥有相同的关系(taskAffinity).
2、FLAG_ACTIVITY_CLEAR_TOP:
If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent.
在当前栈中入栈,如果栈中有,则清除顶部所有的activities,通过onNewIntent()复用该activity;除非该activity是 “multiple”启动模式&&flag中未设置FLAG_ACTIVITY_SINGLE_TOP,则是重新创建该activity。
如果是程序A启动程序B的一个acitivity A,加上该flag,依然还是在程序A当前的task中入栈,起不到clearTop的作用。

组合:
Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK
| FLAG_ACTIVITY_SINGLE_TOP

程序A启动程序B的一个activity A,可以实现singleTask一模一样的效果。

上一篇下一篇

猜你喜欢

热点阅读