Activity之Task

来源:互联网 发布:淘宝买火车票靠谱吗 编辑:程序博客网 时间:2024/04/26 18:19
Android使用Task来组织应用程序的所有ActivityTask是一个栈(Stack)结构,各个Activity按照栈的特点“后来居上、后进先出”依次被安排在栈中。
  默认情况下,一个应用程序中的所有Activity处于同一个Task中,在操作系统中同一时间上会存在多个Task

  默认情况下,当一个Activity被创建时,就会被压入到Task的栈顶,当其销毁时(用户点击“Back”键或调用finish()方法等),就会从栈顶移除。


Task有前台和后台之分:
Task有前台和后台之分,当某个应用显示在桌面的最前面的时候,他所对应的Task也会移动到前台
1-系统在同一时间内,可能存在一个前台Task和多个后台Task
2-当系统资源不足时,后台的Task会被回收
Task的默认模式:
当用户通过按home键来离开当前应用的时候,当前的Activity会被保存到Task中,此应用所对应的Task也会移动到后台,当用户再次启动此应用时,Task移动到前台,栈顶的Activity恢复。
当用户按下返回键的时候,当前的Task销毁,前一个应用的栈顶Activity恢复

启动模式:
     默认情况下,安卓把一个应用的所有Activity放在同一个Task中,但是实际的开发中这种默认并不能满足所有的需求,那么我们可以自己设置Activity的启动模式。
设置方式有两种:
1.通过清单文件,为Activity指定启动模式,配置launchMode属性
2.在通过intent 打开一个新的Activity的时候,通过参数的形式,设置启动模式


清单配置:
1.standard 标准模式  也是系统的默认模式,只要调用StartActivity(startActivityforResult)就会创建该Activity的实例,压入栈顶。也就是说A 打开B打开几次就会创建几次B的实例,每次创建之后都会把B压入栈顶,按返回时候B会逐个弹栈 A-B-B-B-B....

2.singleTop 在任务栈的栈顶只有一个栈顶Activity的实例,多次启动并不会创建多个Activity的实例。就是说A打开B ,第一次会创建B 的实例 压入栈顶,之后再次打开,只要站定是B,就不会再创建(系统调用onNewIntent方法把这个I闹腾腾传递给这个实例,不是创建新的实例)

3.singleTask 在任务栈中只有一个 实例,如果栈中存在一个singleTask修饰的Activity,那么再次启动此Activity的时候,不会创建这个Activity的实例,而是把在栈中处于这个Activity上面个的Activity全部弹栈,那么需要启动的Activity就来到了栈顶。singleTask默认具有clearTop的效果

4.singleInstance 在当前的设备中只有一个此Activity的实例,并且这个实例会创建出一个只属于自己的单独的任务栈,这么默认开发中谨慎使用 ,因为如果这个Activity弹栈,那么启动它的应用也会跟着弹栈(常用在浏览器中)


开启新的Task (查看Task : adb shell dumpsys activity )
为Activity设置taskAffinity属性
<activity android:name=".Activity1"
               android:launchMode="singleTask"
android:taskAffinity="newTask"
>
在MainActivity中启动它,系统栈的情况如下:

1 Running activities (most recent first):
2 TaskRecord{44f1e948 #8 A newTask}
3 Run #2: HistoryRecord{45028690 com.example.androidtest/.Activity1}
4 TaskRecord{4500b308 #7 A com.example.androidtest}
5 Run #1: HistoryRecord{44eb1ea8 com.example.androidtest/.MainActivity}
6 TaskRecord{4502d408 #2 A com.android.launcher}
7 Run #0: HistoryRecord{4502ab48 com.android.launcher/com.android.launcher2.Launcher}

用Intent来设置启动模式:
FLAG_ACTIVITY_NEW_TASK 和singleTask行为一样
FLAG_ACTIVITY_SINGLE_TOP和singleTop行为一样

注意:
1.在Intent中设置的启动模式的优先级高于在清单文件中设置的启动模式
2.在非Activity中启动一个Activity,必须为Intent设置FLAG_ACTIVITY_NEW_TASK,例如在服务于中启动Activity
3.清单文件中的启动模式有些是Intent中没有的,有些Intent类中的启动模式 在清单文件中也是不可以使用的


0 0
原创粉丝点击