Task:用户角度看到的一系列activities,默认每start一个activity产生一个instance,改变的方式有两种:两者冲突以intent中的flag为准
1、设置<activity>中的launchMode属性:singleTop、singleTask、singleInstance的activity都需要重写onNewIntent()方法。
singleTop:task的top的activity不能重复。
singleTask:该activity在任意时刻都只有一个实例,并作为该task的root activity。eg:浏览器。
singleInstance:除singleTask的特性外,该task中有且仅有该activity;被该activity启动的activity放到其他task中。
singleTask和singleInstance的activity必须同时有<intent-filter ... >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>,否则task没有入口恢复。
2、设置Intent中的flag:FLAG_ACTIVITY_NEW_TASK==singleTask, FLAG_ACTIVITY_SINGLE_TOP==singleTop, FLAG_ACTIVITY_CLEAR_TOP清空back stack中该activity之上的activity。
Back stack:Task中一系列activity构成的回退栈。没有到Home activity就可继续回退。
Affinity亲和力:定义activity倾向于哪个task。默认在同一个app中的activity倾向于在一个task中。<activity>中的taskAffinity属性用一个唯一字符串标识亲和力(默认是app的包名),FLAG_ACTIVITY_NEW_TASK将新的activity放到有相同affinity的task中。
每个task有一个唯一的affinity标识,默认是可launch得app包名。
<activity>中的allowTaskReparenting="true"时,当有相同affinity的task移到前台时,activity可从启动的task移到该task。
用途:apk中从用户角度看有多个app,可以用affinity区分不同app的activity。
离开task再返回时发生的行为:默认task退到后台很长时间后,系统只保留root activity,清空其它activities。如果task中的root activity设置alwaysRetainTaskState="true"则保留所有activity;相反如果task中的root activity设置clearTaskOnLauch="true"则task返回时清空除root activity外所有其它activity;finishOnTaskLauch="true"作用于所有activity,task返回时清空该activity。