Android程序設(shè)計-Activity_第1頁
Android程序設(shè)計-Activity_第2頁
Android程序設(shè)計-Activity_第3頁
Android程序設(shè)計-Activity_第4頁
Android程序設(shè)計-Activity_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Android: Activity嵌入式系統(tǒng)開發(fā)與設(shè)計嵌入式系統(tǒng)開發(fā)與設(shè)計Android核心組件:ActivitypActivityu活動uAndorid組件中最基本也是最為常見用的組件u在Android應(yīng)用中,一個Activiy通常就是一個單獨的屏幕u每個Activity都被實現(xiàn)為一個從活動積累繼承來的獨立的類u活動類顯示的用戶接口由視圖控件組成,并對事件做出響應(yīng)pActivity是Android應(yīng)用程序的表示層u使用View來構(gòu)成顯示信息和響應(yīng)用戶動作的UIu可以看做是開發(fā)環(huán)境中的Formu應(yīng)用程序越復(fù)雜,需要的屏幕可能越多2Activity的創(chuàng)建與使用的創(chuàng)建與使用Activity的創(chuàng)建和

2、使用p創(chuàng)建創(chuàng)建Activityu在在Activity類的基礎(chǔ)上進行擴展類的基礎(chǔ)上進行擴展u在在Activity中定義中定義UI并實現(xiàn)其功能并實現(xiàn)其功能p基本基本Activity類提供了封裝了窗口顯示處理功能的空類提供了封裝了窗口顯示處理功能的空白屏幕白屏幕u交互和顯示還需要進行設(shè)計交互和顯示還需要進行設(shè)計pActivity的注冊的注冊u應(yīng)用程序中的應(yīng)用程序中的Activity需要在需要在AndroidManifest.xml中進中進行注冊行注冊u沒有對應(yīng)標(biāo)簽的沒有對應(yīng)標(biāo)簽的Activity不能被啟動不能被啟動4例子例子1Activity的創(chuàng)建和使用(2)p在android.app.Activi

3、ty類中,Android定義了一系列方法u在應(yīng)用程序中通過對這些方法的復(fù)寫來完成對Activity的創(chuàng)建和使用upublic class OurActivity extends Activity protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onReStart();protected void onResume(); protected void onPause(); protected void onStop(); protected void onDe

4、stroy(); 5Activity的創(chuàng)建和使用(3)pprotected void onCreate(Bundle savedInstanceState)u一個 Activity 的實例被啟動時調(diào)用的第一個方法u一般都會覆蓋該方法作為應(yīng)用程序的一個入口點p完成一些初始化數(shù)據(jù)、設(shè)置用戶界面等工作u大多數(shù)情況下,在該方法中從xml 中加載設(shè)計好的用戶界面。p例如setContentView(R.layout.main); u也可從 savedInstanceState中讀取保存到存儲設(shè)備中的數(shù)據(jù)p需要判斷 savedInstanceState是否為null,因為Activity第一次啟動時并沒有

5、數(shù)據(jù)被存貯在設(shè)備中u if(savedInstanceState!=null) savedInstanceState.get(Key); 6Activity的創(chuàng)建和使用(4)pprotected void onStart()u在 onCreate() 方法之后被調(diào)用,或者在 Activity 從 Stop 狀態(tài)轉(zhuǎn)換為 Active 狀態(tài)時被調(diào)用pProtected void onReStart()u在Activity被停止后調(diào)用pprotected void onResume()u在 Activity從 Pause 狀態(tài)轉(zhuǎn)換到 Active 狀態(tài)時被調(diào)用7Activity的創(chuàng)建和使用(5)pp

6、rotected void onPause()u在 Activity 從 Active 狀態(tài)轉(zhuǎn)換到 Pause狀態(tài)時被調(diào)用u必要時也需要保存狀態(tài)和數(shù)據(jù)pprotected void onStop()u在 Activity 從 Active 狀態(tài)轉(zhuǎn)換到 Stop 狀態(tài)時被調(diào)用u一般在這里保存 Activity 的狀態(tài)信息pprotected void onDestroy()u在 Activity 被結(jié)束時調(diào)用,它是被結(jié)束時調(diào)用的最后一個方法u一般完成釋放資源,清理內(nèi)存等工作8例子例子2Activity的生命周期的生命周期Activity的生命周期(8)10完整生命周期完整生命周期可視生命周期可視

