美文网首页CoderTaskAndroid知识Android技术知识
Activity启动模式(launchMode)详解

Activity启动模式(launchMode)详解

作者: XiMiMax | 来源:发表于2017-07-23 12:06 被阅读708次

    原创作品,转载请注明出处O

    Activity 的启动模式有四种,standard、singleTop、singleTask、singleInstance.

    image.png

    1.standard

      standard是Activity默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种启动模式。
      每次启动都一个新的Activity位于栈顶。
      android:launchMode="standard",此时每次点击按钮都会创建新的Activity
    

    现在,我们写一个简单的按钮 ,实现跳转Activity

        private Button button;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Log.e("MainActivity",this.toString());
            button = (Button)findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MainActivity.this, MainActivity.class);
                    startActivity(intent);
                }
            });
        }
    

    虽然跳转的页面相同,但是在Task中每点一次按钮就会创建一个新的Activity


    Activity创建日志 启动示例图

    2.singleTop

    当Activity的启动模式为singleTop时,当启动的Activity已经处于Activity栈顶时,则直接使用。
    android:launchMode="singleTop"  
    

    我们创建NextActivity,并且在MainActivity中添加button2

        private Button button1,button2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Log.e("MainActivity", this.toString());
            button1 = (Button) findViewById(R.id.button1);
            button2 = (Button) findViewById(R.id.button2);
            button1.setOnClickListener(this);
            button2.setOnClickListener(this);
    
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.button1:
                    Intent intent = new Intent(MainActivity.this, MainActivity.class);
                    startActivity(intent);
                    break;
                case R.id.button2:
                    Intent intent2 = new Intent(this, NextActivity.class);
                    startActivity(intent2);
                    break;
            }
        }
    

    此时在MainActivity中启动MainActivity,则Activity栈中只会创建一次;但是先启动NextActivity之后再启动MainActivity,则会创建新的MainActivity,因为此时的Activity栈顶是NextActivity

    MainActivity ->MainActivity ->MainActivity MainActivity -> NextActivity -> MainActivity 启动示例图

    3.singleTask

    当活动的启动模式为singleTask时,启动该Activity会现在栈中检查是否已存在,若存在则直接将该活动之上的Activity全部出栈。
    android:launchMode="singleTask"
    
    启动示例图

    4.singleInstance

    singleInstance模式下会有一个单独的返回栈来管理活动。不管哪个应用程序来访问该活动,都共用同一个栈,这样就可以允许其他程序调用,实现共享该活动。
    android:launchMode="singleInstance"
    
    启动示例图
    图中启动的过程是:Main -> New -> Next 这个过程很容易看懂
         返回过程是:Next -> Main -> New 
    

    明显看出顺序不一样,为什么会出现这种情况呢?

    NextActivity和MainActivity处于同一个栈,当我们返回时,NextActivity出栈,此时栈A中还存在MainActivity,并且处于栈顶,所以会看到MainActivity.
    当MainActivity执行返回时,栈A会清空,然后我们就看到了位于栈B的NewActivity。
    之后NewActivity出栈,栈B也为空时,App退出。
    

    Activity的启动模式简单介绍到这里, 希望对您有所帮助,有不足或者错误的地方请指正。

    每星期至少一篇跟新本系列,感兴趣可以关注。

    一起学习,一起进步。

    demo下载内附APK链接:https://pan.baidu.com/s/1dFakVPf 密码:adti

    相关文章

      网友评论

      本文标题:Activity启动模式(launchMode)详解

      本文链接:https://www.haomeiwen.com/subject/fseukxtx.html