Android應(yīng)用程序的Activity啟動過程簡要介紹和學(xué)習(xí)計(jì)劃_第1頁
Android應(yīng)用程序的Activity啟動過程簡要介紹和學(xué)習(xí)計(jì)劃_第2頁
Android應(yīng)用程序的Activity啟動過程簡要介紹和學(xué)習(xí)計(jì)劃_第3頁
Android應(yīng)用程序的Activity啟動過程簡要介紹和學(xué)習(xí)計(jì)劃_第4頁
Android應(yīng)用程序的Activity啟動過程簡要介紹和學(xué)習(xí)計(jì)劃_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Android應(yīng)用程序的Activity啟動過程簡要介紹和學(xué)習(xí)計(jì)劃 分類: Android 2011-08-14 15:46 1047人閱讀 評論(0) 收藏 舉報(bào)         在Android系統(tǒng)中,Activity和Service是應(yīng)用程序的核心組件,它們以松藕合的方式組合在一起構(gòu)成了一個完整的應(yīng)用程序,這得益于應(yīng)用程序框架層提供了一套完整的機(jī)制來協(xié)助應(yīng)用程序啟動這些Activity和Service,以及提供Binder機(jī)制幫助它們相互間進(jìn)行通信。在前面的文章Android進(jìn)程間通信(IPC)機(jī)制Binder簡要介紹和學(xué)習(xí)計(jì)劃和Andr

2、oid系統(tǒng)在新進(jìn)程中啟動自定義服務(wù)過程(startService)的原理分析中,我們已經(jīng)系統(tǒng)地介紹了Binder機(jī)制和Service的啟動過程了,在本文中,簡要介紹Activity的啟動過程以及后續(xù)學(xué)習(xí)計(jì)劃。        在Android系統(tǒng)中,有兩種操作會引發(fā)Activity的啟動,一種用戶點(diǎn)擊應(yīng)用程序圖標(biāo)時,Launcher會為我們啟動應(yīng)用程序的主Activity;應(yīng)用程序的默認(rèn)Activity啟動起來后,它又可以在內(nèi)部通過調(diào)用startActvity接口啟動新的Activity,依此類推,每一個Activity都可以在內(nèi)部啟動新的Act

3、ivity。通過這種連鎖反應(yīng),按需啟動Activity,從而完成應(yīng)用程序的功能。        這里,我們通過一個具體的例子來說明如何啟動Android應(yīng)用程序的Activity。Activity的啟動方式有兩種,一種是顯式的,一種是隱式的,隱式啟動可以使得Activity之間的藕合性更加松散,因此,這里只關(guān)注隱式啟動Activity的方法。        首先在Android源代碼工程的packages/experimental目錄下創(chuàng)建一個應(yīng)用程序工程目錄Activity。關(guān)于如何獲得And

4、roid源代碼工程,請參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文;關(guān)于如何在Android源代碼工程中創(chuàng)建應(yīng)用程序工程,請參考在Ubuntu上為Android系統(tǒng)內(nèi)置Java應(yīng)用程序測試Application Frameworks層的硬件服務(wù)一文。這里,工程名稱就是Activity了,它定義了一個路徑為shy.luo.activity的package,這個例子的源代碼主要就是實(shí)現(xiàn)在這里了。下面,將會逐一介紹這個package里面的文件。       應(yīng)用程序的默認(rèn)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、;  它的實(shí)現(xiàn)很簡單,當(dāng)點(diǎn)擊它上面的一個按鈕的時候,就會啟動另外一個名字為“shy.luo.activity.subactivity”的Actvity。         名字為“shy.luo.activity.subactivity”的Actvity實(shí)現(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.           它的實(shí)現(xiàn)也很簡單,當(dāng)點(diǎn)擊上面的一個銨鈕的時候,就結(jié)束自己,回到前面一個Activity中去。        &

21、#160;這里我們可以看到,Android應(yīng)用程序架構(gòu)中非常核心的一點(diǎn):MainActivity不需要知道SubActivity的存在,即它不直接擁有SubActivity的接口,但是它可以通過一個字符串來告訴應(yīng)用程序框架層,它要啟動的Activity的名稱是什么,其它的事情就交給應(yīng)用程序框架層來做,當(dāng)然,應(yīng)用程序框架層會根據(jù)這個字符串來找到其對應(yīng)的Activity,然后把它啟動起來。這樣,就使得Android應(yīng)用程序中的Activity藕合性很松散,從而使得Android應(yīng)用程序的模塊性程度很高,并且有利于以后程序的維護(hù)和更新,對于大型的客戶端軟件來說,這一點(diǎn)是非常重要的。 

22、60;      當(dāng)然,應(yīng)用程序框架能夠根據(jù)名字來找到相應(yīng)的Activity,是需要應(yīng)用程序本身來配合的,這就是要通過應(yīng)用程序的配置文件AndroidManifest.xml來實(shí)現(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被配置成了應(yīng)用程序的默認(rèn)Activity,即用戶在手機(jī)屏幕上點(diǎn)擊Activity應(yīng)用程序圖標(biāo)時,Launcher就會默認(rèn)啟動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關(guān)聯(lián)了起來,因此,應(yīng)用程序框架層能夠根據(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>          下面再列出這個應(yīng)用程序的界面配置文件和字符串文件。         界面配置文件在res/layout目錄中,main.xml文件對應(yīng)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對應(yīng)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)          這樣,整個例子的源代碼實(shí)現(xiàn)就介紹完了,接下來就要編譯了。有關(guān)如何單獨(dú)編譯Android源代碼工程的模塊,以及如何

50、打包system.img,請參考如何單獨(dú)編譯Android源代碼中的模塊一文。        執(zhí)行以下命令進(jìn)行編譯和打包: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應(yīng)用程序了。       再接下來,就是運(yùn)行模擬器來運(yùn)行我們的例子了。關(guān)于如何在Android源代碼工程中運(yùn)行模擬器,請參考在Ubuntu上下載、編譯和安裝Android最新源代碼一文。       執(zhí)行以下命令啟動模擬器:view plaincopy to clipboardprint?1. USER-NAMEMACHINE-NAME:/Android$ em

52、ulator    推薦精選       模擬器啟動起,就可以在屏幕上看到Activity應(yīng)用程序圖標(biāo)了:         點(diǎn)擊Activity這個應(yīng)用程序圖標(biāo)后,Launcher就會把MainActivity啟動起來:推薦精選        點(diǎn)擊上面的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);          如下圖所示: 推薦精選        無論是通過點(diǎn)擊應(yīng)用程序圖標(biāo)來啟動Activity,還是通過Activity內(nèi)部調(diào)用startActivity接口來啟

54、動新的Activity,都要借助于應(yīng)用程序框架層的ActivityManagerService服務(wù)進(jìn)程。在前面一篇文章Android系統(tǒng)在新進(jìn)程中啟動自定義服務(wù)過程(startService)的原理分析中,我們已經(jīng)看到,Service也是由ActivityManagerService進(jìn)程來啟動的。在Android應(yīng)用程序框架層中,ActivityManagerService是一個非常重要的接口,它不但負(fù)責(zé)啟動Activity和Service,還負(fù)責(zé)管理Activity和Service。        Android應(yīng)用程序框架層中的ActivityManagerService啟動Activity的過程大致如下圖所示:推薦精選         在這個圖中,ActivityManagerService和ActivityStack位于同一個進(jìn)程中,而ApplicationThread和ActivityThread位于另一個進(jìn)程中。其中,ActivityManagerService是負(fù)責(zé)管理

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論