2.5.1 standard
默认的启动模式。零碎不关怀这个流动是否曾经在返回栈中存在,每次启动都会创立该流动的一个新的实例。
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("FirstActivity", this.toString()); setContentView(R.layout.first_layout); Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在 FirstActivity 流动中启动 FirstActivity 流动 Intent intent = new Intent(FirstActivity.this, FirstActivity.class); startActivity(intent); } });}
2.5.2 singleTop
在启动流动时如果返回栈的栈顶曾经是该流动,则间接应用,不创立新的流动实例。
# app/src/main/AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.activitytest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".FirstActivity" android:launchMode="singleTop" #指定流动启动模式 android:label="This is FirstActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
但如果该流动不是位于返回栈的栈顶,还是会创立新的流动实例。
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("FirstActivity", this.toString()); setContentView(R.layout.first_layout); Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在 FirstActivity 流动中启动 SecondActivity 流动 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); } });}
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("SecondActivity", this.toString()); setContentView(R.layout.second_layout); Button button2 = (Button) findViewById(R.id.button_2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在 SecondActivity 流动中启动 FirstActivity 流动,会创立一个新的 FirstActivity Intent intent = new Intent(SecondActivity.this, FirstActivity.class); startActivity(intent); } }); }
2.5.3 singleTask
每次启动该流动时零碎会在返回栈中查看是否存在该流动的实例,如果曾经存在则间接应用该实例,并把这个流动之上的所有流动出栈,如果不存在则创立一个新的流动实例。
# app/src/main/AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.activitytest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".FirstActivity" android:launchMode="singleTask" #指定流动启动模式 android:label="This is FirstActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("FirstActivity", this.toString()); setContentView(R.layout.first_layout); Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在 FirstActivity 流动中启动 SecondActivity 流动 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); } });}@Overrideprotected void onRestart() { super.onRestart(); Log.d("FirstActivity", "onRestart");}
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("SecondActivity", this.toString()); setContentView(R.layout.second_layout); Button button2 = (Button) findViewById(R.id.button_2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在 SecondActivity 流动中启动 FirstActivity 流动,不会创立一个新的 FirstActivity,而是复用旧的流动,触发 FirstActivity 的 onRestart 和本流动的 onDestory Intent intent = new Intent(SecondActivity.this, FirstActivity.class); startActivity(intent); } });}@Overrideprotected void onDestory() { super.onDestory(); Log.d("SecondActivity", "onDestory");}
2.5.4 singleInstance
为流动实例创立独自的返回栈,该流动位于新的返回栈中,其余流动位于原返回栈中。
<activity android:name=".SecondActivity" android:launchMode="singleInstance"> #指定流动启动模式 <intent-filter> <action android:name="com.example.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.example.activitytest.MY_CATEGORY" /> </intent-filter></activity>
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("FirstActivity", "Task id is " + getTaskId()); setContentView(R.layout.first_layout); Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在 FirstActivity 流动中启动 SecondActivity 流动 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); } });}
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("SecondActivity", "Task id is " + getTaskId()); setContentView(R.layout.second_layout); Button button2 = (Button) findViewById(R.id.button_2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在 SecondActivity 流动中启动 ThirdActivity 流动 Intent intent = new Intent(SecondActivity.this, ThirdActivity.class); startActivity(intent); } });}
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("ThirdActivity", "Task id is " + getTaskId()); setContentView(R.layout.third_layout);}
后果是:FirstActivity 和 ThirdActivity 位于同一个返回栈中,SecondActivity 独立寄存在新的返回栈中。
流动启动程序:FirstActivity -> SecondActivity -> ThirdActivity
流动退出程序:ThirdActivity -> FirstActivity -> SecondActivity -> 程序退出。