Activity 启动模式个人见解

1,518 阅读3分钟

Android 开发中我们打交道最多的就是ActivityActivity 有四种启动模式,每一种启动模式都代表着特定的使用场合了解Activity 的启动模式,可以对我们使用Activity得心应手。

Activity Standard启动模式

standard是我们使用activity 的标准模式,大部分全部是默认standard模式,也称默认模式
代码如下,

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tv);
        tv.setText("当前activity是:" + this.toString()+"\n"+"当前TaskID:"+getTaskId());

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,MainActivity.class));
            }
        });
    }

两幅图让你清晰明了的懂

这里写图片描述

当前MainActivity实例是 3364163
当前MainActivity的TaskID是:13
我们再去启动一个当前Activity 后,
这里写图片描述

可以看到再次开启的MainActivity
实例是 436f4f9
TaskID 是 13

由此我们可以得出结论:

Standard模式下,所有的Activity全部是在一个堆栈中,每一个Activity都是一个单独的实例,当我们按返回键的时候,弹出栈顶的activity实例,然后在顶部activity下面的Activity显示出来,占据栈顶!

Activity SingleTask 启动模式

先看代码
MainActivity:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tv);
        tv.setText("当前activity是:" + this.toString()+"\n"+"当前TaskID:"+getTaskId());

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,MainActivity.class));
            }
        });

        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,BActivity.class));
            }
        });
    }

BActivity :

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.b);
        tv = (TextView) findViewById(R.id.tv);
        tv.setText("当前activity是:" + this.toString() + "\n" + "当前TaskID:" + getTaskId());

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(BActivity.this, MainActivity.class));
            }
        });

        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(BActivity.this, BActivity.class));
            }
        });
    }

步骤:

  1. 初始化MainActivity,先启动BActivity
  2. 在BActivity中启动MainActivity

此时,如果我们点击返回键,就会推出程勋,回到手机界面。

分析:
步骤1 的时候,在堆栈中产生了2个activity实例,MainActivity和BActivity ,接着去步骤2,这时候有了变化,因为堆栈中存在MainActivity实例,所以我们不会再去新创建一个新的MainActivity实例,而是把存在堆栈底部的MainActivity实例拿出来使用,那么问题来了,怎么拿出来??
很暴力的,MainActivity直接把在他上面的BActivity 弹出了堆栈,自己占据栈顶!此时,堆栈中只有MainActivity一个实例,所以按返回键,就自然退出程序了!
这里写图片描述
在配上这幅图,绝壁懂了!

Activity SingleTop 启动模式

步骤:

  1. 初始化MainActivity ,启动MainActivity 无任何变化,实例也未改变
    这里写图片描述

  2. 初始化MainActivity ,启动BActivity,在启动MainActivity
    此时MainActivity 的实例发生变化
    这里写图片描述

得出结论:

SingleTop 模式下,启动的实例如果存在栈顶,ActivityManager并不会新建一个实例,而是选 择复 用原来的实例来保持singleTop中的唯一性,只会去调用onNewIntent方法如何实例不在栈顶,那么会再次创建一个实例,堆栈中会存在两个相同的实例。
这里写图片描述

此图绝壁懂!

Activity SingleInstance启动模式

这个模式,如图
这里写图片描述

这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入

使用代码实现

    Intent i = new Intent(Intent.ACTION_MAIN)
    i.setClassName(activityInfo.applicationInfo.packageName,activityInfo.name)
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(i)

最后,说下在哪里配置启动模式
这里写图片描述

到此,Activity的四种启动模式就啰嗦完毕,理解四种模式,合理的使用,会使开发事半功倍。如果有帮到你,就多来逛逛。谢谢