Activity启动模式(launchMode)详解

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


(原文链接:https://www.jianshu.com/p/103ab3830bc1)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值