版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Android應(yīng)用程序的Activity啟動(dòng)過程簡要介紹和學(xué)習(xí)計(jì)劃 分類: Android 2011-08-14 15:46 1047人閱讀 評論(0) 收藏 舉報(bào) 在Android系統(tǒng)中,Activity和Service是應(yīng)用程序的核心組件,它們以松藕合的方式組合在一起構(gòu)成了一個(gè)完整的應(yīng)用程序,這得益于應(yīng)用程序框架層提供了一套完整的機(jī)制來協(xié)助應(yīng)用程序啟動(dòng)這些Activity和Service,以及提供Binder機(jī)制幫助它們相互間進(jìn)行通信。在前面的文章Android進(jìn)程間通信(IPC)機(jī)制Binder簡要介紹和學(xué)習(xí)計(jì)劃和Android系統(tǒng)在新進(jìn)程中啟動(dòng)自定義服務(wù)過程(startService)
2、的原理分析中,我們已經(jīng)系統(tǒng)地介紹了Binder機(jī)制和Service的啟動(dòng)過程了,在本文中,簡要介紹Activity的啟動(dòng)過程以及后續(xù)學(xué)習(xí)計(jì)劃。 在Android系統(tǒng)中,有兩種操作會(huì)引發(fā)Activity的啟動(dòng),一種用戶點(diǎn)擊應(yīng)用程序圖標(biāo)時(shí),Launcher會(huì)為我們啟動(dòng)應(yīng)用程序的主Activity;應(yīng)用程序的默認(rèn)Activity啟動(dòng)起來后,它又可以在內(nèi)部通過調(diào)用startActvity接口啟動(dòng)新的Activity,依此類推,每一個(gè)Activity都可以在內(nèi)部啟動(dòng)新的Activity。通過這種連鎖反應(yīng),按需啟動(dòng)Activity,從而完成應(yīng)用程序的功能。 這里,我們通過一個(gè)具體的例子來說明如何啟動(dòng)And
3、roid應(yīng)用程序的Activity。Activity的啟動(dòng)方式有兩種,一種是顯式的,一種是隱式的,隱式啟動(dòng)可以使得Activity之間的藕合性更加松散,因此,這里只關(guān)注隱式啟動(dòng)Activity的方法。 首先在Android源代碼工程的packages/experimental目錄下創(chuàng)建一個(gè)應(yīng)用程序工程目錄Activity。關(guān)于如何獲得Android源代碼工程,請參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文;關(guān)于如何在Android源代碼工程中創(chuàng)建應(yīng)用程序工程,請參考在Ubuntu上為Android系統(tǒng)內(nèi)置Java應(yīng)用程序測試Application Frameworks層的硬
4、件服務(wù)一文。這里,工程名稱就是Activity了,它定義了一個(gè)路徑為的package,這個(gè)例子的源代碼主要就是實(shí)現(xiàn)在這里了。下面,將會(huì)逐一介紹這個(gè)package里面的文件。 應(yīng)用程序的默認(rèn)Activity定義在src/shy/luo/activity/MainActivity.java文件中:view plaincopy to clipboardprint?1. packageshy.luo.activity;2. 3. importshy.luo.activity.R;4. 5. importandroid.app.Activity;6. importandroid.content.Inte
5、nt;7. importandroid.os.Bundle;8. importandroid.util.Log;9. importandroid.view.View;10. importandroid.view.View.OnClickListener;11. importandroid.widget.Button;12. 13. publicclassMainActivityextendsActivityimplementsOnClickListener14. privatefinalstaticStringLOG_TAG=shy.luo.activity.MainActivity;15.
6、16. privateButtonstartButton=null;17. 18. Override19. publicvoidonCreate(BundlesavedInstanceState)20. super.onCreate(savedInstanceState);21. setContentView(R.layout.main);22. 23. startButton=(Button)findViewById(R.id.button_start);24. startButton.setOnClickListener(this);25. 26. Log.i(LOG_TAG,MainAc
7、tivityCreated.);27. 28. 29. Override30. publicvoidonClick(Viewv)31. if(v.equals(startButton)32. Intentintent=newIntent(shy.luo.activity.subactivity);33. startActivity(intent);34. 35. 36. 它的實(shí)現(xiàn)很簡單,當(dāng)點(diǎn)擊它上面的一個(gè)按鈕的時(shí)候,就會(huì)啟動(dòng)另外一個(gè)名字為“shy.luo.activity.subactivity”的Actvity。 名字為“shy.luo.activity.subactivity”的Actvi
8、ty實(shí)現(xiàn)在src/shy/luo/activity/SubActivity.java文件中:view plaincopy to clipboardprint?1. packageshy.luo.activity;2. 3. importandroid.app.Activity;4. importandroid.os.Bundle;5. importandroid.util.Log;6. importandroid.view.View;7. importandroid.view.View.OnClickListener;8. importandroid.widget.Button;9. 10.
9、publicclassSubActivityextendsActivityimplementsOnClickListener11. privatefinalstaticStringLOG_TAG=shy.luo.activity.SubActivity;12. 13. privateButtonfinishButton=null;14. 15. Override16. publicvoidonCreate(BundlesavedInstanceState)17. super.onCreate(savedInstanceState);18. setContentView(R.layout.sub
10、);19. 20. finishButton=(Button)findViewById(R.id.button_finish);21. finishButton.setOnClickListener(this);22. 23. Log.i(LOG_TAG,SubActivityCreated.);24. 25. 26. Override27. publicvoidonClick(Viewv)28. if(v.equals(finishButton)29. finish();30. 31. 32. 它的實(shí)現(xiàn)也很簡單,當(dāng)點(diǎn)擊上面的一個(gè)銨鈕的時(shí)候,就結(jié)束自己,回到前面一個(gè)Activity中去。 這里
11、我們可以看到,Android應(yīng)用程序架構(gòu)中非常核心的一點(diǎn):MainActivity不需要知道SubActivity的存在,即它不直接擁有SubActivity的接口,但是它可以通過一個(gè)字符串來告訴應(yīng)用程序框架層,它要啟動(dòng)的Activity的名稱是什么,其它的事情就交給應(yīng)用程序框架層來做,當(dāng)然,應(yīng)用程序框架層會(huì)根據(jù)這個(gè)字符串來找到其對應(yīng)的Activity,然后把它啟動(dòng)起來。這樣,就使得Android應(yīng)用程序中的Activity藕合性很松散,從而使得Android應(yīng)用程序的模塊性程度很高,并且有利于以后程序的維護(hù)和更新,對于大型的客戶端軟件來說,這一點(diǎn)是非常重要的。 當(dāng)然,應(yīng)用程序框架能夠根據(jù)名字
12、來找到相應(yīng)的Activity,是需要應(yīng)用程序本身來配合的,這就是要通過應(yīng)用程序的配置文件AndroidManifest.xml來實(shí)現(xiàn)了:view plaincopy to clipboardprint?1. 2. 6. 7. 9. 10. 11. 12. 13. 14. 16. 17. 18. 19. 20. 21. 22. 從這個(gè)配置文件中,我們可以看到,MainActivity被配置成了應(yīng)用程序的默認(rèn)Activity,即用戶在手機(jī)屏幕上點(diǎn)擊Activity應(yīng)用程序圖標(biāo)時(shí),Launcher就會(huì)默認(rèn)啟動(dòng)MainActivity這個(gè)Activity: view plaincopy to clip
13、boardprint?1. 3. 4. 5. 6. 7. 這個(gè)配置文件也將名字“shy.luo.activity.subactivity”和SubActivity關(guān)聯(lián)了起來,因此,應(yīng)用程序框架層能夠根據(jù)名字來找到它: view plaincopy to clipboardprint?1. 3. 4. 5. 6. 7. 下面再列出這個(gè)應(yīng)用程序的界面配置文件和字符串文件。 界面配置文件在res/layout目錄中,main.xml文件對應(yīng)MainActivity的界面:view plaincopy to clipboardprint?1. 2. 7. 13. 14. 而sub.xml對應(yīng)SubAc
14、tivity的界面:view plaincopy to clipboardprint?1. 2. 7. 13. 14. 字符串文件位于res/values/strings.xml文件中: view plaincopy to clipboardprint?1. 2. 3. Activity4. SubActivity5. Startsub-activity6. Finishactivity7. 最后,我們還要在工程目錄下放置一個(gè)編譯腳本文件Android.mk:view plaincopy to clipboardprint?1. LOCAL_PATH:=$(callmy-dir)2. incl
15、ude$(CLEAR_VARS)3. 4. LOCAL_MODULE_TAGS:=optional5. 6. LOCAL_SRC_FILES:=$(callall-subdir-java-files)7. 8. LOCAL_PACKAGE_NAME:=Activity9. 10. include$(BUILD_PACKAGE) 這樣,整個(gè)例子的源代碼實(shí)現(xiàn)就介紹完了,接下來就要編譯了。有關(guān)如何單獨(dú)編譯Android源代碼工程的模塊,以及如何打包system.img,請參考如何單獨(dú)編譯Android源代碼中的模塊一文。 執(zhí)行以下命令進(jìn)行編譯和打包:view plaincopy to clipboa
16、rdprint?1. USER-NAMEMACHINE-NAME:/Android$mmmpackages/experimental/Activity2. USER-NAMEMACHINE-NAME:/Android$makesnod 這樣,打包好的Android系統(tǒng)鏡像文件system.img就包含我們前面創(chuàng)建的Activity應(yīng)用程序了。 再接下來,就是運(yùn)行模擬器來運(yùn)行我們的例子了。關(guān)于如何在Android源代碼工程中運(yùn)行模擬器,請參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文。 執(zhí)行以下命令啟動(dòng)模擬器:view plaincopy to clipboardprint?1
17、. USER-NAMEMACHINE-NAME:/Android$emulator 模擬器啟動(dòng)起,就可以在屏幕上看到Activity應(yīng)用程序圖標(biāo)了: 點(diǎn)擊Activity這個(gè)應(yīng)用程序圖標(biāo)后,Launcher就會(huì)把MainActivity啟動(dòng)起來: 點(diǎn)擊上面的Start sub-activity銨鈕,MainActivity內(nèi)部就會(huì)通過startActivity接口來啟動(dòng)SubActivity:view plaincopy to clipboardprint?1. Intentintent=newIntent(shy.luo.activity.subactivity);2. startActiv
18、ity(intent); 如下圖所示: 無論是通過點(diǎn)擊應(yīng)用程序圖標(biāo)來啟動(dòng)Activity,還是通過Activity內(nèi)部調(diào)用startActivity接口來啟動(dòng)新的Activity,都要借助于應(yīng)用程序框架層的ActivityManagerService服務(wù)進(jìn)程。在前面一篇文章Android系統(tǒng)在新進(jìn)程中啟動(dòng)自定義服務(wù)過程(startService)的原理分析中,我們已經(jīng)看到,Service也是由ActivityManagerService進(jìn)程來啟動(dòng)的。在Android應(yīng)用程序框架層中,ActivityManagerService是一個(gè)非常重要的接口,它不但負(fù)責(zé)啟動(dòng)Activity和Service
19、,還負(fù)責(zé)管理Activity和Service。 Android應(yīng)用程序框架層中的ActivityManagerService啟動(dòng)Activity的過程大致如下圖所示: 在這個(gè)圖中,ActivityManagerService和ActivityStack位于同一個(gè)進(jìn)程中,而ApplicationThread和ActivityThread位于另一個(gè)進(jìn)程中。其中,ActivityManagerService是負(fù)責(zé)管理Activity的生命周期的,ActivityManagerService還借助ActivityStack是來把所有的Activity按照后進(jìn)先出的順序放在一個(gè)堆棧中;對于每一個(gè)應(yīng)用程序
20、來說,都有一個(gè)ActivityThread來表示應(yīng)用程序的主進(jìn)程,而每一個(gè)ActivityThread都包含有一個(gè)ApplicationThread實(shí)例,它是一個(gè)Binder對象,負(fù)責(zé)和其它進(jìn)程進(jìn)行通信。 下面簡要介紹一下啟動(dòng)的過程: Step 1.無論是通過Launcher來啟動(dòng)Activity,還是通過Activity內(nèi)部調(diào)用startActivity接口來啟動(dòng)新的Activity,都通過Binder進(jìn)程間通信進(jìn)入到ActivityManagerService進(jìn)程中,并且調(diào)用ActivityManagerService.startActivity接口; Step 2.ActivityMan
21、agerService調(diào)用ActivityStack.startActivityMayWait來做準(zhǔn)備要啟動(dòng)的Activity的相關(guān)信息; Step 3.ActivityStack通知ApplicationThread要進(jìn)行Activity啟動(dòng)調(diào)度了,這里的ApplicationThread代表的是調(diào)用ActivityManagerService.startActivity接口的進(jìn)程,對于通過點(diǎn)擊應(yīng)用程序圖標(biāo)的情景來說,這個(gè)進(jìn)程就是Launcher了,而對于通過在Activity內(nèi)部調(diào)用startActivity的情景來說,這個(gè)進(jìn)程就是這個(gè)Activity所在的進(jìn)程了; Step 4.Appl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人工耳蝸行業(yè)政策分析:人工耳蝸行業(yè)標(biāo)準(zhǔn)推動(dòng)人工耳蝸技術(shù)普及
- 2025年個(gè)人三項(xiàng)機(jī)制學(xué)習(xí)心得體會(huì)模版(3篇)
- 課題申報(bào)參考:緊密型醫(yī)聯(lián)體視角下大灣區(qū)老年中醫(yī)藥服務(wù)評價(jià)體系構(gòu)建與實(shí)證研究
- 二零二五年度集團(tuán)高層管理人員任期制競聘與續(xù)聘合同6篇
- 2025版小時(shí)工定期雇傭合同范本3篇
- 2025版土地征收及安置補(bǔ)償中介服務(wù)合同3篇
- 全新二零二五年度房地產(chǎn)銷售代理合同3篇
- 二零二五版企業(yè)內(nèi)部會(huì)計(jì)檔案安全保密服務(wù)協(xié)議3篇
- 2025年度文化創(chuàng)意產(chǎn)品開發(fā)與銷售合作協(xié)議范本4篇
- 二零二五年度廚具品牌設(shè)計(jì)創(chuàng)新合同4篇
- 圖像識(shí)別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 個(gè)體戶店鋪?zhàn)赓U合同
- 禮盒業(yè)務(wù)銷售方案
- 二十屆三中全會(huì)精神學(xué)習(xí)試題及答案(100題)
- 小學(xué)五年級英語閱讀理解(帶答案)
- 仁愛版初中英語單詞(按字母順序排版)
- 【奧運(yùn)會(huì)獎(jiǎng)牌榜預(yù)測建模實(shí)證探析12000字(論文)】
- 魯濱遜漂流記人物形象分析
- 危險(xiǎn)廢物貯存?zhèn)}庫建設(shè)標(biāo)準(zhǔn)
- 多層工業(yè)廠房主體結(jié)構(gòu)施工方案鋼筋混凝土結(jié)構(gòu)
- 救生艇筏、救助艇基本知識(shí)課件
評論
0/150
提交評論