Android啟動Activity源碼分析(開篇)

作為普通應用開發(fā)者,Andorid Framework是神秘的存在,但是不了解Andorid Framework,僅僅使用一些系統(tǒng)提供的API,很難在技術上有所突破。一直以來想寫一些文章來記錄自己學習Framework的過程,想過從View、Binder等方向入手開篇,但View繞不開Activity,Binder沒有使用場景又過于難懂,因此決定從startActivity入手,由淺入深,一步一步揭開Framework的面紗。

Activity是四大組件中使用最頻繁的,startActivity又是最基礎的技能。作為App開發(fā)者來講,Activity是熟悉而又陌生,熟悉是因為每天都在用,陌生是因為Andorid很多基礎的API依賴于Activity,只知其然,而不知其所以然。下面列舉一些問題:

  1. Activity實例在哪里構建的?
  2. setContentView干了什么?
  3. View是如何顯示在Activity中的?
  4. Activity的生命周期函數如何調用的?
  5. Activity的啟動權限有什么?
  6. 誰在管理著Activity?
  7. App進程如何和系統(tǒng)進程通訊?
  8. Activity在系統(tǒng)和App進程中的記錄分別是什么?
  9. 系統(tǒng)為什么要管理Activity?
    .....

類似的問題有很多,startActivity的源碼并不能一一解答所有問題,但它能起到拋磚引玉的作用,了解了startActivity的過程,才能對Activity有一個理性的認知,才能繼續(xù)分析這些問題。下面引用一張圖來解釋系統(tǒng)處理startActivity的重要性:

既然是源碼分析,RTFSC (Read the fucking source code )是比不可少的。但在開始之前還是簡述一下大致流程,并且用示意圖表示其過程,便于理解。

Activity1表示調用startActivity的Activity,Activity2表示要啟動的Activity。

  1. App進程側收集Intent等信息,向AMS(系統(tǒng)進程中的ActivityManagerService)發(fā)送“啟動Activity2”的信號
  2. AMS進行:Activity2的信息收集、uid和pid獲取、權限檢查、Task和mHistory的處理,創(chuàng)建了Activity2在AMS中的句柄ActivityRecord
  3. AMS嘗試resume Activity2,但是發(fā)現需要先pause掉Activity1,隨后向App進程發(fā)送“pause Activity2”的信號
  4. App進程收到信號后,在looper中處理pause消息,調用了Activity1的聲明周期函數onPause
  5. App進程完成pause后,告訴AMS:“我已經pause完畢”
  6. AMS接收信號后,繼續(xù)嘗試resume Activity2,并且發(fā)現可以resume,便告訴App進程“你需要resume Activity2”
  7. App進程接收到信號后,依然在looper中處理,創(chuàng)建Activity2實例、依次調用onCreate、onResume生命周期函數

重點說明以下幾點:

  1. Binder是跨進程通訊方式,使用起來是面向對象的,由于本文重點不在于Binder,因此可認為Binder的調用是無感的,但它確實完成了跨進程。同時這里的跨進程都是同步調用的。
  2. 源碼分析使用API 16,這是因為低版本的代碼更加精簡,高版本的代碼核心依然和低版本的一致,若分析高版本的源碼,無疑會浪費精力
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容