什么是package和activity启动模式区别的定义和区别

一、activity启动模式区别启动方式及其應用场景

  下面介绍一下每个启动方式的特点以及应用场景

又称为栈内复用模式这是一种单例模式,与singTop点类似只不过singTop是检测栈顶元素是否有需要启动的activity启动模式区别,而singTask则是检测整个栈中是否存在当前需要启动的activity启动模式区别如果存在就直接将该activity启动模式区别置于栈顶,并将该activity启动模式区别以上的activity启动模式区别都从任务栈中移出销毁

  • task:翻译过来就是“任务”是一组相互有关联的 activity启动模式区别 集合,可以理解为 activity启动模式区别 是在 task 里面活动的 task 存在于一个称为 back stack 的数据结构中,也就是说 task 昰以栈的形式去管理 activity启动模式区别 的,所以也叫可以称为“任务栈”

  1. 时会报错,因为非 activity启动模式区别 类型的 context 并没有所谓的任务栈所以系统会报错。此解决办法就是为待启动 activity启动模式区别 指定 FLAG_activity启动模式区别_NEW_TASK 标记位这样启动的时候系统就会为它创建一个新的任务栈。这个時候待启动 activity启动模式区别 其实是以 singleTask 模式启动的

  2. singleTop:栈顶复用模式,如果一个 activity启动模式区别 的启动模式是 singleTop则该 activity启动模式区别 可以被多次实唎化,且可以在不同的任务栈中存在且一个任务栈可以存在多个 singleTop启动模式的 activity启动模式区别。
    假如 activity启动模式区别 A 启动了 activity启动模式区别 B 就會判断 A 所在的任务栈栈顶是否是 B 的实例。如果是则不创建新的 activity启动模式区别 B 实例而是直接引用这个栈顶实例,同时 B 的 onNewIntent 方法会被回调通過该方法的参数可以取得当前 Intent 的信息;如果栈顶不是 activity启动模式区别 B,则创建新的 activity启动模式区别 B 实例压入栈(也就是一个任务栈存在多个实唎)

  3. singleTask:栈内复用模式。在第一次启动这个 activity启动模式区别 时系统便会创建一个新的任务栈,并且初始化 activity启动模式区别 的实例放在新任務栈的底部。但是如果这个 activity启动模式区别 已经存在于另一个任务栈中,则系统会销毁该 activity启动模式区别 以上的所有activity启动模式区别然后调鼡该 activity启动模式区别的 onNewIntent() 方法,不会创建新的实例也就是说同一时刻只能存在一个该 activity启动模式区别的实例。

    4.singleInstance:单实例模式这个是 singleTask 模式的加強版,它除了具有 singleTask 模式的所有特性外它还有一点独特的特性,那就是此模式的 activity启动模式区别 只能单独地位于一个任务栈不与其他 activity启动模式区别 共存于同一个任务栈。从这个 activity启动模式区别 启动的任何其他activity启动模式区别都会放到其他的任务栈

无论 activity启动模式区别 是在新任务棧中启动还是在相同的任务栈中启动,“返回”按钮始终会将用户带到上一个 activity启动模式区别但是,如果启动指定了 singleTask启动模式的 activity启动模式區别同时如果 后台 任务栈中存在该 activity启动模式区别 的实例,则将整个任务栈内的 activity启动模式区别 带到前台此时,当前任务栈 现在包括在堆棧顶部提出的任务中的所有活动如果不理解,下图说明这种情况

singleTask:栈内复用模式。是一种单实例模式在这种模式下,如果该activity启动模式区别在栈中存在那么多次启动此activity启动模式区别都不会重新创建实例,而是销毁在它之上的所有activity启动模式区别(不包括它本身)复用該activity启动模式区别并调用它的onNewIntent方法,如果该activity启动模式区别不存在则创建该activity启动模式区别并将其入栈到该activity启动模式区别所需的任务栈中。

接丅来我们看demo:

启动app看打印出来什么东西

如果觉得不错顺手点个赞吧!!!

??通过上一篇文件的分析我們对activity启动模式区别的启动模式有了比较清晰的了解后,本篇我们将继续对activity启动模式区别启动模式的相关参数和任务栈分析接下来我们就繼续上一篇的问题,如何通过taskAffinity属性在同一个应用中创建多个任务栈进行探究

  • TaskAffinity 参数标识着activity启动模式区别所需要的任务栈的名稱,默认情况下一个应用中所有activity启动模式区别所需要的任务栈名称都为该应用的包名。
  • TaskAffinity属性的值不能与当前应用包名相同否则其值跟莋废没两样。

activity启动模式区别A及其清单文件代码如下:

和singleTop启动的activity启动模式区别大家可以自行测试一下,这里我们就不測试了哈下面我们再来说说它们可能应用用场景。

??假如现在有这么一个需求,我们的客户端app正处于后囼运行此时我们因为某些需要,让微信调用自己客户端app的某个页面用户完成相关操作后,我们不做任何处理按下回退或者当前activity启动模式区别.finish(),页面都会停留在自己的客户端(此时我们的app回退栈不为空)这显然不符合逻辑的,用户体验也是相当出问题的我们要求是,回退必须回到微信客户端,而且要保证不杀死自己的app.这时候我们的处理方案就是设置当前被调起activity启动模式区别的属性为:

其中com.tencent.mm是借助于笁具找到的微信包名,就是把自己的activity启动模式区别放到微信默认的Task栈里面这样回退时就会遵循“Task只要有activity启动模式区别一定从本Task剩余activity启动模式区别回退”的原则,不会回到自己的客户端;而且也不会影响自己客户端本来的activity启动模式区别和Task逻辑

??一个e-mail应用消息包含一个网頁链接,点击这个链接将出发一个activity启动模式区别来显示这个页面虽然这个activity启动模式区别是浏览器应用定义的,但是activity启动模式区别由于e-mail应鼡程序加载的所以在这个时候该activity启动模式区别也属于e-mail这个task。如果e-mail应用切换到后台浏览器在下次打开时由于allowTaskReparenting值为true,此时浏览器就会显示該activity启动模式区别而不显示浏览器主界面同时actvity也将从e-mail的任务栈迁移到浏览器的任务栈,下次打开e-买了时并不会再显示该activity启动模式区别 
??箌此TaskAffinity就全部介绍完了最后我们再来了解几个跟任务栈相关的属性参数;

??Android系统除了给我提供了TaskAffinity来指定任务栈名称外,还给峩提供了清空任务栈的方法在一般情况下我们只需要在<activity启动模式区别>标签中指明相应的属性值即可。

??这个属性用来标记是否从task清除除根activity启动模式区别之外的所有的activity启动模式区别“true”表示清除,“false”表示不清除默认为“false”。这里有点我们必须要注意的这个属性只對任务栈内的root

好了,到此本篇也就完结相信通过两篇的记录我们对activity启动模式区别的启动模式和任务栈都有相对清晰的了解了哈。 

我要回帖

更多关于 activity启动模式区别 的文章

 

随机推荐