[TOC]
## Activity的啟動流程

### 整個流程涉及的主要角色有:
* Instrumentation: 監控應用與系統相關的交互行為。
* ActivityManagerService(AMS):組件管理調度中心,什么都不干,但是什么都管。
* ActivityStarter:Activity啟動的控制器,處理Intent與Flag對Activity啟動的影響,具體說來有:1 尋找符合啟動條件的Activity,如果有多個,讓用戶選擇;2 校驗啟動參數的合法性;3 返回int參數,代表Activity是否啟動成功。
* ActivityStackSupervisior:這個類的作用你從它的名字就可以看出來,它用來管理任務棧。
* ActivityStack:用來管理任務棧里的Activity。
* ActivityThread:在Android中它就代表了Android的主線程,注意是代表而不是說它就是一個Thread類,它是創建完新進程之后(肯定是在
* 一個線程中啊),main函數被加載,然后執行一個loop的循環使當前線程進入消息循環,并且作為主線程。
* ApplicationThread:最終干活的人,是ActivityThread的內部類,也是一個Binder對象。在此處它是作為IApplicationThread對象的server端等待client端的請求然后進行處理,最大的client就是AMS.Activity、Service、BroadcastReceiver的啟動、切換、調度等各種操作都在這個類里完成。
注意:這里單獨提一下ActivityStackSupervisior,這是高版本才有的類,它用來管理多個ActivityStack,早期的版本只有一個ActivityStack對應著手機屏幕,后來高版本支持多屏以后,就有了多個ActivityStack,于是就引入了ActivityStackSupervisior用來管理多個ActivityStack。
### 整個流程主要涉及四個進程:
* 調用者進程,如果是在桌面啟動應用就是Launcher應用進程。
* ActivityManagerService等所在的System Server進程,該進程主要運行著系統服務組件。
* Zygote進程,該進程主要用來fork新進程。
* 新啟動的應用進程,該進程就是用來承載應用運行的進程了,它也是應用的主線程(新創建的進程就是主線程),處理組件生命周期、界面繪制等相關事情。
### 整個流程如下
點擊桌面應用圖標,Launcher進程將啟動Activity(MainActivity)的請求以Binder的方式發送給了AMS。
AMS接收到啟動請求后,交付ActivityStarter處理Intent和Flag等信息,然后再交給ActivityStackSupervisior/ActivityStack處理Activity進棧相關流程。同時以Socket方式請求Zygote進程fork新進程。
Zygote接收到新進程創建請求后fork出新進程。
在新進程里創建ActivityThread對象,新創建的進程就是應用的主線程,在主線程里開啟Looper消息循環,開始處理創建Activity。ActivityThread利用ClassLoader去加載Activity、創建Activity實例,并回調Activity的onCreate()方法。這樣便完成了Activity的啟動。
## 參考資料
[點擊應用圖標-應用(Activity)的啟動流程](https://blog.csdn.net/zhangqiluGrubby/article/details/80144589)
[一張圖弄清Activity的啟動過程](https://juejin.cn/post/6844903790953381896)
- Android
- 四大組件
- Activity
- Fragment
- Service
- 序列化
- Handler
- Hander介紹
- MessageQueue詳細
- 啟動流程
- 系統啟動流程
- 應用啟動流程
- Activity啟動流程
- View
- view繪制
- view事件傳遞
- choreographer
- LayoutInflater
- UI渲染概念
- Binder
- Binder原理
- Binder最大數據
- Binder小結
- Android組件
- ListView原理
- RecyclerView原理
- SharePreferences
- AsyncTask
- Sqlite
- SQLCipher加密
- 遷移與修復
- Sqlite內核
- Sqlite優化v2
- sqlite索引
- sqlite之wal
- sqlite之鎖機制
- 網絡
- 基礎
- TCP
- HTTP
- HTTP1.1
- HTTP2.0
- HTTPS
- HTTP3.0
- HTTP進化圖
- HTTP小結
- 實踐
- 網絡優化
- Json
- ProtoBuffer
- 斷點續傳
- 性能
- 卡頓
- 卡頓監控
- ANR
- ANR監控
- 內存
- 內存問題與優化
- 圖片內存優化
- 線下內存監控
- 線上內存監控
- 啟動優化
- 死鎖監控
- 崩潰監控
- 包體積優化
- UI渲染優化
- UI常規優化
- I/O監控
- 電量監控
- 第三方框架
- 網絡框架
- Volley
- Okhttp
- 網絡框架n問
- OkHttp原理N問
- 設計模式
- EventBus
- Rxjava
- 圖片
- ImageWoker
- Gilde的優化
- APT
- 依賴注入
- APT
- ARouter
- ButterKnife
- MMKV
- Jetpack
- 協程
- MVI
- Startup
- DataBinder
- 黑科技
- hook
- 運行期Java-hook技術
- 編譯期hook
- ASM
- Transform增量編譯
- 運行期Native-hook技術
- 熱修復
- 插件化
- AAB
- Shadow
- 虛擬機
- 其他
- UI自動化
- JavaParser
- Android Line
- 編譯
- 疑難雜癥
- Android11滑動異常
- 方案
- 工業化
- 模塊化
- 隱私合規
- 動態化
- 項目管理
- 業務啟動優化
- 業務架構設計
- 性能優化case
- 性能優化-排查思路
- 性能優化-現有方案
- 登錄
- 搜索
- C++
- NDK入門
- 跨平臺
- H5
- Flutter
- Flutter 性能優化
- 數據跨平臺