默认行为
1. 当Activity A启动Activity B, A stopped, 系统保存A状态。当Back pressed, 则A resumed 并恢复相关状态。
2. 当Home button pressed, 则当前activity stopped, task 进如background,系统保存每一个task的状态。当用户启动了以前开始task的app,则此task进入前台,而且恢复task栈顶的Activity。
3. 当用户点击Back, 则当前Activity会被弹出task stack 而且被destroy,系统也再也不retain其状态。
4. Activities可被实例化屡次,甚至时从其余tasks。app
当Activity stopped, 系统会默认保存其状态。当也仍是建议使用回调函数保存Activity的状态,以防止系统在内存不存进行内存回收,销毁掉进入后台的task。这种状况下,当系统再次进入该task时,系统仍然具备task链,可是在将task栈顶的Activity进行显示时,将会是从新create,而不是resume。因此应主动使用回调函数 onSaveInstanceState() 来保存Activity State。函数
Principal < activity > attributsspa
taskAffinity launchMode allowTaskReparenting clearTaskOnLaunch alwaysRetainTaskState finishOnTaskLaunch
Principal intent flags:3d
FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_SINGLE_TOP
当用A启动B时,A指定了启动B的Flag,而B也在Manifest中指定了不一样task。此种状况下,在Intent中的指定Flags将覆盖掉Manifest指定的task。rest
此外,有些launchmode 在flag中有,但在Manifest中没有,一样,在Manifest中有,flag中有。code
指定activity的launchMode属性:blog
|standard|singleTop|singleTask|singleInstance| |--- | | | | |默认的,可被实例化屡次,可分属不一样task,也可在同一task| 当要启动的Activity 存在栈顶,在该模式下,系统将把启动该Activity的Intent经过调用onNewIntent()方法将路由至栈顶的Activity实例,再也不启动的新的实例。若是要启动的Activity的实例再也不栈顶,则启动新的实例。注意:该种模式下,back button没法返回调用onNewIntent以前的状态,由于task back stack仍是保持原样。|建立新的task,实例化Activity到task的栈底。但若时此时现有task stack中已经有该Activity的实例,那么系统就不会启动新的task和实例,而是路由到该task中的Activity,并销毁task stack中在这之上的Activity,使之成为栈顶,而后将该Intent经过onNewIntent路由到Activity。 同一时刻,Activity只有一个实例。|相似于singleTask,Activity只有一个实例,而且也会时task的为一个栈元素,它启动的任何Activity都将会出如今其余的task栈中。
Android Browser就是一个使用singleTask模式的应用。
此外,对于back stack,不论Activity时被启动到一个新的task仍是在启动它的Activity所在task stack,back button均可以返回到上一个Activity。
另外,对于启动使用singleTask模式的Activity,那么系统首先按照它自己模式启动,以后会将该Activity所在的task stack总体迁移到启动它的back stack。如图所示:ip
在startActivity可指定的flag包括:
内存
FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_SINGLE_TOP | FLAG_ACTIVITY_CLEAR_TOP |
---|---|---|
与singTask属性相同 | 与singleTop相同 | 若是要启动的Activity已经存在task栈中,那么系统将会clear掉在Activity元素到task 栈顶的全部Activity,而后将Intent经过onNewIntent()传递给已经在栈顶的Activity。该flag一般和FLAG_ACTIVITY_NEW_TASK一块儿使用。 |
affinity 属性暗示了Activity更倾向加入的task。默认,同一个Application里的Activity更倾向于在同一个task里。可经过修改activity元素的taskAffinity属性。该属性的值时一个字符串,默认的为包名,所以,若是但愿倾向于启动在不一样的task,那么指定以个不一样于包名的字符串便可。ci
使用Affinity的两种状况
- 使用FLAG_ACTIVITY_NEW_TASK
当A启动B时,若指定了FLAG_ACTIVITY_NEW_TASK,那么系统首先寻找倾向的task来装载这个新的B。若是存在与B具备相同Affinity的task,则将其启动到该task,不然启动新的task。好比InCallScreen,当用户按Home离开该Activity,该如何回到该Activity,除了在launch里启动以外(若是launchMode为main的话),还能够在notification bar中显示。
- activity元素的属性allowTaskReparenting 为true,
意思就是本Appliancation中的Activity A 具备其余Application里的Activity B相同的affinity。那么在A中启动B时,B将隶属于A的task,那么在B所属的Application启动后,B将从A所属的task中经过Reparenting到B所属的Application应用。
若用户离开task 很长时间,系统将会清理task,只留下task stack的root activti。当用户重返task,只会restore root Activtiy。但几个Activity能够修改这样的行为