作為普通應用開發(fā)者,Andorid Framework是神秘的存在,但是不了解Andorid Framework,僅僅使用一些系統(tǒng)提供的API,很難在技術上有所突破。一直以來想寫一些文章來記錄自己學習Framework的過程,想過從View、Binder等方向入手開篇,但View繞不開Activity,Binder沒有使用場景又過于難懂,因此決定從startActivity入手,由淺入深,一步一步揭開Framework的面紗。
Activity是四大組件中使用最頻繁的,startActivity又是最基礎的技能。作為App開發(fā)者來講,Activity是熟悉而又陌生,熟悉是因為每天都在用,陌生是因為Andorid很多基礎的API依賴于Activity,只知其然,而不知其所以然。下面列舉一些問題:
- Activity實例在哪里構建的?
- setContentView干了什么?
- View是如何顯示在Activity中的?
- Activity的生命周期函數如何調用的?
- Activity的啟動權限有什么?
- 誰在管理著Activity?
- App進程如何和系統(tǒng)進程通訊?
- Activity在系統(tǒng)和App進程中的記錄分別是什么?
- 系統(tǒng)為什么要管理Activity?
.....
類似的問題有很多,startActivity的源碼并不能一一解答所有問題,但它能起到拋磚引玉的作用,了解了startActivity的過程,才能對Activity有一個理性的認知,才能繼續(xù)分析這些問題。下面引用一張圖來解釋系統(tǒng)處理startActivity的重要性:
既然是源碼分析,RTFSC (Read the fucking source code )是比不可少的。但在開始之前還是簡述一下大致流程,并且用示意圖表示其過程,便于理解。
Activity1表示調用startActivity的Activity,Activity2表示要啟動的Activity。
- App進程側收集Intent等信息,向AMS(系統(tǒng)進程中的ActivityManagerService)發(fā)送“啟動Activity2”的信號
- AMS進行:Activity2的信息收集、uid和pid獲取、權限檢查、Task和mHistory的處理,創(chuàng)建了Activity2在AMS中的句柄ActivityRecord
- AMS嘗試resume Activity2,但是發(fā)現需要先pause掉Activity1,隨后向App進程發(fā)送“pause Activity2”的信號
- App進程收到信號后,在looper中處理pause消息,調用了Activity1的聲明周期函數onPause
- App進程完成pause后,告訴AMS:“我已經pause完畢”
- AMS接收信號后,繼續(xù)嘗試resume Activity2,并且發(fā)現可以resume,便告訴App進程“你需要resume Activity2”
- App進程接收到信號后,依然在looper中處理,創(chuàng)建Activity2實例、依次調用onCreate、onResume生命周期函數
重點說明以下幾點:
- Binder是跨進程通訊方式,使用起來是面向對象的,由于本文重點不在于Binder,因此可認為Binder的調用是無感的,但它確實完成了跨進程。同時這里的跨進程都是同步調用的。
- 源碼分析使用API 16,這是因為低版本的代碼更加精簡,高版本的代碼核心依然和低版本的一致,若分析高版本的源碼,無疑會浪費精力

