Activity启动方式的总结(1)

来源:互联网 发布:如何用java做网站 编辑:程序博客网 时间:2024/04/30 01:08

下雨下的好糟糕,有时候真TM孤单,最近飞蚊症加重了,心态好爆炸.

任务栈

首先先了解一下任务栈是什么东西。

1.所谓栈:限制了里面的内容只能pop或者push。
2.任务栈是用来提升用户体验而设计的,它是一些Activity的组合,为了让用户完成一些工作或操作:

什么时候创建Task?

启动一个应用,系统就会为之创建一个task,来放置根Activity;


Activity所需的任务栈的名字是什么?

默认情况下,所有Activity所需的任务栈的名字为应用的package name


栈内的Activity都是同一个进程的吗?

栈内的activity可以来自不同的app,因此可以是运行在不同的进程,但是它们都属于同一个task内。
默认情况下,一个Activity启动另一个Activity(包括其他应用中的Activity)时,两个Activity是放置在同一个task中的,后者被压入前者所在的task栈,当用户按下后退键,后者从task被弹出,前者又显示在幕前。


任务栈的分类:

任务栈分为:前台任务栈和后台任务栈。

如果一个任务栈被移动到了后台,任务栈中的Activity都处于暂停状态。并且会保留每一个activity的状态,不丢失它们状态信息。

安卓系统是实时多task系统,用户可以随意在多个task之间切换。当一个task的栈内所有activity都pop之后,task也就销毁了。有时系统为了回收内存,会销毁activity,但是task不会销毁。


关键词–TaskAffinity

1.TaskAffinity对于Activity来说就好像它的身份证一样,可以告诉所在的task,自己属于这个task中的一员;
2.拥有相同affinity的多个Activity理论同属于一个task.
3.task自身的affinity决定于根Activity的affinity值。
4.默认情况下,一个应用内的所有Activity都具有相同的affinity,都是从Application(参考的taskAffinity属性)继承而来,而Application默认的affinity是中的包名,我们也可以为设置taskAffinity属性值。

<application   android:name="Browser"                 android:label="@string/application_name"                  android:taskAffinity="android.task.browser" >  

5.我们可以为每个Activity单独设定TaskAffinity,但是这个属性值不能和应用所在的包名相同,因为默认就是应用的package name。(-.-!)

affinity在什么场合应用呢?

TaskAffinity主要和:
1.singleTask或者FLAG_ACTIVITY_NEW_TASK标记,
2.allowTaskReparenting属性配合工作(重新为Activity选择宿主task)

两种场景的区别:

如果TaskAffinity和singleTask配合使用:

根据affinity查找或创建一个新的具有对应 该启动模式Activity的affinity的task。

如果TaskAffinity和allowTaskReparenting配合使用:

这里写图片描述


忘了一点:怎么看栈的情况:

adb shell dumpsys activity

参考:
http://blog.piasy.com/2016/03/19/Android-Task-And-Back-Stack/?utm_source=tuicool&utm_medium=referral

http://www.cnblogs.com/CSU-PL/p/3794280.html

0 0