活动的四种启动模式
standard
standard是活动默认的启动模式,在不进行明确指定的情况下。所用活动都会自动的使用该模式启动。
在该模式下,每当启动一个新的活动,他就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
Log.d(TAG, this.toString());
button1=findViewById(R.id.start_btn);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(StartActivity.this,StartActivity.class);
//此处跳转的是当前的活动,便于研究standard
startActivity(intent);
}
});
}
如上图显示,连续点了两次跳转,每点击以此跳转按钮都会创建一个新的实例,此时返回栈也会存在三个实例,因此需要三次back键才能退出程序
singleTop
在启动活动时,若返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的实例,不过当该活动不在栈顶时还是会创建一个新的实例的。
可在AndroidManifest.xml中修改活动的启动模式,如下:
<activity android:name=".ActivityStart.StartActivity"
android:launchMode="singleTop">
singleTask
当活动的启动模式为singleTask时,每次启动活动时,都会在返回栈中先检查是否存在该活动的实例,如果发现存在,则会直接使用该实例,不会再另外创建实例,并把该活动之上的所有活动统统出栈,如果没有发现会创建一个新的实例
singleInstance
singleInstance不同与其他模式,singleInstance模式会启动一个新的返回栈来管理这个活动(如果singleTask模式指定了不同的taskAffity,也会启动一个新的返回栈)
假如我们的程序有一个活动是允许其他程序调用的,使用该模式可以实现其他程序和我们的程序共享这个活动的实例。不管是哪个程序访问这个活动们都共用另外创建的这个返回栈。
首先设置
Start1Activity的启动模式为singleInstance,其他活动的模式还是默认
StartActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
Log.e(TAG, "this task id is" + getTaskId());//得到当前栈ID
button1=findViewById(R.id.start_btn);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(StartActivity.this,Start1Activity.class);
startActivity(intent);
}
});
}
Start1Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "this task id is" + getTaskId());//得到当前栈ID
setContentView(R.layout.activity_start1);
button1=findViewById(R.id.start_btn1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Start1Activity.this,Start2Activity.class);
startActivity(intent);
}
});
}
Start2Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "this task id is" + getTaskId());//得到当前栈ID
setContentView(R.layout.activity_start2);
button1=findViewById(R.id.start_btn2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Start2Activity.this,Start2Activity.class);
startActivity(intent);
}
});
}
AndroidManifest.xml
<activity android:name=".ActivityStart.StartActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ActivityStart.Start1Activity"
android:launchMode="singleInstance"></activity>
<activity android:name=".ActivityStart.Start2Activity"></activity>
StartActivity和Start2Activity的栈ID一致,而Start1Activity的栈ID不同