[TOC]
## 應用啟動



## 問題
### ActivityThread 是什么,它是一個線程嗎,如何被啟動的?
它不是一個線程,它是運行在 App 進程中的主線程中的一個方法中。當 App 進程創建時會執行 ActivityThread.main(),ActivityThread.main() 首先會創建 Looper 執行 Looper.prepareMainLooper();然后創建 ActivityThread 并調用 ActivityThread.attach() 方法告訴 ActivityManagerService 我們創建了一個應用 并將 ApplicationThread 傳給 ActivityManagerService;最后調用 Looper.loop()。
### ActivityClientRecord 與 ActivityRecord 是什么?
記錄 Activity 相關信息,比如:Window,configuration,ActivityInfo 等。
ActivityClientRecord 是客戶端的,ActivityRecord 是 ActivityManagerService 服務端的。
### Context 是什么,ContextImpl,ContextWapper 是什么?
Context 定義了 App 進程的相關環境,Context 是一個接口,ContextImpl 是子類,ContextWapper 是具體實現。
應用資源是在 Application 初始化的時候,也就是創建 Application,ContextImpl 的時候,ContextImpl 就包含這個路徑,主要就是對就是 ResourcesManager 這個單例的引用。
可以看出每次創建 Application 和 Acitvity 以及 Service 時就會有一個 ContextImpl 實例,ContentProvider 和B roadcastReceiver 的 Context 是其他地方傳入的。
所以 Context 數量 = Application 數量 + Activity 數量 + Service 數量,單進程情況下 Application 數量就是 1。
### Instrumentation 是什么?
管理著組件Application,Activity,Service等的創建,生命周期調用。
Application 是什么,什么時候創建的,每個應用程序有幾個 Application?
Application 是在 ActivityThread.handleBindApplication() 中創建的,一個進程只會創建一個 Application,但是一個應用如果有多個進程就會創建多個 Application 對象。
### 點擊 Launcher 啟動 Activity 和應用內部啟動 Activity 的區別?
點擊 Launcher 時會創建一個新進程來開啟 Activity,而應用內打開 Activity,如果 Activity 不指定新進程,將在原來進程打開,是否開啟新進程實在 ActivityManagerService 進行控制的,上面分析得到,每次開啟新進程時會保存進程信息,默認為 應用包名 + 應用UID,打開 Activity 時會檢查請求方的信息來判斷是否需要新開進程。Launcher 打開 Activity 默認 ACTIVITY_NEW_TASK,新開一個 Activity 棧來保存 Activity 的信息。
Activity 啟動過程,onCreate(),onResume() 回調時機及具體作用?
Activity.onCreate() 完成了 App 進程,Application,Activity 的創建,調用 setContentView() 給 Activity 設置了 layout 布局。
Activity.onResume() 完成了 Activity 中 Window 與 WindowManager 的關聯,并對所有子 View 進行渲染并顯示。
## 參考資料
[https://www.jianshu.com/p/9ecea420eb52](https://www.jianshu.com/p/9ecea420eb52)
- 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 性能優化
- 數據跨平臺