本節將以應用程序Activity 的MainActivity組件的啟動過程為例,來說明Android應用程序的根Activity組件的啟動過程,即Android應用程序的啟動過程。由于**根Activity組件代表了一個Android應用程序,因此,它一般是在一個新的進程中啟動起來的。**
在**Android系統中, 所有的Activity組件都保存在一個堆棧中**, 其中,后面啟動的Activity組件位于前面啟動的Activity組件的上面。用戶在執行一個操作時,通常需要與一系列相關的Activity組件進行交互,這些相關的Activity組件在系統的Activity堆校中用一個任務(Task )來描述。
### Activity和Acitivity調用棧
#### 任務棧
#### 參考鏈接
* [Android群英傳讀書筆記-第八章Activity與Activity調用棧分析](http://www.hmoore.net/alex_wsc/heros/156875)
* [Google官網文章任務和返回棧](https://developer.android.com/guide/components/tasks-and-back-stack.htm)
* [對應譯文翻譯](http://www.hmoore.net/alex_wsc/android/433658)
- [關于Android中任務棧的總結](http://www.hmoore.net/alex_wsc/android/433740)
以7.1 Activity組件的應用實例為例,由于ManActivity組件的android:process屬性被設置為“ `shy.luo.activity.mainprocess`”,因此,Activity管理服務ActivityManagerService在啟動MainActivity組件時,就會發現系統中并不存在一個名稱為“`shy.luo.activity.mainprocess`”的應用程序進程,這時候它就會先創建這個應用程序進程,然后再在里面將MainActivity組件啟動起來。MainActivity組件是由Launcher組件來啟動的,而Launcher組件又是通過Activity 管理服務ActivityManagerService來啟動MainActivity組件的。**由于MainActivity組件、Launcher組件和Activity ManagerService是分別運行在不同的進程中的,因此, MainActivity組件的啟動過程就涉及到了三個進程**。這三個進程是**通過Binder進程間通信機制來完成MainActivity組件的啟動過程的**。
>[info] **注意**: ActivityManagerService是一個系統關鍵服務, 它運行在系統進程System 中, 負責啟動和調度應用程序組件
**Launcher組件啟動MainActivity組件的過程如下所示**。
* ( 1 ) Launcher組件向ActivityManagerService發送一個啟動MainActivity組件的進程間通信請求。
* ( 2) ActivityManagerService首先將要啟動的MainActivity組件的信息保存下來,然后再向Launcher組件發送一個進入中止狀態的進程間通信請求。
* ( 3 ) Launcher組件進入到中止狀態之后,就會向ActivityManagerService發送一個已進入中止狀態的進程間通信請求,以便ActivityManagerService可以繼續執行啟動MainActivity組件的操作。
* ( 4) ActivityManagerService發現用來運行MainActivity組件的應用程序進程不存在,因此,它就會先啟動一個新的應用程序進程。
* ( 5)新的應用程序進程啟動完成之后,就會向ActivityManagerService發送一個啟動完成的進程間通信請求,以便ActivityManagerService可以繼續執行啟動MainActivity組件的操作。
* ( 6) ActivityManagerService將第2步保存下來的MainActivity組件的信息發送給第4步創建的應用程序進程,以便它可以將MainActivity組件啟動起來。
這個過程一共分為35個步驟
**Step 1: Launcher.startActivitySafely()**
~~~
1 void startActivitySafely(Intent intent, Object tag) {
2 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
3 try {
4 startActivity(intent);
5 } catch (ActivityNotFoundException e) {
6 Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
7 Log.e(TAG, "Unable to launch. tag=" + tag + " intent=" + intent, e);
8 } catch (SecurityException e) {
9 Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
10 Log.e(TAG, "Launcher does not have the permission to launch " + intent +
11 ". Make sure to create a MAIN intent-filter for the corresponding activity " +
12 "or use the exported attribute for this activity. "
13 + "tag="+ tag + " intent=" + intent, e);
14 }
15 }
~~~
- 第一章 準備知識
- 第二章 硬件抽象層
- 第三章 智能指針
- 第四章 Logger日志系統
- 第五章 Binder進程間通信系統
- 第六章 Ashmem匿名共享內存系統
- 第七章 Activity組件的啟動過程
- 7.1 Activity組件應用實例
- 7.2 根Activity組件的啟動過程
- 第八章 Service組件的啟動過程
- 第九章 Android系統廣播機制
- 第十章 Content Provider組件的實現原理
- 第十一章 Zygote和System進程的啟動過程
- 第十二章 Android應用程序進程的啟動過程
- 第十三章 Android應用程序的消息處理機制
- 第十四章 Android應用程序的鍵盤消息處理機制
- 第十五章 Android應用程序線程的消息循環模型
- 第十六章 Android應用程序的安裝和顯示過程
- 16.1 Android應用程序的安裝過程
- 16.2 Android應用程序的顯示過程