7、生命周期前臺生命周期前臺生命周期例子例子3例子例子4Activity的生命周期(9)p完整生命周期uActivity的完整生命周期自第一次調(diào)用onCreate()方法開始,到調(diào)用onDestroy()為止p如果Activity所在的進程被終止,那么即使沒有調(diào)用onDestroy方法Activity也結(jié)束其存在u在onCreate()中設(shè)置所有“全局”狀態(tài)以完成初始化p初始化Activityp擴展(inflate)UIp分配對類變量的引用p將數(shù)據(jù)綁定到控件p創(chuàng)建服務(wù)和線程u在onDestroy()中釋放所有系統(tǒng)資源p通過重寫來清除,保證所有外部資源被關(guān)閉11Activity的生命周期(10)p

8、Activity的可視生命周期u自onStart()調(diào)用開始直到相應(yīng)的onStop()調(diào)用結(jié)束u在此期間,用戶可以在屏幕上看到Activityp可能不是用戶關(guān)注的活動,或者不與用戶進行交互u可以保留用來向用戶顯示這個Activity所需的資源pActivity的可視生命周期可能多次經(jīng)歷uonStart() 和 onStop() 方法可以隨著應(yīng)用程序是否為用戶可見而被多次調(diào)用u在可視生命周期內(nèi)可能被直接銷毀,而不調(diào)用onStop方法12Activity的生命周期(11)ponStop方法u用來暫?;蛘咄V箘赢嫛⒕€程、計時器、服務(wù)或者其他專門用于更新UI的進程uUI不可見時該方法只消耗資源而沒有意

9、義ponStart/onReStartu當(dāng)UI可見時使用這兩個方法恢復(fù)或者重啟進程uonReStart可以實現(xiàn)當(dāng)Activity在其完整生命周期內(nèi)重啟才能完成的處理ponStart/onStopu也可以用來注冊和銷毀專門用來更新UI的廣播接收器13Activity的生命周期(12)p Activity的前臺生命周期u自onResume()調(diào)用起,至相應(yīng)的onPause()調(diào)用為止u在此期間,Activity位于前臺最上面并與用戶進行交互,接受用戶的輸入uActivity會經(jīng)常在暫停和恢復(fù)之間進行狀態(tài)轉(zhuǎn)換p當(dāng)Activity不被關(guān)注或者有新的Activity啟動時,將調(diào)用onPause()方法p

10、當(dāng)Activity獲得結(jié)果或者接收到新的Intent時會調(diào)用onResume()方法uonReusme()方法中的代碼盡可能的少,以保證切換時的響應(yīng)速度ponPause()u一般重寫來托管未保存的改動u處于pause狀態(tài)的Activity可能被銷毀14Activity的生命周期pAndroid應(yīng)用程序不能控制所擁有進程的生存期uAndroid系統(tǒng)在運行時管理每個應(yīng)用程序的進程u同樣業(yè)管理每個進程內(nèi)的每個活動pActivity的管理u所有的Activity由Android系統(tǒng)的Activity棧管理p當(dāng)前所有正在運行的進程的后進先出的集合uActivity的狀態(tài)由它在棧中的位置所決定u一個新的A

11、ctivity執(zhí)行后被放置到棧的頂端,變 成“running activity”,此前的Activity存在于堆棧中,一般不在前景p如果通過“Back”返回此前的Activity或者當(dāng)前Activity被關(guān)閉,棧中的下一個活動變成棧頂活動,并成為活動狀態(tài)15Activity的生命周期(2)pActivity的狀態(tài)uActivity在系統(tǒng)中不斷的被創(chuàng)建和銷毀u在Activity棧中被移進和移出uActivity在不同的狀態(tài)中轉(zhuǎn)換pActivity的4個狀態(tài)u活動狀態(tài)(Active)u暫停狀態(tài)(Paused)u停止?fàn)顟B(tài)(Stop)u非活動狀態(tài)(Finish/Kill)16Activity的生命周期

