Activiity的四种启动方式(launchMode)

作者: 剑小河 | 来源:发表于2017-12-01 09:48 被阅读0次

    这个知识估计快被人写烂了,但是为了自己印象深刻,我还是要自己写一次。>.<

    注:文中cls都是Activity的class对象

    1.standard

    系统默认的启动方式,每次启都会创建一个新的Activity实例,一个任务栈允许多个该Activity实例存在,被启动的Activity自动放入启动它的Activity的任务栈,比如任务栈1中Activity A启动了Activity B,则B自动放入任务栈1

    standard.png
    AndroidManifest.xml
    <activity
    android:launchMode="standard"/>
    
    Java代码

    context是Activity实例

    Intent intent = new Intent(context,  cls);
    context.startActivity(intent);
    

    context不是Activity实例
    注意:该Activity的taskAffinity必须为默认值或者不设置

    Intent intent = new Intent(context,  cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
    

    2.singleTop

    该启动方式下,如此该Activity的没有实例在任务栈,则创建一个实例放入栈顶;如果有实例在任务栈,但不在栈顶,则再创建一个实例放入栈顶;如果有实例在任务栈,且在栈顶,则不再创建实例。

    任务栈1有A、B、C三个Activity,如果从栈底到栈顶的顺序为[A,B,C],singleTop方式启动C,则不再创建C的实例;如果从栈底到栈顶的顺序为如果从栈底到栈顶的顺序为[A,C,B],启动C,则重新创建一个C的实例,并放入栈顶[A,C,B,C]。

    singleTop.png
    AndroidManifest.xml
    <activity
    android:launchMode="singleTop"/>
    
    Java代码

    context是Activity实例

    Intent intent = new Intent(context,  cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    context.startActivity(intent);
    

    context不是Activity实例

    Intent intent = new Intent(context,  cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    context.startActivity(intent);
    

    3.singleTask

    这是一种Activity的栈内单例模式,即只要该Activity所在任务栈有一个实例存在,启动它的时候都不会再次创建。启动这个Activity的时候,如果它的任务栈里没有这个Activity的实例存在,就会创建一个实例并压入它的任务栈顶;如果它的任务栈已经存在这个Activity的实例,就会清空这个任务栈所有在该Activity前面的Activity。

    任务栈1有从栈底到栈顶的顺序为[A,B,C],singleTask方式启动D,则创建D实例,放入任务栈1[A,B,C、D]任务栈1有从栈底到栈顶的顺序为[A,B,C]singleTask方式启动B,则不创建A实例,清空A上的所有Activity,任务栈变为[A,B]

    singleTask.png
    AndroidManifest.xml
    <activity
    android:launchMode="singleTask"/>
    
    Java代码

    context是Activity实例

    Intent intent = new Intent(context,  cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(intent);
    

    context不是Activity实例

    Intent intent = new Intent(context,  cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(intent);
    

    4.singleInstance

    这是一种Activity的单例模式,拥有singleTask的所有特性,并且这种启动方式启动的Activity,系统会为它创建一个独立的任务栈,这个任务栈只允许该Activity存在。

    singleInstance.png
    这里特别说明下这种情况回退栈,三种状态对应的回退栈是:
    singleInstance回退栈.png
    橘色的是任务栈1的Activity,蓝色是任务栈2的Activity,可以看出开始回退栈是[A,B,C],也就是按返回键退出的顺序依次是C、B、A;启动D,D在前台,ABC 在后台,回退栈是[A,B,C,D];启动E,E属于任务栈1,E在前台,任务栈1也就在前台,同任务栈的A、B、C的回退栈顺序也就跟着提到了D之前,回退栈顺序也就变成了[D,A,B,C,E],按返回键退出Activity的顺序也就变成了E,C,B,A,D。
    AndroidManifest.xml
    <activity
    android:launchMode="singleInstance"/>
    
    Java代码

    context是Activity实例

    没找到
    

    context不是Activity实例

    没找到
    

    另:onNewIntent(Intent intent)

    该方法跟启动方式有关,当Activity的启动方式是singleTop、singleTask或者singleInstance时,如果不需要重创建实例,则调用已存在实例的onNewIntent(Intent intent) ,新的Intent传入onNewIntent(Intent intent)。

    相关文章

      网友评论

        本文标题:Activiity的四种启动方式(launchMode)

        本文链接:https://www.haomeiwen.com/subject/gykpbxtx.html