• 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自己独占一个任务栈,创建谁就把谁直接放到程序最前面。

  • 相关阅读:
    学用 TStringGrid [8] 字体列表
    学用 TStringGrid [6] Options
    学用 TStringGrid [5] FixedCols、FixedRows、Color、FixedColor
    学用 TStringGrid [4] ColWidths、RowHeights
    Delphi 的字符及字符串[6] Char(AnsiChar)、WideChar 与其编码的相互转换
    学用 TStringGrid [2] DefaultColWidth、DefaultRowHeight、Col、Row
    学用 TStringGrid [3] Cols、Rows
    动画演示 Delphi 2007 IDE 功能[5] 虚拟屏幕
    js string format
    jquery select(列表)的操作(取值/赋值)
  • 原文地址:https://www.cnblogs.com/wcyMiracle/p/13380111.html
Copyright © 2020-2023  润新知