activity的 android:launchMode属性
standard:标准模式,默认
singleTop: Task栈顶复用模式
singleTask: task栈内复用模式
singleInstance:全局单例模式
Activity是由任务栈管理的,每启动一个activity,就会被放入栈中,按返回键,就会从栈顶移除一个activity。
下面是示例代码
//Activity
package com.mall.testactivity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class AActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aactivity);
Log.v("AActivity","--onCreate----");
Log.v("AActivity","taskId"+getTaskId()+",hash:"+hashCode());
logTaskName();
Button jumpToAActivity=findViewById(R.id.jumpToAActivity);
jumpToAActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(AActivity.this,AActivity.class);
startActivity(intent);
}
});
Button jumpToBActivity=findViewById(R.id.jumpToBActivity);
jumpToBActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(AActivity.this,BActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.v("AActivity","--onNewIntent----");
Log.v("AActivity","taskId"+getTaskId()+",hash:"+hashCode());
logTaskName();
}
private void logTaskName(){
try {
ActivityInfo info= getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
Log.d("AActivity",info.taskAffinity);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
//Bactivity
package com.mall.testactivity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class BActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bactivity);
Log.v("BActivity","--onCreate----");
Log.v("BActivity","taskId"+getTaskId()+",hash:"+hashCode());
logTaskName();
Button jumpToAActivity=findViewById(R.id.jumpToAActivity);
jumpToAActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(BActivity.this,AActivity.class);
startActivity(intent);
}
});
Button jumpToBActivity=findViewById(R.id.jumpToBActivity);
jumpToBActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(BActivity.this,BActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.v("BActivity","--onNewIntent----");
Log.v("BActivity","taskId"+getTaskId()+",hash:"+hashCode());
logTaskName();
}
private void logTaskName(){
try {
ActivityInfo info= getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
Log.d("BActivity",info.taskAffinity);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
standard是默认的启动模式,即标准模式,每启动一个Activity,都会创建一个新的实例。默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中,永远不会调用onNewIntent()。
singleTop
当要启动的目标acitvity已经位于栈顶,不会创建新的实例,会复用栈顶的activity,并且其onNewIntent()方法会被调用,如果目标Activity不在栈顶,则跟standard一样创建新的实例。
singleTask
在同一个任务栈中,如果要启动的目标Activity已经在栈中,则会复用该Activity,并调用其onNetIntent()方法,并且该Activity上面的Activity会被清除,如果栈中没有,则创建新的实例。
signleInstance
全局复用,不管哪里栈,只要存在目标activity,就复用,每个activity占有一个新的Task栈。