Android應用程式的Activity啟動過程簡要介紹

來源:互聯網
上載者:User

轉自:
http://blog.csdn.net/luoshengyang/article/details/6685853

在Android系統中,Activity和Service是應用程式的核心組件,它們以松藕合的方式組合在一起構成了一個完整的應用程式,這得益於應用程式架構層提供了一套完整的機制來協助應用程式啟動這些Activity和Service,以及提供Binder機制協助它們相互間進行通訊。在前面的文章Android處理序間通訊(IPC)機制Binder簡要介紹和學習計劃和Android系統在新進程中啟動自訂服務過程(startService)的原理分析中,我們已經系統地介紹了Binder機制和Service的啟動過程了,在本文中,簡要介紹Activity的啟動過程以及後續學習計劃。

        在Android系統中,有兩種操作會引發Activity的啟動,一種使用者點擊應用程式圖示時,Launcher會為我們啟動應用程式的主Activity;應用程式的預設Activity啟動起來後,它又可以在內部通過調用startActvity介面啟動新的Activity,依此類推,每一個Activity都可以在內部啟動新的Activity。通過這種連鎖反應,按需啟動Activity,從而完成應用程式的功能。

        這裡,我們通過一個具體的例子來說明如何啟動Android應用程式的Activity。Activity的啟動方式有兩種,一種是顯式的,一種是隱式的,隱式啟動可以使得Activity之間的藕合性更加鬆散,因此,這裡只關注隱式啟動Activity的方法。

 

無論是通過點擊應用程式圖示來啟動Activity,還是通過Activity內部調用startActivity介面來啟動新的Activity,都要藉助於應用程式架構層的ActivityManagerService服務進程。在前面一篇文章Android系統在新進程中啟動自訂服務過程(startService)的原理分析中,我們已經看到,Service也是由ActivityManagerService進程來啟動的。在Android應用程式架構層中,ActivityManagerService是一個非常重要的介面,它不但負責啟動Activity和Service,還負責管理Activity和Service。

        Android應用程式架構層中的ActivityManagerService啟動Activity的過程大致如所示:

 

         在這個圖中,ActivityManagerService和ActivityStack位於同一個進程中,而ApplicationThread和ActivityThread位於另一個進程中。其中,ActivityManagerService是負責管理Activity的生命週期的,ActivityManagerService還藉助ActivityStack是來把所有的Activity按照後進先出的順序放在一個堆棧中;對於每一個應用程式來說,都有一個ActivityThread來表示應用程式的主進程,而每一個ActivityThread都包含有一個ApplicationThread執行個體,它是一個Binder對象,負責和其它進程進行通訊。

        下面簡要介紹一下啟動的過程:

        Step 1. 無論是通過Launcher來啟動Activity,還是通過Activity內部調用startActivity介面來啟動新的Activity,都通過Binder處理序間通訊進入到ActivityManagerService進程中,並且調用ActivityManagerService.startActivity介面; 

        Step 2. ActivityManagerService調用ActivityStack.startActivityMayWait來做準備要啟動的Activity的相關資訊;

        Step 3. ActivityStack通知ApplicationThread要進行Activity啟動調度了,這裡的ApplicationThread代表的是調用ActivityManagerService.startActivity介面的進程,對於通過點擊應用程式圖示的情景來說,這個進程就是Launcher了,而對於通過在Activity內部調用startActivity的情景來說,這個進程就是這個Activity所在的進程了;

        Step 4. ApplicationThread不執行真正的啟動操作,它通過調用ActivityManagerService.activityPaused介面進入到ActivityManagerService進程中,看看是否需要建立新的進程來啟動Activity;

        Step 5. 對於通過點擊應用程式圖示來啟動Activity的情景來說,ActivityManagerService在這一步中,會調用startProcessLocked來建立一個新的進程,而對於通過在Activity內部調用startActivity來啟動新的Activity來說,這一步是不需要執行的,因為新的Activity就在原來的Activity所在的進程中進行啟動;

        Step 6. ActivityManagerServic調用ApplicationThread.scheduleLaunchActivity介面,通知相應的進程執行啟動Activity的操作;

        Step 7. ApplicationThread把這個啟動Activity的操作轉寄給ActivityThread,ActivityThread通過ClassLoader匯入相應的Activity類,然後把它啟動起來。

        這樣,Android應用程式的Activity啟動過程就簡要介紹到這裡了,在接下來的兩篇文章中,我們將根據Activity的這兩種啟動情景,深入到應用程式架構層的原始碼裡面去,一步一步地分析它們的啟動過程:

        1.
Android應用程式啟動過程的原始碼分析;

        2.
Android應用程式內部啟動Activity過程(startActivity)的原始碼分析。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.