




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、Android應用程序的Activity啟動過程簡要介紹和學習計劃 分類: Android 2011-08-14 15:46 1047人閱讀 評論(0) 收藏 舉報 在Android系統(tǒng)中,Activity和Service是應用程序的核心組件,它們以松藕合的方式組合在一起構(gòu)成了一個完整的應用程序,這得益于應用程序框架層提供了一套完整的機制來協(xié)助應用程序啟動這些Activity和Service,以及提供Binder機制幫助它們相互間進行通信。在前面的文章Android進程間通信(IPC)機制Binder簡要介紹和學習計劃和Andr
2、oid系統(tǒng)在新進程中啟動自定義服務過程(startService)的原理分析中,我們已經(jīng)系統(tǒng)地介紹了Binder機制和Service的啟動過程了,在本文中,簡要介紹Activity的啟動過程以及后續(xù)學習計劃。 在Android系統(tǒng)中,有兩種操作會引發(fā)Activity的啟動,一種用戶點擊應用程序圖標時,Launcher會為我們啟動應用程序的主Activity;應用程序的默認Activity啟動起來后,它又可以在內(nèi)部通過調(diào)用startActvity接口啟動新的Activity,依此類推,每一個Activity都可以在內(nèi)部啟動新的Act
3、ivity。通過這種連鎖反應,按需啟動Activity,從而完成應用程序的功能。 這里,我們通過一個具體的例子來說明如何啟動Android應用程序的Activity。Activity的啟動方式有兩種,一種是顯式的,一種是隱式的,隱式啟動可以使得Activity之間的藕合性更加松散,因此,這里只關注隱式啟動Activity的方法。 首先在Android源代碼工程的packages/experimental目錄下創(chuàng)建一個應用程序工程目錄Activity。關于如何獲得And
4、roid源代碼工程,請參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文;關于如何在Android源代碼工程中創(chuàng)建應用程序工程,請參考在Ubuntu上為Android系統(tǒng)內(nèi)置Java應用程序測試Application Frameworks層的硬件服務一文。這里,工程名稱就是Activity了,它定義了一個路徑為shy.luo.activity的package,這個例子的源代碼主要就是實現(xiàn)在這里了。下面,將會逐一介紹這個package里面的文件。 應用程序的默認Activity定義在src/shy/luo/activity/Mai
5、nActivity.java文件中:view plaincopy to clipboardprint?1. package shy.luo.activity; 2. 3. import shy.luo.activity.R; 4. 推薦精選5. import android.app.Activity; 6. import android.content.Intent; 7. import android.os.
6、Bundle; 8. import android.util.Log; 9. import android.view.View; 10. import android.view.View.OnClickListener; 11. import android.widget.Button; 12. 13. public class MainActivity extends Activi
7、ty implements OnClickListener 14. private final static String LOG_TAG = "shy.luo.activity.MainActivity" 15. 16. private Button startButton =&
8、#160;null; 17. 18. Override 19. public void onCreate(Bundle savedInstanceState) 20. super.onCreate(savedInstanceState); 21.
9、60; setContentView(R.layout.main); 22. 23. startButton = (Button)findViewById(R.id.button_start); 24. startButton.setOn
10、ClickListener(this); 25. 26. Log.i(LOG_TAG, "Main Activity Created."); 27. 28. 29. Override 30.
11、160; public void onClick(View v) 31. if(v.equals(startButton) 32. Intent intent = new Intent("shy.luo
12、.activity.subactivity"); 33. startActivity(intent); 34. 35. 36. 推薦精選
13、; 它的實現(xiàn)很簡單,當點擊它上面的一個按鈕的時候,就會啟動另外一個名字為“shy.luo.activity.subactivity”的Actvity。 名字為“shy.luo.activity.subactivity”的Actvity實現(xiàn)在src/shy/luo/activity/SubActivity.java文件中:view plaincopy to clipboardprint?1. package shy.luo.activity; 2. 3. impo
14、rt android.app.Activity; 4. import android.os.Bundle; 5. import android.util.Log; 6. import android.view.View; 7. import android.view.View.OnClickListener; 8. import android.widget.Button; 9.
15、10. public class SubActivity extends Activity implements OnClickListener 11. private final static String LOG_TAG = "shy.luo.activity.SubActivity" 12. 13.
16、 private Button finishButton = null; 14. 15. Override 16. public void onCreate(Bundle savedInstanceState) 17.
17、60;super.onCreate(savedInstanceState); 18. setContentView(R.layout.sub); 19. 20. finishButton = (Button)findViewById(R.id.button_finish); 21. &
18、#160; finishButton.setOnClickListener(this); 22. 23. Log.i(LOG_TAG, "Sub Activity Created."); 24.
19、 推薦精選25. 26. Override 27. public void onClick(View v) 28. if(v.equals(finishButton) 29.
20、60; finish(); 30. 31. 32. 它的實現(xiàn)也很簡單,當點擊上面的一個銨鈕的時候,就結(jié)束自己,回到前面一個Activity中去。 &
21、#160;這里我們可以看到,Android應用程序架構(gòu)中非常核心的一點:MainActivity不需要知道SubActivity的存在,即它不直接擁有SubActivity的接口,但是它可以通過一個字符串來告訴應用程序框架層,它要啟動的Activity的名稱是什么,其它的事情就交給應用程序框架層來做,當然,應用程序框架層會根據(jù)這個字符串來找到其對應的Activity,然后把它啟動起來。這樣,就使得Android應用程序中的Activity藕合性很松散,從而使得Android應用程序的模塊性程度很高,并且有利于以后程序的維護和更新,對于大型的客戶端軟件來說,這一點是非常重要的。
22、60; 當然,應用程序框架能夠根據(jù)名字來找到相應的Activity,是需要應用程序本身來配合的,這就是要通過應用程序的配置文件AndroidManifest.xml來實現(xiàn)了:view plaincopy to clipboardprint?1. <?xml version="1.0" encoding="utf-8"?> 2. <manifest xmlns:android="3. pac
23、kage="shy.luo.activity" 4. android:versionCode="1" 5. android:versionName="1.0"> 6. <application android:icon="drawable/icon" android:label
24、="string/app_name"> 7. <activity android:name=".MainActivity" 8. android:label="string/app_name">
25、; 推薦精選9. <intent-filter> 10. <action android:name="ent.action.MAIN" />
26、60; 11. <category android:name="ent.category.LAUNCHER" /> 12. </intent-filte
27、r> 13. </activity> 14. <activity android:name=".SubActivity" 15. &
28、#160; android:label="string/sub_activity"> 16. <intent-filter> 17. &
29、lt;action android:name="shy.luo.activity.subactivity"/> 18. <category android:name="ent.category.DEFAULT"/> 19.
30、160; </intent-filter> 20. </activity> 21. </application> 22. </manifest> 從這個配置文件
31、中,我們可以看到,MainActivity被配置成了應用程序的默認Activity,即用戶在手機屏幕上點擊Activity應用程序圖標時,Launcher就會默認啟動MainActivity這個Activity: view plaincopy to clipboardprint?1. <activity android:name=".MainActivity" 2. android:label="string/app_name">
32、; 3. <intent-filter> 4. <action android:name="ent.action.MAIN" /> 5. <category andro
33、id:name="ent.category.LAUNCHER" /> 6. </intent-filter> 7. </activity> 推薦精選 這個配置文件也將名字“shy.luo.activity.subactivity”和SubActivity關聯(lián)了起來,因此,應用程序框架層能夠根據(jù)名字來找到它: view plaincopy
34、to clipboardprint?1. <activity android:name=".SubActivity" 2. android:label="string/sub_activity"> 3. <intent-filter> 4. &
35、lt;action android:name="shy.luo.activity.subactivity"/> 5. <category android:name="ent.category.DEFAULT"/> 6. </intent-filter> 7. </acti
36、vity> 下面再列出這個應用程序的界面配置文件和字符串文件。 界面配置文件在res/layout目錄中,main.xml文件對應MainActivity的界面:view plaincopy to clipboardprint?1. <?xml version="1.0" encoding="utf-8"?> 2. <LinearLayo
37、ut xmlns:android="3. android:orientation="vertical" 4. android:layout_width="fill_parent" 5. android:layout_height="fill_parent" 6.
38、; android:gravity="center"> 7. <Button 8. android:id="+id/button_start" 9.
39、; android:layout_width="wrap_content" 10. android:layout_height="wrap_content" 11.
40、160;android:gravity="center" 推薦精選12. android:text="string/start" > 13. </Button> 14. </LinearLayout> &
41、#160; 而sub.xml對應SubActivity的界面:view plaincopy to clipboardprint?1. <?xml version="1.0" encoding="utf-8"?> 2. <LinearLayout xmlns:android="3. android:orientation="vertical"
42、60; 4. android:layout_width="fill_parent" 5. android:layout_height="fill_parent" 6. android:gravity="center"> 7.
43、160; <Button 8. android:id="+id/button_finish" 9. android:layout_width="wrap_content" 10.
44、 android:layout_height="wrap_content" 11. android:gravity="center" 12. &
45、#160; android:text="string/finish" > 13. </Button> 14. </LinearLayout> 字符串文件位于res/values/strings.xml文件中: view plaincopy to clipboardp
46、rint?1. <?xml version="1.0" encoding="utf-8"?> 2. <resources> 推薦精選3. <string name="app_name">Activity</string> 4. <string name="sub_activ
47、ity">Sub Activity</string> 5. <string name="start">Start sub-activity</string> 6. <string name="finish">Finish activity</string> 7. <
48、/resources> 最后,我們還要在工程目錄下放置一個編譯腳本文件Android.mk:view plaincopy to clipboardprint?1. LOCAL_PATH:= $(call my-dir) 2. include $(CLEAR_VARS) 3. 4. LOCAL_MODULE_TAGS := optional 5.
49、60;6. LOCAL_SRC_FILES := $(call all-subdir-java-files) 7. 8. LOCAL_PACKAGE_NAME := Activity 9. 10. include $(BUILD_PACKAGE) 這樣,整個例子的源代碼實現(xiàn)就介紹完了,接下來就要編譯了。有關如何單獨編譯Android源代碼工程的模塊,以及如何
50、打包system.img,請參考如何單獨編譯Android源代碼中的模塊一文。 執(zhí)行以下命令進行編譯和打包:view plaincopy to clipboardprint?1. USER-NAMEMACHINE-NAME:/Android$ mmm packages/experimental/Activity 2. USER-NAMEMACHINE-NAME:/Android$ make snod 推薦精選
51、160; 這樣,打包好的Android系統(tǒng)鏡像文件system.img就包含我們前面創(chuàng)建的Activity應用程序了。 再接下來,就是運行模擬器來運行我們的例子了。關于如何在Android源代碼工程中運行模擬器,請參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文。 執(zhí)行以下命令啟動模擬器:view plaincopy to clipboardprint?1. USER-NAMEMACHINE-NAME:/Android$ em
52、ulator 推薦精選 模擬器啟動起,就可以在屏幕上看到Activity應用程序圖標了: 點擊Activity這個應用程序圖標后,Launcher就會把MainActivity啟動起來:推薦精選 點擊上面的Start sub-activity銨鈕,MainActivity內(nèi)部就會通過startActivity接口來啟動SubActivity:view plai
53、ncopy to clipboardprint?1. Intent intent = new Intent("shy.luo.activity.subactivity"); 2. startActivity(intent); 如下圖所示: 推薦精選 無論是通過點擊應用程序圖標來啟動Activity,還是通過Activity內(nèi)部調(diào)用startActivity接口來啟
54、動新的Activity,都要借助于應用程序框架層的ActivityManagerService服務進程。在前面一篇文章Android系統(tǒng)在新進程中啟動自定義服務過程(startService)的原理分析中,我們已經(jīng)看到,Service也是由ActivityManagerService進程來啟動的。在Android應用程序框架層中,ActivityManagerService是一個非常重要的接口,它不但負責啟動Activity和Service,還負責管理Activity和Service。 Android應用程序框架層中的ActivityManagerService啟動Activity的過程大致如下圖所示:推薦精選 在這個圖中,ActivityManagerService和ActivityStack位于同一個進程中,而ApplicationThread和ActivityThread位于另一個進程中。其中,ActivityManagerService是負責管理
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 寫傭金合同范例
- 個人集資炒股合同范例
- 介紹學員提成居間合同范例
- 二手車轉(zhuǎn)讓合同范例
- 借款經(jīng)銷合同范例
- 臨電工合同范例
- 殼聚糖基氣凝膠的構(gòu)筑及其對Au(Ⅲ)的吸附性能研究
- 生活方式間歇復合干預對超重-肥胖T2DM患者自我管理能力的影響研究
- 道路電氣施工方案
- 2013標準合同范例
- 中學生預防性侵主題班會
- 不良資產(chǎn)項目律師法律盡調(diào)報告(模板)
- 2023年人力資源和社會保障部公開招聘工作人員筆試參考題庫(共500題)答案詳解版
- 高級技校電氣自動化設備安裝與維修教學計劃
- 《長征之戰(zhàn)役》課件
- 心電監(jiān)護操作評分標準
- 保健品概念及分類
- 水土保持監(jiān)理實施細則
- 自體血液回收機使用(精京3000P型)課件
- 非法捕撈水產(chǎn)品罪
- 中鋁中州礦業(yè)有限公司禹州市方山鋁土礦礦山地質(zhì)環(huán)境保護和土地復墾方案
評論
0/150
提交評論