Activity 启动方式

一、四种启动方式

Standard

默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

SingleTop

可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。

SingleTask

只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

SingleInstance

只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

二、使用方法

在清单文件中设置

android:launchMode="singleTop"

在Intent中添加Flag指定启动模式,比如在Service启动Activity时需要用到这种方式

        Intent intent = new Intent();
        intent.setClass(context, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);

注意动态设置要比静态设置优先级要高
Flag的对应关系

Flag 清单文件 属性说明
FLAG_ACTIVITY_NEW_TASK SingleTask 作用是为Activity指定 “”启动模式。跟在AndroidMainfest.xml指定效果同样
FLAG_ACTIVITY_SINGLE_TOP SingleTop 作用是为Activity指定 “”启动模式,跟在AndroidMainfest.xml指定效果同样。
FLAG_ACTIVITY_CLEAN_TOP SingleTask 具有此标记位的Activity,启动时会将与该Activity在同一任务栈的其他Activity出栈。一般与SingleTask启动模式一起出现。它会完毕SingleTask的作用。但事实上SingleTask启动模式默认具有此标记位的作用
FLAG_ACTIVITY_NO_HISTORY 使用该模式的Activity在启动其他Activity后变会自动销毁
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS android:excludeFromRecents="trure" 具有此标记位的Activity不会出如今历史Activity的列表中,使用场景:当某些情况下我们不希望用户通过历史列表回到Activity时,此标记位便体现了它的效果

三、应用场景

SingleTask

最常见的应用场景就是保持我们应用开启后仅仅有一个Activity的实例。最典型的样例就是应用中展示的主页(Home页)。

假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了

SingleTop

假设你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,能够降低Activity的创建,节省内存!

//使用SingleTop页面传值可以使用这种方法。
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);//设置新的intent
        init();//初始化动作
    }

四、参考

Activity启动模式与任务栈(Task)全面深入记录(上)
Activity启动模式与任务栈(Task)全面深入记录(下)

你可能感兴趣的:(Activity 启动方式)