<activity android:name=".MainActivity" android:launchMode="standard" />
Activity的四种启动模式:
1. standard
模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
2. singleTop
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
3. singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
4. singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦该模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
http://my.oschina.net/u/1246663/blog/202272
附任务栈:
From Google官网:理解可能有错,希望被指出,谢谢啦!!
一个任务对应一个栈,栈中可能存在多个Activity
正常不做任何设置,你的Activity跳转应该是下图所示:
相同的Activity默认是会再创建一个实例,而不是复用,如下图的HomeActivity(创建了2个实例)
通常有2种方式设置Activity的启动模式:
1.在AndroidMainfest <Activity>标签中加入属性launchMode:
1.standard(默认就是这个)
2.singleTop 讨论这个前提是在一个任务中的,假设我的activity b启动模式是singleTop的,如果出现类似于a-b 然后我再启动b的时候将仍然是a-b而不是a-b-b,如果是b-a,我再启动b时,则会是b-a-b.(还是创建了一个)
3.singleTask 假设我有个activity b是singleTask模式,首先如果分离的任务中不存在b,那么将建立一个新任务,然后将b作为该任务的根,也就是在该任务的栈底,反之如果有一任务栈中已经存在b,b所在任务栈中之前的activities都将被清掉,之后的全部被带进来.
4.singleInstance 除了包含singleTask一些性质外,singleInstance还有一个重要的特点,就是它所处的任务栈中只有它一个实例。
2.设置Intent的Flag,主要有3种Flag
1.FLAG_ACTIVITY_NEW_TASK 这个作用与singleTask模式一样。
2.FLAG_ACTIVITY_SINGLE_TOP 这个作用与singleTop模式一样。
3.FLAG_ACTIVITY_CLEAR_TOP 讨论这个前提是在一个任务栈中的,假设B是以这个标志启动的,比如A-B-C-D 我在启动B最后结果将是A-B,C-D会被清掉。
关于任务的栈:
当你的任务栈被置于后台的时候,过了一定量的时间,系统会把你这个任务栈中的Activities清得只剩下根Activity,因为它认为用户已经“遗弃了”。
当然你可以修改这种默认行为,通过在<Activity>标签里加入属性:
1.alwaysRetainTaskState 这个属性加入到你根Activity上,即便你的任务在后台,系统也尽量保存你整个任务状态,当然我们这里不讨论资源紧张的时这种特殊情况。
2.clearTaskOnLaunch 这个属性加入到你根Activity上,效果于前面的相反,Task将被清光,即便离开只是一小会。
3.finishOnTaskLaunch 这个属性跟上一个类似,不过他针对是单个Activity.(没试过)
总结:
singleTask和singleInstance都会创建一个新的Task,我们使用应该只用在启动的activity有一个action Main和category launcher的时候,也就是启动另外一个程序的时候。
之所以这么说是因为,假设一个任务栈A-B 然后B启动C的时候使用singleTask,C就处于一个新的任务栈中,当用户在C上操作了好长一段时间,你的A-B这个任务栈可能会被系统回收掉,那时候你再按HOME键,就会丢失了C,因为C不代表这个APP。(这个是我的理解,可能有错)。
鉴于此,如果你要使用的话,比如像C这种情况,既然我找不到了,那我就不希望它还活着,就可以在C activity标签里加入finishOnTaskLaunch.
http://my.oschina.net/wangjunhe/blog/97552