什么是启动模式呢?
我们的Activity是由系统创建的,我们编写xxxActivity直接或者间接继承自Activity,然后我们是没有自己创建的,只是配置了一下即可。
Activity由系统创建启动的时候,有几种模式,我们把这几种模式叫做Activity的启动模式。
Activity启动模式有那些呢?
在android中,Activity的启动模式有四种,分别是:
– standard,标准模式 – singleTop,单一栈顶模式 – singleInstance,单例模式 – singleTask,单任务模式
接下来,我们会通过代码和图例的形式来学习一下启动模式,已及启动模式的应用场景。
正文开始
Activity从它的架构和设计上来说,是非常优秀的想法,流行于大多数的移动操作系统中。不管怎么样,Activity不仅仅是只跑界面这么简单,它是怎么加载的也是非常值得我们去研究一下的。
在这篇文章里头会有很多内容,其中最重要的就是加载模式(LaunchMode)这个就是我们今天重点讨论的话题了。
每个Activity获取它有不同的作用,多数情况下,我们使用标准的启动模式即可,但是有些特殊情况,比如说,我的主界面只能有一个,不管是谁启动我这个主界面,它在栈里就只有一个实例,这种情况下,我们就需要把这个Activity的启动模式设置成singleInstance了。
如何指定Activity的启动模式呢?
最基本最直接的方式就是直接修改AndroidManifest.xml里的属性配置即可,比如说:
前面我们知道,有且仅有四种启动模式,让我们一个一个地来看吧!
Standard标准模式
标准启动模式,也是默认的启动模式。
如果在AndroidManifest.xml文件里设置了这个启动模式(其实可以不设置,默认就是这个启动模式),每开启一个被设置的Activity,就会创建新的对象。
验证代码:
第一个Activity去启动一个新的Activity,这个Activity每1秒钟就启动一下新的Activity,启动5个就完事了。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private int time = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
if (time < 5) {
startActivity(new Intent(MainActivity.this, NewActivity.class));
Log.d(TAG, "start new activity...");
time++;
handler.postDelayed(this, 1000);
}
}
});
}
}
第二个界面的代码如下,做了一个小动作,就是每个界面的创建,就会设置一下随机的背景颜色。
/**
* Created by TrillGates on 2018/2/2.
*/
public class NewActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);
RelativeLayout container = (RelativeLayout) this.findViewById(R.id.container);
Random random = new Random();
int colorValue = random.nextInt();
container.setBackgroundColor(colorValue);
}
}
把NewActivity的启动模式设置成standard,不设置也可以,因为默认就是这个启动模式。
<activity
android:name=".NewActivity"
android:launchMode="standard"
android:theme="@style/AppTheme"/>
然后我们把这个应用跑起来,看现象:
以上动图,需要重新开始看哈,是这样子的。首先是点击打开,从上面的代码我们知道。一打开以后,第一个Activity就会每一秒打开一个新的Activity,打开5个。然后我点击了返回键,也就是关闭当前的Activity,可以发现我们一直关闭了5个界面才回到开始的hello界面,这个过程的动作是怎么样的呢?
它是这么进入任务站的:
也就是逐个创建进入任务栈,当我们点击返回键的时候呢? 就变成这样子了:
基本的启动模式,是最简单的,也是最常用的。在栈里的顺序是先进后出,后进先出。由于画图的原因,我们应该理解为这个栈为一个箱子,只有顶部的出口。
SingleTop模式
具体演示请看视频吧,singleTop的意思则是如果要 启动的任务已经在栈的顶部了,则不会再去创建新的任务,也就是说,假设ActivityB是singleTop,当前栈顶已经是ActivityB了,则不会去创建ActivityB。
使用场景:如果这个任务是比较被动的,比如说,浏览器的收藏夹,可以被javaScript的代码控制,比如说通知,可以被拉起来的这些,比较被动的任务,则使用SingleTop模式,防止被多次创建。如果已经在顶部了,或者我们可以理解为已经聚焦了,就没必要再创建了。
SingTask模式
singTask,是会保证在这个栈里,只有一个目标任务。假设说,我们生命了ActivityB为singleTask,那么在任务栈里,只有一个ActivityB。当我们要打开ActivityB时有以下两种情况:
第一种情况:任务栈里没有,就创建,放在栈顶。
第二种情况:任务栈里有这个ActivityB,则不会创建,并且把ActivityB以上的任务,全部出栈,保证ActivityB在顶部。
使用场景:假设我们这个任务,要占比较多的内存开销,就会使用SingleTask的模式来保证它在栈里只有一个。
SingleInstance模式
这个SIngleInstance牛逼,比前面三种模式都牛逼。
SingleInstance模式怎么牛逼呢?前面三种模式,都是在同一个任务栈里的,但是这个SingleInstance自己独占一个任务栈,创建谁就把谁直接放到程序最前面。