12、(3)pActivity:活動狀態(tài)u位于Activity棧的棧頂u可見的、focused的前臺Activityu處于屏幕的最上層pAndroid系統(tǒng)會盡力維持活動狀態(tài)Activity的運行u通過適當(dāng)?shù)匿N毀其他的Activity來保證活動狀態(tài)Activity所需的資源u當(dāng)有某個Activity變?yōu)榛顒訝顟B(tài)時,該活動被暫停p處于paused狀態(tài)17Activity的生命周期(4)pActivity:暫停狀態(tài)u特定情況下可見但不是焦點的Activityp非全屏或者半透明狀態(tài)u仍處于近似active的狀態(tài)p自身的狀態(tài)和數(shù)據(jù)都存在p與窗口管理程序保持聯(lián)系p不能接收用戶的輸入事件u被系統(tǒng)終止p當(dāng)系統(tǒng)內(nèi)存資

13、源不足時會被終止p狀態(tài)的轉(zhuǎn)變u不可見時轉(zhuǎn)變?yōu)橥V範(fàn)顟B(tài)18Activity的生命周期(5)pActivity:停止?fàn)顟B(tài)u當(dāng)一個Activity 被其它的Activity 完全的遮蓋住時,Activity的狀態(tài)發(fā)生變化u仍保有其狀態(tài)及數(shù)據(jù)u已變?yōu)椴豢梢姡嬅媸请[藏且不需要更新p停止?fàn)顟B(tài)的Activity會被終止u當(dāng)系統(tǒng)內(nèi)存不足時,stop 狀態(tài)的Activity首先被終止已釋放內(nèi)存p狀態(tài)的轉(zhuǎn)換uActivity退出或者被關(guān)閉19Activity的生命周期(6)pActivity的終止不受程序員控制u可以通過程序創(chuàng)建和運行Activity,并使用方法停止Activityu終止Activity由And

14、roid系統(tǒng)決定p當(dāng)Activity處于pause或者stop狀態(tài)時可能被系統(tǒng)終止并回收u應(yīng)用程序運行過程中的一些狀態(tài)(用戶輸入等)需要保存到持久存儲中u應(yīng)用程序中啟動了其他后臺線程,同樣也需要進行處理p否則會失去運行時的狀態(tài)或輸入或者p由于沒有處理后臺線程導(dǎo)致異常20Activity的生命周期(7)pActivity狀態(tài)的轉(zhuǎn)換u除棧頂Activity外均為pause/stop/finish/kill狀態(tài)u一旦棧頂Activity失去焦點就變?yōu)閜ause/stop/finish/kill狀態(tài),同時新的Activity或者棧中的下一個Activity成為棧頂Activityp轉(zhuǎn)換的控制u狀態(tài)的轉(zhuǎn)

15、換由系統(tǒng)控制,對用戶不可見u轉(zhuǎn)換過程中所存儲的數(shù)據(jù)和狀態(tài)在Activity轉(zhuǎn)換為active狀態(tài)時就需要進行恢復(fù)21例子例子5多多Activity的使用的使用Intent簡介簡介Intent(意圖)pIntentuAndorid系統(tǒng)中的消息傳遞機制uActivity之間消息的傳遞uActivity、Service、Broadcast Receiver之間的橋梁u可用來在系統(tǒng)范圍內(nèi)廣播消息u用來描述一個程序想要作些什么事情24IntentactivityserviceBroadcast receiverIntent(意圖)(2)pAndroid Intent基本的設(shè)計理念u通過Intent減少組

16、件間的耦合u允許應(yīng)用程序與其它的應(yīng)用程序間傳遞Intent來執(zhí)行動作和產(chǎn)生事件u使用Intent可以激活A(yù)ndroid應(yīng)用的三個核心組件pActivitypServicepBroadcastReceiverpIntent對操作的描述u通過startActivity方法來啟動Activityu通過broadcast Intent機制將一個Intent發(fā)送給對該Intent感興趣的BroadcastReceiveru通過startService(Intent)或bindService(Intent, ServiceConnection, Int)來和后臺的Service進行交互25Intent的類

