【Android】應用程序Activity啓動過程分析

  在Android系統中,有兩種操做會引起Activity的啓動,一種用戶點擊應用程序圖標時,Launcher會爲咱們啓動應用程序的主Activity;應用程序的默認Activity啓動起來後,它又能夠在內部經過調用startActvity接口啓動新的Activity,依此類推,每個Activity均可以在內部啓動新的Activity。經過這種連鎖反應,按需啓動Activity,從而完成應用程序的功能。
架構

  Activity的啓動方式有兩種,一種是顯式的,一種是隱式的,隱式啓動可使得Activity之間的藕合性更加鬆散,所以,這裏只關注隱式啓動Activity的方法。
   Android應用程序架構中很是核心的一點
  主Activity不須要知道跳轉Activity的存在,即它不直接擁有 跳轉 Activity的接口,可是它能夠經過一個字符串來告訴應用程序框架層,它要啓動的Activity的名稱是什麼,其它的事情就交給應用程序框架層來作,固然,應用程序框架層會根據這個字符串來找到其對應的Activity,而後把它啓動起來。
  這樣,就使得Android應用程序中的Activity藕合性很鬆散,從而使得Android應用程序的模塊性程度很高,而且有利於之後程序的維護和更新,對於大型的客戶端軟件來講,這一點是很是重要的。
  固然,應用程序框架可以根據名字來找到相應的Activity,是須要應用程序自己來配合的,這就是要經過應用程序的配置文件AndroidManifest.xml來實現了。
  不管是經過點擊應用程序圖標來啓動Activity,仍是經過Activity內部調用startActivity接口來啓動新的Activity,都要藉助於應用程序框架層的 ActivityManagerService 服務進程。而 Service也是由ActivityManagerService進程來啓動的。
  在Android應用程序框架層中,ActivityManagerService是一個很是重要的接口,它不但負責啓動Activity和Service,還負責管理Activity和Service。
   Android應用程序框架層中的ActivityManagerService啓動Activity的過程大體以下圖所示:
 
  
在這個圖中,ActivityManagerService和ActivityStack位於同一個進程中,而ApplicationThread和ActivityThread位於另外一個進程中。其中,
  1. ActivityManagerService是負責管理Activity的生命週期的
  2. ActivityManagerService還藉助ActivityStack是來把全部的Activity按照後進先出的順序放在一個堆棧中
  3. 對於每個應用程序來講,都有一個ActivityThread來表示應用程序的主進程,而每個ActivityThread都包含有一個ApplicationThread實例,它是一個Binder對象,負責和其它進程進行通訊。
   下面簡要介紹一下 啓動的過程
  1. 不管是經過Launcher來啓動Activity,仍是經過Activity內部調用startActivity接口來啓動新的Activity,都經過Binder進程間通訊進入到ActivityManagerService進程中,而且調用ActivityManagerService.startActivity接口; 
  2. ActivityManagerService調用ActivityStack.startActivityMayWait來作準備要啓動的Activity的相關信息;
  3. ActivityStack通知ApplicationThread要進行Activity啓動調度了,這裏的ApplicationThread表明的是調用ActivityManagerService.startActivity接口的進程,對於經過點擊應用程序圖標的情景來講,這個進程就是Launcher了,而對於經過在Activity內部調用startActivity的情景來講,這個進程就是這個Activity所在的進程了;
  4. ApplicationThread不執行真正的啓動操做,它經過調用ActivityManagerService.activityPaused接口進入到ActivityManagerService進程中,看看是否須要建立新的進程來啓動Activity;
  5. 對於經過點擊應用程序圖標來啓動Activity的情景來講,ActivityManagerService在這一步中,會調用startProcessLocked來建立一個新的進程,而對於經過在Activity內部調用startActivity來啓動新的Activity來講,這一步是不須要執行的,由於新的Activity就在原來的Activity所在的進程中進行啓動;
  6. ActivityManagerServic調用ApplicationThread.scheduleLaunchActivity接口,通知相應的進程執行啓動Activity的操做;
  7. ApplicationThread把這個啓動Activity的操做轉發給ActivityThread,ActivityThread經過ClassLoader導入相應的Activity類,而後把它啓動起來。
  這樣,Android應用程序的Activity啓動過程就簡要介紹到這裏了。
 

參考文章

  http://blog.csdn.net/luoshengyang/article/details/6685853
相關文章
相關標籤/搜索