区分Activity的四种加载模式

转至 http://marshal.easymorse.com/archives/2950

Activity有四种加载模式
standard(默认模式)
singleTop
singleTask
singleInstance

设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
        <activity android:name="ActB" android:launchMode="singleTask"></activity>

standard:
        每次都创建了该Activity的新实例。standard的加载模式就是这样的,intent将发送给新的实例

singleTop
        singleTop和standard模式,都会将intent发送新的实例。不过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。 当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 

singleTask
        singleTask模式和后面的singleInstance模式都是只创建一个实例的。当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实 例。如果有直接将intent发送给它。 当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 

singleTask如果为启动页,在任意页点击home,返回桌面后点击应用会销毁上层Activity,
如果第二次打开singleTask,在singleTask上层的activity都会销毁
如果A应用中的singleTask已打开,B应用打开singleTask会调用onNewIntent并销毁上层Activity,点击返回会返回singleTask的下层activity,当下层activity全部销毁后才会 返回B应用
singleTask如果只在本应用中使用那么,TaskId固定。

singleInstance
        这个模式下的Activity单独在一个task栈中。这个栈只有一个Activity。
singleInstance没次启动都会在一个新的Task中,与默认的应用的TaskId不同

第二次打开singleInstance,会启动onNewIntent并且将本activity移动到最上
如果A=>B(singleInstance)=>C
A执行了finish()后A、C的TaskId不同
如果singleInstance已打开,另一个应用打开singleInstance会调用onNewIntent,点击返回会销毁activity,当前应用中也会找不到activity。
此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以 两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现 在界面还显示C的内容,不是D。



你可能感兴趣的:(android)