17、別p兩類intentu顯式Intentu隱式Intentp顯式Intentu指定具體的目標(biāo)組件處理p指定當(dāng)前的應(yīng)用程序上下文以及要啟動的活動類,然后傳遞給startActivityp調(diào)用Intent.setComponent()或Intent.setClass()方法指定了組件名或類對象的Intent為顯式意圖u顯式Intent明確指定了Intent應(yīng)該傳遞給哪個組件ustartActivity(new Intent(ActivityLifecycle.this, AnotherActivity.class);26Intent的類別(2)p隱式Intentu由系統(tǒng)接受并決定如何處理p讓匿名的組

18、件為請求的動作服務(wù)u沒有調(diào)用Intent.setComponent()或Intent.setClass()方法指定組件名或類對象的Intent為隱式Intentp構(gòu)建新的隱式Intent時,需要指定一個要執(zhí)行的動作u還可以提供執(zhí)行那個動作需要的數(shù)據(jù)uAndroid系統(tǒng)會根據(jù)隱式Intent中設(shè)置的動作(action)、類別(category)、數(shù)據(jù)(URI和數(shù)據(jù)類型)找到最合適的組件來處理這個Intentp通過Intent Filter(過濾器)來匹配隱式Intentp如果Intent Filter定義的動作、類別、數(shù)據(jù)(URI和數(shù)據(jù)類型)與Intent匹配,就會使用Intent Filter

19、所在的組件來處理該Intentp想要接收使用startActivity()方法傳遞的隱式Intent的活動必須在它們的意圖過濾器中包含ent.category.DEFAULTustartActivity(new Intent(Intent.ACTION_DIAL); 27Intent的類別(3)p在AndroidManifest.xml中定義activity、service、broadcast receiver接受的intent28Intent使用實例p無參數(shù)Activity跳轉(zhuǎn)uIntent it = new Intent(Activity.Main.this, Act

20、ivity2.class); startActivity(it); p向下一個Activity傳遞數(shù)據(jù)uIntent it = new Intent(Activity.Main.this, Activity2.class);it.putExtra(“msg”, “xxx”);startActivity(it); p對于數(shù)據(jù)的獲取可以采用:uIntent it = getIntent();it.getStringExtra(msg);29例子例子6通過 bundle對象來傳遞信息p通過 bundle對象來傳遞信息ubundle維護了一個 HashMap對象,將數(shù)據(jù)存貯在這個 HashMap 中來

21、進行傳遞p消息傳遞代碼如下u Intent intent =new Intent(CurrentActivity.this,OtherActivity.class); / 創(chuàng)建一個帶“收件人地址”的 email Bundle bundle =new Bundle();/ 創(chuàng)建 email 內(nèi)容bundle.putBoolean(“boolean_key”, true);/ 寫內(nèi)容bundle.putString(string_key, string_value); intent.putExtra(key, bundle);/ 封裝 email startActivity(intent);/ 啟

22、動新的 Activity 30通過 bundle對象來傳遞信息(2)p使用bundle對象ubundle維護了一個 HashMap對象,數(shù)據(jù)存貯在這個 HashMap 中來進行傳遞u代碼稍顯復(fù)雜p使用Intent內(nèi)部的bundleu使用更為簡便uIntent intent =new Intent(EX06.this,OtherActivity.class); intent.putExtra(boolean_key, true); intent.putExtra(string_key, string_value); startActivity(intent); p接收uIntent intent

23、=getIntent(); intent.getBooleanExtra(boolean_key,false); intent.getStringExtra(string_key); 31通過 bundle對象來傳遞信息(3)p對于bundle傳遞的消息的接收u在OtherActivity類的 onCreate()或者其它任何地方使用以下代碼來接收相應(yīng)的消息uIntent intent =getIntent();/ 收取消息 Bundle bundle =intent.getBundleExtra(“key”);/ 打開消息bundle.getBoolean(“boolean_key”);/

24、讀取內(nèi)容bundle.getString(string_key); 32例子例子7Intent解析解析Intent FilterpIntent Filteru注冊Activity、Service和BroadcastReceiver并對一個動作或者一類特定的數(shù)據(jù)進行處理u描述一個組件愿意接收什么樣的 Intent 對象uAndroid 將其抽象為 android.content.IntentFilter 類u當(dāng)Intent要求做某些事情時,Intent Filter被用來描述這個Activity能夠做些什么事情p比如 一個activity要能夠顯示個人聯(lián)絡(luò)數(shù)據(jù),必需在Intent Filter說

25、明要如何處理個人聯(lián)絡(luò)數(shù)據(jù)并用ACTION_VIEW呈現(xiàn)出來pIntentFilter在AndroidManifest.xml里面聲明u在Android的AndroidManifest.xml 文件中聲明u通過 節(jié)點為一個 Activity 指定其 Intent Filterp告訴Android該 Activity 可以響應(yīng)什么類型的 Intent34Intent Filter(2)35frameworkComponent nameActionDataCategoryintentcomponentactivityserviceBroadcast receiverIntent對象與屬性對象與屬性I

26、ntent對象pIntent對象uIntent本身是Intent對象u保存了對要執(zhí)行操作的抽象描述pIntent被傳遞出去后,系統(tǒng)會為之找到合適的響應(yīng)對象uActivityuServiceuBroadcastreceiveru三種情況相互獨立不存在重疊p一個Intent對象是一個信息包,包含了u要接收此Intent的組件需要的信息(例如需要的動作和動作需要的信息)u android 系統(tǒng)需要的信息pIntent Filter節(jié)點中由標(biāo)簽來定義相關(guān)的匹配規(guī)則,告知系統(tǒng)對應(yīng)的組件可以接受哪些intent37actionpactionu是用戶定義的字符串u用于描述一個 Android 應(yīng)用程序組件u

27、一個 Intent Filter 可以包含多個 Action。在 AndroidManifest.xml 的 Activity 定義時可以在其 節(jié)點指定一個 Action 列表用于標(biāo)示 Activity 所能接受的“動作”,例如:u 38action(2)paction使用android:name屬性指定要為之服務(wù)的action的名稱p 如果啟動Activity采用如下方法使用Intent 對象uIntent intent =new Intent(); intent.setAction(com.wust.myaction); u則所有的Action列表中包含了“com.wust.myactio

28、n”的 Activity 都將會匹配成功pAndroid預(yù)定義了一系列的Action分別表示特定的系統(tǒng)動作u這些 Action 通過常量的方式定義在 android.content.Intent中,以“ACTION_”開頭uAction 需要盡可能明確的名字p通過 setAction() 設(shè)置actionp通過 getAction() 進行獲取u可以在 Android 提供的文檔中找到它們的詳細說明39datapData屬性有兩部分構(gòu)成u數(shù)據(jù)URI u數(shù)據(jù)MIME typepaction的定義通常決定了data的定義方式p采用指向數(shù)據(jù)的URI來表示datau例如指向聯(lián)系人的URI可以是pCon

29、tent:/contacts/21p可以明確的在 Intent object上設(shè)置一個 data typeusetData() 方法設(shè)置URIusetType() 設(shè)置MIME typeusetDataAndType() 可以對二者都進行設(shè)置u獲取URI 和data type可分別調(diào)用getData()和getType()方法40URI 數(shù)據(jù)匹配p一個Intent 可以通過 URI 攜帶外部數(shù)據(jù)給目標(biāo)組件u在節(jié)點中,通過 節(jié)點匹配外部數(shù)據(jù)umimeType 屬性指定攜帶外部數(shù)據(jù)的數(shù)據(jù)類型uscheme 指定協(xié)議uhost、port、path 指定數(shù)據(jù)的位置、端口、和路徑u如下u p如果在Int

30、ent Filter中指定了這些屬性,那么只有所有的屬性都匹配成功時URI數(shù)據(jù)匹配才會成功41categorypCategoryu字符串,包含了處理該Intent的組件的種類信息u為執(zhí)行動作的附加信息,起著對action的補充說明作用u一個Intent對象可以有多個categorypAndroid系統(tǒng)中定義了category 常量p對category的操作uaddCategory() 添加一個categoryuremoveCategory()刪除一個category()ugetCategorys()獲取所有的category()42category類別匹配pAndroidManifest.xm

31、lp使用android:category屬性指定應(yīng)該在哪種環(huán)境下為動作提供服務(wù)u每個Intent Filter標(biāo)簽可以包含多個category標(biāo)簽u可以自行指定category或者Android系統(tǒng)提供的標(biāo)準(zhǔn)值p節(jié)點中可以為組件定義一個Category 類別列表u當(dāng) Intent 中包含這個列表的所有項目時 Category 類別匹配才會成功43ExtraspExtrasu附加信息u鍵-值對形式的信息u例如pACTION_TIMEZONE_CHANGED的intent有一個time-zone附加信息來指明新的時區(qū)pACTION_HEADSET_PLUG有一個state附加信息來指示耳機是被插入還是被拔出p對Extras的操作uintent對象有一系列put.()和set.()方法來進行設(shè)定和獲取u附加信息可以使用putExtras()和getExtras()作為Bundle進行讀/寫44Intent匹配(2)p使用startActivity(intent)來啟動另外一個Activit

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論