下雨下的好糟糕,有时候真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