Android中Activity的LunchMode引數詳解
在Android中,每個Activity有4種LaunchMode,分別是:standard、singleTop、singleTask、singleInstance,預設是standard。在AndroidManifest.xml的對應Activity中配置該引數。下面對這四種模式進行例項驗證加深理解。
設計兩個Activity,分別稱為A,B,每個Activity上面都放置兩個按鈕,一個啟動A,一個啟動B。介面如下:(上面的一行文字用來識別是在A介面還是在B介面)
此圖為A介面,B介面沒有最上一行的字。
A介面java程式碼如下:
- public class LunchModeActivityA extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button buttonActivityA = (Button) this.findViewById(R.id.buttonActivityA);
- Button buttonActivityB = (Button) this.findViewById(R.id.buttonActivityB);
- //啟動ActivityB
- buttonActivityA.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent _intentB = new Intent(LunchModeActivityA.this,LunchModeActivityB.class);
- startActivity(_intentB);
- }
- });
- //啟動ActivityA
- buttonActivityB.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent _intentA = new Intent(LunchModeActivityA.this,LunchModeActivityA.class);
- startActivity(_intentA);
- }
- });
- Log.i("LunchModeActivityA","Task:"+getTaskId()+" LunchModeActivityA onCreate.");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.i("LunchModeActivityA","Task:"+getTaskId()+" LunchModeActivityA onDestroy.");
- }
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- Log.i("LunchModeActivityA","Task:"+getTaskId()+" LunchModeActivityA onNewIntent.");
- }
- }
同理,LunchModeActivityB也類似實現,重灌上面三個方法並進行log跟蹤。
測試開始:
1.兩個Actiity的LaunchMode都為預設的standard,啟動Ap,看到輸出:
Task:11 LunchModeActivityA onCreate.
A被建立了一個例項A,並且放在了任務11中。
此時任務棧中內容為:
A
點選介面上啟動A的按鈕,看到輸出:
Task:11 LunchModeActivityA onCreate.
A再次被建立了一個新的例項A,仍然放在任務11中。
此時任務棧中內容為:
AA
點選啟動B的按鈕,
Task:11 LunchModeActivityB onCreate.
B被建立一個新的例項B,仍然放在任務11中。
此時任務棧內容為:
AAB
再啟動B,
Task:11 LunchModeActivityB onCreate.
B又被建立了一個新的例項B,仍然在任務11中。
任務棧內容為:
AABB
按Back鍵依次返回桌面,輸出依次為:
Task:11 LunchModeActivityB onDestroy.
Task:11 LunchModeActivityB onDestroy.
Task:11 LunchModeActivityA onDestroy.
Task:11 LunchModeActivityA onDestroy.
任務棧的變化次序為:
AABB
AAB
AA
A
結論:
每個Intent,都建立了一個新的Activity來響應,並且Back時是按照彈棧的順序處理的。
2.B設定為SingleTop,啟動Ap:
Task:12 LunchModeActivityA onCreate.
再啟動A:
Task:12 LunchModeActivityA onCreate.
再啟動B:
Task:12 LunchModeActivityB onCreate.
再啟動B:
Task:12 LunchModeActivityB onNewIntent.
結論:
當B不在棧頂時,仍然會建立B的新例項。
當B在棧頂時,請求啟動B的Intent並沒有觸發建立B的新例項,而是觸發了棧頂B的onNewIntent()
按Back鍵依次返回桌面,輸出依次為:
Task:12 LunchModeActivityB onDestroy.
Task:12 LunchModeActivityA onDestroy.
Task:12 LunchModeActivityA onDestroy.
結論:
雖然傳送了四次Intent,但實際上只建立了3個Activity,所以只有3次銷燬輸出。
3.B設定為SingleTask,啟動Ap:
Task:3 LunchModeActivityA onCreate.
啟動B:
Task:3 LunchModeActivityB onCreate.
啟動A:
Task:3 LunchModeActivityA onCreate.
啟動B:
Task:3 LunchModeActivityB onNewIntent.
Task:3 LunchModeActivityA destroyed.
結論:
當B已經存在時,再次請求B會觸發已經存在的B例項的onNewIntent;
並且如果B所在的任務棧上面有其他Activity,那麼其他Activity會被銷燬。
4.B設定為SingleInstance,啟動Ap:
Task:4 LunchModeActivityA onCreate.
啟動B,此時新建立了任務棧5,和先前的A並不在一個任務。
Task:5 LunchModeActivityB onCreate.
再啟動B,沒有建立新例項:
Task:5 LunchModeActivityB onNewIntent.
再啟動A,再舊的任務4中建立了A的新例項
Task:4 LunchModeActivityA onCreate.
按下Back鍵:
Task:4 LunchModeActivityA onDestroy.
看輸出和前面沒區別,但是注意介面,此時不是切換到B介面,因為此時活動任務是4,所以A被顯示了出來。
再次按下Back鍵:
Task:4 LunchModeActivityA onDestroy.
此時因為任務4已經結束,B所在的任務5成為活動任務,B的介面才被顯示出來。
總結:被該屬性表示的Activity會標記成另一個Taskid,並且該Activity的例項不會重複建立,back的時候是最後一個顯示和退出的。
相關文章
- 詳解Android中的四大元件之一:Activity詳解Android元件
- JQuery中$.ajax()方法引數詳解jQuery
- OpenCV中的findContours函式引數詳解OpenCV函式
- oracle中的processes,session,transaction引數詳解OracleSession
- ORACLE中Cursor_sharing引數詳解Oracle
- 常用的 wget 引數詳解wget
- find 命令的引數詳解
- OGG引數詳解
- ajax 引數詳解
- Android中Context、Activity、ApplicatioAndroidContextAPP
- redis配置檔案中各引數詳解Redis
- lsblk命令引數詳解
- tar命令引數詳解
- Dockerfile - 引數與詳解Docker
- 函式引數詳解函式
- Flink Checkpoint 引數詳解
- Android之Activity啟動流程詳解(基於api28)AndroidAPI
- ()Android中的Activity建立與週期Android
- ES6中rest引數詳細講解REST
- Nginx編譯引數大全 configure引數中文詳解Nginx編譯
- Oracle GoldenGate常用引數詳解OracleGo
- oracle rac 核心引數詳解Oracle
- variables_order引數詳解
- Prometheus hashmod 配置引數詳解Prometheus
- pg_settings引數詳解
- SQL*Plus Set引數詳解SQL
- Android中Activity的四種啟動方式Android
- HarmonyOS Next加解密演算法中的引數與模式詳解解密演算法模式
- 仿寫Android的ActivityAndroid
- Android Activity的基本理解Android
- Pandas read_csv 引數詳解
- Nginx 配置檔案引數詳解Nginx
- Redis日常運維-引數詳解Redis運維
- expdp/impdp 詳細引數解釋
- ansible.cfg 配置引數詳解
- curl常用引數詳解及示例
- plt.figure()引數使用詳解
- 選購交換機的引數依據和主要的引數指標詳解指標
- caffe網路各層引數詳解