Back Stack
1.当前activity启动另一个新的activity时,新的activity进入栈顶,之前的activity状态变为stopped,但是它的user interface被系统保存。当点击back按钮时,当前activity出栈被销毁,之前的activity进行resume。
2.当所有的activity都出栈后,back stack为空,task被销毁。
3.当点击home按钮时,当前task会被转移至后台保存,task中所有activity处于stopped状态。当从applicaton launcher再次启动该应用时,会继续此task。
4.当task过多时,可能会被系统销毁。
5.由于back stack栈不会被重排,因此当一个特殊的activity被从不同activity中启动时,会被多次实例化时,那么它们在back stack栈中会独立的存在,而不会被替换。
6.当一个activity所在的task被移至后台或者有新的activity启动时,如果内存不足,此activity可能被系统destory。此时,切换至此task,或点击back按钮返回至此activity时,系统必须recreate这个activity,将会造成此activity内的数据丢失。为避免此现象,应该在activity中继承 onSaveInstanceState()这一回调方法来主动保存activity。
7.通过Intent的flag指定的activity mode比在manifest中指定的mode优先级更高。
Defining launch modes
Using the manifest file
1."standard"
系统将在此activity启动的task中创建一个新的activity的实例,此activity可以被实例化多次,每个实例可以隶属于不同的task,每个task可以拥有多个该activity的实例。
2."singleTop"
如果此activity当前处于task中back stack的栈顶,那么再次实例化该activity时,系统不会新建实例,而是会将intent指向已存在的实例。
同样,此activity可以被实例化多次,每个实例可以隶属于不同的task,每个task可以拥有多个该activity的实例。只是当其已经存在于某个task的栈顶时,不会在此task中新建该activity的实例。
一个activity实例化完成之后,即可以通过点击back按钮回到上一个activity的实例。但是当一个已存在的实例处理intent时,在onNewIntent()
中的新的intent到达之前,不能点击back按钮回到此activity之前的实例。
3."singleTask"
系统会新建一个task来存储该activity的实例,并将其作为root activity。但是如果这个activity的实例已经存在于其他task中,那么系统会将intent转到那个task中的那个实例。
尽管此activity在一个新的task中,在此activity中点击back按钮,还是会回到这个activity之前的acitiviy中。
如果此activity的实例已经存在于某一个task中,那么整个task都会被调至前台运行,并且此activity的实例处于栈顶位置。
4."singleInstance"
与singleTask不同的是,保存此activity的task不会再保存其他activity实例。这种类型的activity的实例永远各自独占一个task。
Using Intent flags
1.FLAG_ACTIVITY_NEW_TASK
与singleTask作用一致
2.FLAG_ACTIVITY_SINGLE_TOP
与singleTop作用一致
FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK 经常一起使用,用来定位到其他task中已经存在的该activity的实例,并且将将其置于能够接受intent的位置。
下图中的需求需要 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_SINGLE_TOP 搭配使用,因为activity默认的mode是standard,那么只使用FLAG_ACTIVITY_CLEAR_TOP时,虽然将A
置于栈顶,但是是新建了一个A的实例替换掉了原来的A的实例。加上FLAG_ACTIVITY_SINGLE_TOP 则仍沿用原来的实例。
Handling affinities
当没有设置某activity的android:taskAffinity="string"时,此activity会继承application的affinity。
affinity在以下两种情况下起作用:
2. android:allowTaskReparenting
决定一个activity是否可以从它start的task移动到它具有affinity的task中。
根据定义,一个root activity总是处于相同affinity的task中。由于mode设定为singleTask和singleInstance的activity只能作为root activity而存在,因此re-parenting只对mode类型为
standard和singleTop的activity有效。
Starting a task
singleTask 和 singleInstance 只能用于带有ACTION_MAIN和CATEGORY_LAUNCHER filter的activity
版权声明:本文为博主原创文章,未经博主允许不得转载。