美文网首页
01_Android Task 相关

01_Android Task 相关

作者: Android_小生 | 来源:发表于2017-07-30 13:45 被阅读42次

    1. Android Task 简述


    Android 中的 Task 是一系列 Activity 的集合,用户通过操作多个 Activity 来完成一个 Task。它是一个具有栈结构的容器,可以放置多个 Activity 的实例。

    当用户进入某个 App 的时候,系统就会创建一个 Task,App 的入口Activity 被压入栈底。默认情况下,一个 Activity 启动另一个 Activity 时,两个 Activity 是放置在同一个 Task 中的,后者被压入前者所在的 Task 栈,当用户按下后退键,后者从 Task 被弹出,前者又显示在幕前,特别是启动其他应用中的 Activity 时,两个 Activity 对用户来说就好像是属于同一个应用。

    系统运行的所有 Task.jpg

    图中展示了现在系统中所有的 Task,最前面的是系统最近打开的最后一个 Task。

    2. Back Stack 回退栈


    回退栈指的是当用户点击返回键的时候,Android 系统会一个接一个地 pop 出 Task 中所保留的 Activity。它更多的表示的是一个 Activity 出栈的过程。

    3. Task 与 Activity


    Activity 的实例化是依赖于 Task 的,它必须被加载到某一个 Task 中才可以,从另一个角度来看,Task 就是 Activity 的容器。

    Android 系统在启动一个 Activity 的时候,会在系统中寻找是否存在符合该 Activity 的自身属性和启动该 Activity 的 Intent 的要求的 Task。有的话直接在在该 Task 中实例化一个 Activity,没有的话则需要新建一个 Task,再在其中对 Activity 进行实例化。

    4. 关于 affinity


    Task 有一个关键的属性 affinity。Android 中每一个 Activity 也都有一个叫做 affinity 的属性,默认情况下,一个应用内的所有 Activity 都具有相同的 affinity,都是从 Application(参考 <application> 的 taskAffinity 属性)继承而来,而 Application 默认的 affinity 是 <manifest> 中的包名,我们可以为 <application> 设置 taskAffinity 属性值,这样可以应用到 <application> 下的所有 <activity> ,也可以单独为某个 Activity 设置 taskAffinity。

    affinity 对于 Activity 来说就好像它的身份证一样,可以告诉所在的 Task,自己属于这个 Task 中的一员;拥有相同 affinity 的多个 Activity 理论同属于一个 Task,Task 自身的 affinity 决定于根 Activity 的 affinity 值。

    5. Intent 几种常见的 flags


    android.content.Intent 中定义了若干个 flags。常见的有以下几个:

    1. FLAG_ACTIVITY_NEW_TASK
      当 Intent 对象包含这个标记时,系统会寻找或创建一个新的 Task 来放置目标 Activity,寻找时依据目标 Activity 的 taskAffinity 属性进行匹配,如果找到一个 Task 的 taskAffinity 与之相同,就将目标 Activity 压入此 Task 中,如果查找无果,则创建一个新的 Task,并将该 Task 的 taskAffinity 设置为目标 Activity 的 taskActivity,将目标 Activity 放置于此 Task。
      注意,如果同一个应用中 Activity 的 taskAffinity 都使用默认值或都设置相同值时,应用内的 Activity 之间的跳转使用这个标记是没有意义的,因为当前应用 Task 就是目标 Activity 最好的宿主。

    2. FLAG_ACTIVITY_CLEAR_TOP
      当Intent对象包含这个标记时,如果在栈中发现存在Activity实例,则清空这个实例之上的Activity,使其处于栈顶。

    3. FLAG_ACTIVITY_SINGLE_TOP
      当 Task 中存在目标 Activity 实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。

    6. <activity>的 Task 相关属性


    1. android:allowTaskReparenting
      这个属性用来标记一个 Activity 实例在当前应用退居后台后,是否能从启动它的那个 Task 移动到有共同 affinity 的 Task,“true” 表示可以移动,“false” 表示它必须呆在当前应用的 Task 中,默认值为 false。

    2. android:alwaysRetainTaskState
      这个属性用来标记应用的 Task 是否保持原来的状态,“true”表示总是保持,“false”表示不能够保证,默认为“false”。此属性只对 Task 的根 Activity 起作用,其他的 Activity 都会被忽略。
      默认情况下,如果一个应用在后台呆的太久例如30分钟,用户从主选单再次选择该应用时,系统就会对该应用的 Task 进行清理,除了根 Activity,其他 Activity 都会被清除出栈,但是如果在根 Activity 中设置了此属性之后,用户再次启动应用时,仍然可以看到上一次操作的界面。

    3. android:clearTaskOnLaunch
      这个属性用来标记是否从 Task 清除除根 Activity 之外的所有的 Activity,“true”表示清除,“false”表示不清除,默认为“false”。同样,这个属性也只对根 Activity 起作用,其他的 Activity都会被忽略。如果设置了这个属性为“true”,每次用户重新启动这个应用时,都只会看到根 Activity,Task 中的其他 Activity 都会被清除出栈。

    4. android:finishOnTaskLaunch
      这个属性和 android:allowReparenting 属性相似,不同之处在于 allowReparenting 属性是重新宿主到有共同 affinity 的 Task 中,而 finishOnTaskLaunch 属性是销毁实例。

    参考文章
    Activity 的 Task 以及 launchMode 研究
    Activity的task相关

    相关文章

      网友评论

          本文标题:01_Android Task 相关

          本文链接:https://www.haomeiwen.com/subject/ouyhlxtx.html