android任务栈

taskAffinity属性

  • TaskAffinity参数标识着Activity所需要的任务栈的名称,默认情况下,一个应用中所有Activity所需要的任务栈名称都为该应用的包名。
  • TaskAffinity 属性一般跟singleTask模式或者跟allowTaskReparenting属性结合使用
    • 测试了下只有singleTasksingleInstance有效果
  • TaskAffinity属性的值应该与当前应用包名相同,否则就没意义了

测试代码,清单文件

<activity android:name=".test.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".test.ActivityA"
                  android:launchMode="singleTask"
                  android:taskAffinity="com.zejian.singleTask.affinity"
            />

通过命令:adb shell dumpsys activity activities可看出效果

allowTaskReparenting属性

它的主要作用是activity的迁移,即从一个task迁移到另一个task,这个迁移跟activity的taskAffinity有关。当allowTaskReparenting的值为“true”时,则表示Activity能从启动的Task移动到有着相同affinity值的Task。当allowTaskReparenting的值为“false”,表示它必须呆在启动时呆在的那个Task里。

默认的值是false

清理任务栈

长时间离开任务,则系统会清除所有 Activity 的任务,根 Activity 除外。 当用户再次返回到任务时,仅恢复根 Activity。系统这样做的原因是,经过很长一段时间后,用户可能已经放弃之前执行的操作,返回到任务是要开始执行新的操作。

但是可以修改这种默认行为

android:clearTaskOnLaunch

android:finishOnTaskLaunch

和android:clearTaskOnLaunch类似,但是区别在于finishOnTaskLaunch只作用于自己,而不会影响其他的activity。

android:alwaysRetainTaskState

如果任务中的根activity中设置了true,则不会出现上面的清理行为,即时很长时间,任务仍将所有的activity保留在堆栈中。

此属性只能对task中的根activity起作用,其他的activity则会被忽略。

场景:

如果一个应用在后台呆的太久例如30分钟,用户从主选单再次选择该应用时,系统就会对该应用的task进行清理,除了根Activity,其他Activity都会被清除出栈,但是如果在根Activity中设置了此属性之后,用户再次启动应用时,仍然可以看到上一次操作的界面。 这个属性对于一些应用非常有用,例如Browser应用程序,有很多状态,比如打开很多的tab,用户不想丢失这些状态,使用这个属性就极为恰当。

results matching ""

    No results matching ""