参考文献:https://www.jianshu.com/p/b4472dc6911e

、standard
如果不在AndroidManifest中指定启动模式即默认为standard
特征:每次打开activity都会在栈顶新建一个实例
测试代码:
在mainactivity上设置一个button,点击button会跳转到secondactivity;
在secondactivity上再设置一个button2,点击button2,还是跳到secondactivity

secondactivity:

public class Main2Activity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("SecondActivity",this.toString()); //每次创建secondactivity后打印实例信息
        setContentView(R.layout.activity_main2);

        Button button = (Button)findViewById(R.id.button_3);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intentt = new Intent(Main2Activity.this, Main2Activity.class);
                startActivity(intentt);
            }
        });
    }
}

结果是每点击一次button2都会打印一个新的活动实例信息,退出时也是会打开多少页面就依次退出。

二、SingleTop
特征:如果在栈顶直接复用,如果不在栈顶则新建一个实例
在androidmanifest注册

<activity android:name=".Main2Activity"
            android:launchMode="singleTop">

结果为在secondactivity页面上的button2点击打开secondactivity时,点击多次都不会新建实例,退出当前页面也不用退出多次;但是如果退到mainactivity,再点击button打开secondactivity时会新建一个实例,因为此时secondactivity不在栈顶了。

退回四次到mainactivity:
图片说明

三、singleTask
由于SingleTop情况下如果活动不在栈顶,还是会创建新的实例,为了避免这一情况,引入singletask
特征:如果要打开的活动已经存在在栈中,则直接打开,并把栈中位于此实例之上的活动全都清除;否则新建实例

代码验证:首先将mainactivity和secondactivity的启动模式都设置为singletask

secondactivity:

public class Main2Activity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("SecondActivity",this.toString());
        setContentView(R.layout.activity_main2);

        Button button = (Button)findViewById(R.id.button_3);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intentt = new Intent(Main2Activity.this, MainActivity.class);
                startActivity(intentt);
            }
        });

    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.d("SecondActivity","onDestroy");
    }
}

mainactivity中加入:

    protected  void onRestart(){
        super.onRestart();
        Log.d("MainActivity","onrestart");
    }

结果就是如果进了secondactivity再退回mainactivity,再点击button进入secondactivity,日志里会打印两条不一样的实例信息,这是因为退出secondactivity再创建时,栈内是没有secondactivity的实例的,只能重新创建;

但是如果从secondactivity的button2进入mainactivity,此时mainactivity位于栈中且在secondactivity之下,所以secondactivity会被直接kill掉,mainactivity就到了栈顶,当打开mainactivity后再点击button进入secondactivity时,由于栈内没有就会新建一个。

于是这一过程logcat中显示的日志是这样:
图片说明
每次从栈中调起mainactivity时回调onRestart
图片说明

由于SingleTask模式不会重复创建,所以如果要退出活动也只需要退出一次

四、singleInstance
特征:此模式下的活动会另外开启一个task来存放,有且仅有这一个活动
新建一个可以从secondactivity跳转过去的ThirdActivity,并分别在三个活动的onCreat方法中打印输出TaskID

当secondactivity的启动模式为singleInstance,其他两个活动为默认的standard时,可以从logcat里看到活动2的taskid和活动13的不一样,需要注意的一个场景是:当从活动3退出时,会直接跳到活动1,这是因为活动3从栈顶移除后,同一栈中的活动1处于栈顶,于是先显示活动1;当从活动1退出时,由于当前task已空,则回跳到活动2所在的task显示活动2

当secondactivity和thirdactivity的启动模式都是singleInstance时:
图片说明
可以看到活动2和3都是分别被存放在两个task里,验证了这一模式的概念。