Activity的启动模式

什么是启动模式呢?

我们的Activity是由系统创建的,我们编写xxxActivity直接或者间接继承自Activity,然后我们是没有自己创建的,只是配置了一下即可。

Activity由系统创建启动的时候,有几种模式,我们把这几种模式叫做Activity的启动模式。

Activity启动模式有那些呢?

在android中,Activity的启动模式有四种,分别是:

– standard,标准模式 – singleTop,单一栈顶模式 – singleInstance,单例模式 – singleTask,单任务模式

接下来,我们会通过代码和图例的形式来学习一下启动模式,已及启动模式的应用场景。

正文开始

Activity从它的架构和设计上来说,是非常优秀的想法,流行于大多数的移动操作系统中。不管怎么样,Activity不仅仅是只跑界面这么简单,它是怎么加载的也是非常值得我们去研究一下的。

在这篇文章里头会有很多内容,其中最重要的就是加载模式(LaunchMode)这个就是我们今天重点讨论的话题了。

每个Activity获取它有不同的作用,多数情况下,我们使用标准的启动模式即可,但是有些特殊情况,比如说,我的主界面只能有一个,不管是谁启动我这个主界面,它在栈里就只有一个实例,这种情况下,我们就需要把这个Activity的启动模式设置成singleInstance了。

如何指定Activity的启动模式呢?

最基本最直接的方式就是直接修改AndroidManifest.xml里的属性配置即可,比如说:

20180202_140743.png

前面我们知道,有且仅有四种启动模式,让我们一个一个地来看吧!

20180202_140917.png

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"/>

然后我们把这个应用跑起来,看现象:

launchmode.gif

以上动图,需要重新开始看哈,是这样子的。首先是点击打开,从上面的代码我们知道。一打开以后,第一个Activity就会每一秒打开一个新的Activity,打开5个。然后我点击了返回键,也就是关闭当前的Activity,可以发现我们一直关闭了5个界面才回到开始的hello界面,这个过程的动作是怎么样的呢?

它是这么进入任务站的:

launchmodestart.gif

也就是逐个创建进入任务栈,当我们点击返回键的时候呢? 就变成这样子了:

taskpopout.gif

基本的启动模式,是最简单的,也是最常用的。在栈里的顺序是先进后出,后进先出。由于画图的原因,我们应该理解为这个栈为一个箱子,只有顶部的出口。

SingleTop模式

具体演示请看视频吧,singleTop的意思则是如果要 启动的任务已经在栈的顶部了,则不会再去创建新的任务,也就是说,假设ActivityB是singleTop,当前栈顶已经是ActivityB了,则不会去创建ActivityB。

使用场景:如果这个任务是比较被动的,比如说,浏览器的收藏夹,可以被javaScript的代码控制,比如说通知,可以被拉起来的这些,比较被动的任务,则使用SingleTop模式,防止被多次创建。如果已经在顶部了,或者我们可以理解为已经聚焦了,就没必要再创建了。

SingTask模式

singTask,是会保证在这个栈里,只有一个目标任务。假设说,我们生命了ActivityB为singleTask,那么在任务栈里,只有一个ActivityB。当我们要打开ActivityB时有以下两种情况:

第一种情况:任务栈里没有,就创建,放在栈顶。

第二种情况:任务栈里有这个ActivityB,则不会创建,并且把ActivityB以上的任务,全部出栈,保证ActivityB在顶部。

使用场景:假设我们这个任务,要占比较多的内存开销,就会使用SingleTask的模式来保证它在栈里只有一个。

SingleInstance模式

这个SIngleInstance牛逼,比前面三种模式都牛逼。

SingleInstance模式怎么牛逼呢?前面三种模式,都是在同一个任务栈里的,但是这个SingleInstance自己独占一个任务栈,创建谁就把谁直接放到程序最前面。

原文地址:https://www.cnblogs.com/wcyMiracle/p/13380111.html