在了解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总是相同的,加载效果如下图所示
(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"/>