一、啓動模式介紹
啓動模式簡單地說就是Activity啓動時的策略,在AndroidManifest.xml中的<Activity>標籤的android:launchMode屬性設置;
啓動模式有4種,分別爲standard、singleTop、singleTask、singleInstance;
講解啓動模式之前,有必要先講解一下“任務棧”的概念;
任務棧
每個應用都有一個任務棧,是用來存放Activity的,功能類似於函數調用的棧,先後順序代表了Activity的出現順序;比如Activity1-->Activity2-->Activity3,則任務棧爲:
啓動模式
(1)standard:每次激活Activity時(startActivity),都創建Activity實例,並放入任務棧;
(2)singleTop:如果某個Activity自己激活自己,即任務棧棧頂就是該Activity,則不需要創建,其餘情況都要創建Activity實例;
(3)singleTask:如果要激活的那個Activity在任務棧中存在該實例,則不需要創建,只需要把此Activity放入棧頂,並把該Activity以上的Activity實例都pop;
(4)singleInstance:如果應用1的任務棧中創建了MainActivity實例,如果應用2也要激活MainActivity,則不需要創建,兩應用共享該Activity實例;
二、代碼實例
1.standard
場景描述:MainActivity點擊按鈕激活自己,但是MainActivity的引用發生改變;
效果:
AndroidManifest.xml
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" android:launchMode="standard">
MainActivity.java
- package com.xiazdong.launchmode;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- private Button standardButton;
- private TextView showView;
- private OnClickListener listener = new OnClickListener(){
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(MainActivity.this,MainActivity.class);
- startActivity(intent);
- }
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- showView = (TextView)this.findViewById(R.id.showview);
- standardButton = (Button)this.findViewById(R.id.standard);
- standardButton.setOnClickListener(listener);
- showView.setText(this.toString());
- }
- }
2.singleTop
場景描述:MainActivity自己激活自己,但是MainActivity並沒有創建實例,即引用不變;
效果:
AndroidManifest.xml
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" android:launchMode="singleTop">
MainActivity.java
- package com.xiazdong.launchmode;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- private Button standardButton;
- private TextView showView;
- private OnClickListener listener = new OnClickListener(){
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(MainActivity.this,MainActivity.class);
- startActivity(intent);
- }
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- showView = (TextView)this.findViewById(R.id.showview);
- standardButton = (Button)this.findViewById(R.id.standard);
- standardButton.setOnClickListener(listener);
- showView.setText(this.toString());
- }
- }
3.singleTask
場景描述:
MainActivity的啓動模式爲singleTask,MainActivity激活OtherActivity,然後OtherActivity激活MainActivity,發現MainActivity引用不變,然後MainActivity再次激活OtherActivity,但是OtherActivity的引用變了;
效果:
AndroidManifest.xml
- <activity
- android:name=".MainActivity"
- android:label="MainActivity" android:launchMode="singleTask">
- </activity>
- <activity
- android:name=".OtherActivity" android:launchMode="singleTask" android:label="OtherActivity"
- ></activity>
MainActivity和OtherActivity就是簡單的代碼,略;
4.singleInstance
場景描述:App1應用和App2應用分別激活SingleInstance應用的MainActivity,發現兩個應用激活後MainActivity的引用一樣;
效果:
SingleInstance的AndroidManifest.xml
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" android:launchMode="singleInstance">