在了解Activiry的四种加载模式之前,先得对栈有一定得理解,在这里不再花篇幅去介绍栈。首先介绍下为何要制定加载模式

一:为什么要为Activity指定加载模式

Android用Task来管理Activity栈,每创建一个Activity就会新建一个TASK栈或者添加到现有得Task栈中。这取决于你要以何种方式来管理Activity,这里就不得不引用加载模式了


二:Activity得四种加载模式

standard:  标准模式,也是默认模式

singleTop: Task栈顶单例模式

singleTask:Task栈内单例模式

singleInstance:全局单例模式

(1)standard:默认模式

这种模式只会有一个Task栈,并且这个Task栈会在创建第一个Activity得创建,之后创建的每一个Activity都会添加到Task栈中(即使这个新建的Activity与当前Activity一摸一样),

举个例子:

public class MainActivity extends Activity {
    private Button btn;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //随便定义一个xml布局文件,该布局文件包含一个Button部件用于测试
        setContentView(R.layout.text_layout);
        btn = (Button) findViewById(R.id.btn);
        System.out.println("Activity is :"+this.toString()
         + "  TaskID is :"+this.getTaskId());

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                //启动自己
                intent.setClass(MainActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });
    }
}



启动该程序,点击按钮,可以发现输出的TaskID总是相同的,加载效果如下图所示

android activity 加载fragment 并导航_ide



(2):singleTop模式

与Standard模式基本相似,但是有一点不一样:当要启动的Activity已经位于栈顶的时候,不会再重新创建该Activity实例

(3):singleTask模式

一个Activity有且最多只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。

如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

所以应用分为三种情况:

1,创建的Activity不存在,系统会创建Activity的实例放入栈顶

2,Activity存在且位于栈顶,系统不会做处理

3,Activity存在且不在栈顶,这个时候系统会清除位于该Activity上面的所有Activity实例,并将该Activity置于栈顶

(4):singleInstance模式

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

应用情况:

1,该Activity不存在,则系统会为该Activity新建一个Task,并将该Activity置于栈顶,并且该Task不会再添加其它Activity实例

2,该Activity已经存在,系统会把该Activity所在的Task转到前台,让该Activity显示


三:Activity的具体加载方法

前面描述了所有的加载模式,但却没有告诉我们如何去设置Activity的加载模式

这里举例有一个Activity为ActivityA,需要将其设置为standard加载模式,则代码为:

<activity android:name=".ActivityA"
            android:launchMode="standard"/>