Android-活动的四种启动模式详解
Android有四种启动活动的模式,分别是standard,singleTop,singleTask,singleInstance,可以在manifest.xml里通过android:launchMode属性来选择启动模式。
standard模式:
这是Android默认的启动模式,在不指定的情况下都是默认该模式,该模式不会检查返回栈里是否包含该活动,而是直接创建新的活动,从下面的例子可以看出:
package com.zgh.leo.launchmodedemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("MainActivityByLeo", this.toString());
button=findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
}
我们在MainActivity里启动三次MainActivity,日志会打印不同的内存地址,也就是说创建了三个不同的活动。
2019-01-19 09:34:07.457 /com.zgh.leo.launchmodedemo.MainActivity@e44583d
2019-01-19 09:34:15.024 /com.zgh.leo.launchmodedemo.MainActivity@2856b89
2019-01-19 09:34:17.925 /com.zgh.leo.launchmodedemo.MainActivity@1e4b7d9
如果想退出应用,需要按三次返回键,依次销毁三个活动。
singleTop:
我们修改MainActivity的启动方式为singleTop,其他代码不变,重新运行,不论点击多少次按钮,日志只有一条,也就是说只创建了一个活动,该模式会检查返回栈的栈顶是否存在该活动,若存在,则不创建新活动。
2019-01-19 09:45:47.212 /com.zgh.leo.launchmodedemo.MainActivity@86df17c
singleTask:
我们修改MainActivity的启动方式为singleTask,其他代码不变,重新运行,该模式会检查整个返回栈中是否存在该活动,如果存在则直接调用,并不会生成新的活动。
2019-01-19 10:07:25.927 / com.zgh.leo.launchmodedemo.MainActivity@86df17c
2019-01-19 10:07:32.448 /com.zgh.leo.launchmodedemo.SecondActivity@bef1b04
2019-01-19 10:07:35.611 / D/MainActivityByLeo: onRestart:
2019-01-19 10:07:38.838 / D/SecondActivityByLeo: onDestroy:
singleInstance:
在该模式下,会启动一个新的返回栈来管理该活动。修改SecondActivity启动模式为singleInstance,新建一个ThirdActivity,首先在MainActivity里启动SecondActivity,然后在SecondActivity里启动MainActivity,最后分别在每个Activity的onCreate方法里打印返回栈的id。
可以看出, MainActivity、MainActivity是属于同一个返回栈的,而SecondActivity是单独的一个返回栈。
2019-01-19 10:23:06.058 6259-6259/com.zgh.leo.launchmodedemo D/MainActivityByLeo: 88
2019-01-19 10:23:14.519 6259-6259/com.zgh.leo.launchmodedemo D/SecondActivityByLeo: 89
2019-01-19 10:23:21.177 6259-6259/com.zgh.leo.launchmodedemo D/ThirdActivityByLeo: 88
演示源码:https://download.csdn.net/download/qq_41113081/10927171