Android Activity和Intent機(jī)制學(xué)習(xí)筆記_第1頁(yè)
Android Activity和Intent機(jī)制學(xué)習(xí)筆記_第2頁(yè)
Android Activity和Intent機(jī)制學(xué)習(xí)筆記_第3頁(yè)
Android Activity和Intent機(jī)制學(xué)習(xí)筆記_第4頁(yè)
Android Activity和Intent機(jī)制學(xué)習(xí)筆記_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

ActivityAndroid中,Activity是所有程序的根本,所有程序的流程都運(yùn)行在Activity之中,Activity具有自己的生命周期(見(jiàn)/feisky/archive/2010/01/01/1637427.html,由系統(tǒng)控制生命周期,程序無(wú)法改變,但可以用onSavelnstanceState保存其狀態(tài))。對(duì)于Activity,關(guān)鍵是其生命周期的把握(如下圖),其次就是狀態(tài)的保存和恢復(fù)(onSaveInstanceStateonRestoreInstanceState),以及Activity之間的跳轉(zhuǎn)和數(shù)據(jù)傳輸(intent)。j1inhwiMF.jynnifijir芝哽*、、anultirnmJDTpausefij1inhwiMF.jynnifijir芝哽*、、anultirnmJDTpausefivoidOnCreate(BundlesavedInstanceState)voidonStart()voidonRestart()voidonResume()voidonPause()voidonStop()voidonDestroy()注意的是,Activity的使用需要在Manifest文件中添加相應(yīng)的<Activity>,并設(shè)置其屬性和intent-filteroIntentAndroid中提供了Intent機(jī)制來(lái)協(xié)助應(yīng)用間的交互與通訊,Intent負(fù)責(zé)對(duì)應(yīng)用中一次操作的動(dòng)作、動(dòng)作涉及數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android則根據(jù)此Intent的描述,負(fù)責(zé)找到對(duì)應(yīng)的組件,將Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。Intent不僅可用于應(yīng)用程序之間,也可用于應(yīng)用程序內(nèi)部的Activity/Service之間的交互。因此,Intent在這里起著一個(gè)媒體中介的作用,專(zhuān)門(mén)提供組件互相調(diào)用的相關(guān)信息,實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。在SDK中給出了Intent作用的表現(xiàn)形式為:通過(guò)Context.startActivity()orActivity.startActivityForResult()啟動(dòng)一個(gè)Activity;通過(guò)Context.startService()啟動(dòng)一個(gè)服務(wù),或者通過(guò)Context.bindService()和后臺(tái)服務(wù)交互;通過(guò)廣播方法(比如Context.sendBroadcast(),Context.sendOrderedBroadcast(),Context.senMtickyBmadcastO)發(fā)給broadcastreceivers。Intent屬性的設(shè)置,包括以下幾點(diǎn):(以下為XML中定義,當(dāng)然也可以通過(guò)Intent類(lèi)的方法來(lái)獲取和設(shè)置)(1)Action,也就是要執(zhí)行的動(dòng)作SDk中定義了一些標(biāo)準(zhǔn)的動(dòng)作,包括onstantTargetActioncomponentACTION_CALLactivityInitiateaphonecall.ACTION_EDITactivityDisplaydatafortheusertoedit.ACTION_MAINactivityStartupastheinitialactivityofatask,withnodatainputandnoreturnedoutput.ACTION_SYNCactivitySynchronizedataonaserverwithdataonthemobiledevice.ACTION_BATTERY_LOWbroadcastreceiverAwarningthatthebatteryislow.ACTION_HEADSET_PLUGbroadcastreceiverAheadsethasbeenpluggedintothedevice,orunpluggedfromit.ACTION_SCREEN_ONbroadcastreceiverThescreenhasbeenturnedon.ACTION_TIMEZONE_CHANGEDbroadcastreceiverThesettingforthetimezonehaschanged.當(dāng)然,也可以自定義動(dòng)作(自定義的動(dòng)作在使用時(shí),需要加上包名作為前綴,如"Wm.wampE.pmjectfHOW_COLg”),并可定義相應(yīng)的Activity來(lái)處理我們的自定義動(dòng)作。(2)Data,也就是執(zhí)行動(dòng)作要操作的數(shù)據(jù)Android中采用指向數(shù)據(jù)的一個(gè)URI來(lái)表示,如在聯(lián)系人應(yīng)用中,一個(gè)指向某聯(lián)系人的URI可能為:content://contacts/1。對(duì)于不同的動(dòng)作,其URI數(shù)據(jù)的類(lèi)型是不同的(可以設(shè)置type屬性指定特定類(lèi)型數(shù)據(jù)),如ACTION_EDIT指定Data為文件URI,打電話為tel:URI,訪問(wèn)網(wǎng)絡(luò)為http:URI,而由contentprovider提供的數(shù)據(jù)則為content:uRIs。(3)type(數(shù)據(jù)類(lèi)型),顯式指定Intent的數(shù)據(jù)類(lèi)型(MIME)。一般Intent的數(shù)據(jù)類(lèi)型能夠根據(jù)數(shù)據(jù)本身進(jìn)行判定,但是通過(guò)設(shè)置這個(gè)屬性,可以強(qiáng)制采用顯式指定的類(lèi)型而不再進(jìn)行推導(dǎo)。(4)category(類(lèi)別),被執(zhí)行動(dòng)作的附加信息。例如LAUNCHER_CATEGORY表示Intent的接受者應(yīng)該在Launcher中作為頂級(jí)應(yīng)用出現(xiàn);而ALTERNATIVE_CATEGORY表示當(dāng)前的Intent是一系列的可選動(dòng)作中的一個(gè),這些動(dòng)作可以在同一塊數(shù)據(jù)上執(zhí)行。還有其他的為ConstantMeaningCATEGORY_BROWSABLEThetargetactivitycanbesafelyinvokedbythebrowsertodisplaydatareferencedbyalink—forexample,animageorane-mailmessage.CATEGORY_GADGETTheactivitycanbeembeddedinsideofanotheractivitythathostsgadgets.CATEGORY_HOMETheactivitydisplaysthehomescreen,thefirstscreentheuserseeswhenthedeviceisturnedonorwhentheHOMEkeyispressed.CATEGORY_LAUNCHERTheactivitycanbetheinitialactivityofataskandislistedinthetop-levelapplicationlauncher.CATEGORY_PREFERENCEThetargetactivityisapreferencepanel.(5)component(組件),指定Intent的的目標(biāo)組件的類(lèi)名稱(chēng)。通常Android會(huì)根據(jù)Intent中包含的其它屬性的信息,比如action、data/type、category進(jìn)行查找,最終找到一個(gè)與之匹配的目標(biāo)組件。但是,如果component這個(gè)屬性有指定的話,將直接使用它指定的組件,而不再執(zhí)行上述查找過(guò)程。指定了這個(gè)屬性以后,Intent的其它所有屬性都是可選的。(6)extras(附加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴(kuò)展信息,比如,如果要執(zhí)行“發(fā)送電子郵件”這個(gè)動(dòng)作,可以將電子郵件的標(biāo)題、正文等保存在extras里,傳給電子郵件發(fā)送組件。理解Intent的關(guān)鍵之一是理解清楚Intent的兩種基本用法:一種是顯式的Intent,即在構(gòu)造Intent對(duì)象時(shí)就指定接收者;另一種是隱式的Intent,即Intent的發(fā)送者在構(gòu)造Intent對(duì)象時(shí),并不知道也不關(guān)心接收者是誰(shuí),有利于降低發(fā)送者和接收者之間的耦合。對(duì)于顯式Intent,Android不需要去做解析,因?yàn)槟繕?biāo)組件已經(jīng)很明確,Android需要解析的是那些隱式Intent,通過(guò)解析,將Intent映射給可以處理此Intent的Activity、IntentReceiver或Service。Intent解析機(jī)制主要是通過(guò)查找已注冊(cè)在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,最終找到匹配的Intent。在這個(gè)解析過(guò)程中,Android是通過(guò)Intent的action、type、category這三個(gè)屬性來(lái)進(jìn)行判斷的,判斷方法如下:

如果Intent指明定了action,則目標(biāo)組件的IntentFilter的action列表中就必須包含有這個(gè)action,否則不能匹配;如果Intent沒(méi)有提供type,系統(tǒng)將從data中得到數(shù)據(jù)類(lèi)型。和action一樣,目標(biāo)組件的數(shù)據(jù)類(lèi)型列表中必須包含Intent的數(shù)據(jù)類(lèi)型,否則不能匹配。如果Intent中的數(shù)據(jù)不是content:類(lèi)型的URI,而且Intent也沒(méi)有明確指定它的type,將根據(jù)Intent中數(shù)據(jù)的scheme(比如http:或者mailto:)進(jìn)行匹配。同上,Intent的scheme必須出現(xiàn)在目標(biāo)組件的scheme列表中。如果Intent指定了一個(gè)或多個(gè)category,這些類(lèi)別必須全部出現(xiàn)在組建的類(lèi)別列表中。比如Intent中包含了兩個(gè)類(lèi)別U:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目標(biāo)組件必須至少包含這兩個(gè)類(lèi)別。Intent-Filte的定義一些屬性設(shè)置的例子:〈actionandroid:name=〃ject.SHOW_CURRENT〃/><categoryandroid:name=〃ent.category.DEFAULT〃/><dataandroid:mimeType="video/mpeg"android:scheme="http".../><dataandroid:mimeType=〃image/*〃/><dataandroid:scheme="http"android:type=〃video/*〃/>完整的實(shí)例<activityandroid:name="NotesList"android:label="@string/title_notes_list"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter><intent-filter><actionandroid:name="ent.action.VIEW"/><actionandroid:name="ent.action.EDIT"/><actionandroid:name="ent.action.PICK"/><categoryandroid:name="ent.category.DEFAULT"/><dataandroid:mimeType="vnd.android.cursor.dir/vnd.google.note"/></intent-filter><intent-filter><actionandroid:name="ent.action.GET_CONTENT"/>

<categoryandroid:name="ent.category.DEFAULT"/><dataandroid:mimeType="vnd.android.cursor.item/vnd.google.note"/></intent-filter></activity>Intent用法實(shí)例無(wú)參數(shù)Activity跳轉(zhuǎn)Intentit=newIntent(Activity.Main.this,Activity2.class);startActivity(it);向下一個(gè)Activity傳遞數(shù)據(jù)(使用Bundle和Intent.putExtras)Intentit=newIntent(Activity.Main.this,Activity2.class);Bundlebundle=newBundle();bundle.putString("name”,"ThisisfromMainActivity!");it.putExtras(bundle);//it.putExtra(“test”,"shuju”);startActivity(it);//startActivityForResult(it,REQUEST_CODE);對(duì)于數(shù)據(jù)的獲取可以采用:Bundlebundle=getIntent().getExtras();Stringname=bundle.getString("name");向上一個(gè)Activity返回結(jié)果(使用setResult,針對(duì)startActivityForResult(it,REQUEST_CODE)啟動(dòng)的Activity)Intentintent=getIntent();Bundlebundle2=newBundle();bundle2.putString("name","ThisisfromShowMsg!");intent.putExtras(bundle2);setResult(RESULT_OK,intent);回調(diào)上一個(gè)Activity的結(jié)果處理函數(shù)(onActivityResult)?OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata)(//TODOAuto-generatedmethodstubsuper.onActivityResult(requestCode,resultCode,data);if(requestCode==REQUEST_CODE)(if(resultCode==RESULT_CANCELED)

setTitle("cancle");elseif(resultCode==RESULT_OK)(Stringtemp=null;Bundlebundle=data.getExtras();if(bundle!=null)temp=bundle.getString("name");setTitle(temp);}}}下面是轉(zhuǎn)載來(lái)的其他的一些Intent用法實(shí)例(轉(zhuǎn)自javaeye)顯示網(wǎng)頁(yè)Uriuri=Uri.parse("");Intentit=newIntent(Intent.ACTION_VIEW,uri);startActivity(it);顯示地圖Uriuri=Uri.parse("geo:38.899533,-77.036476");Intentit=newIntent(Intent.ACTION_VIEW,uri);startActivity(it);//其他geoURI簸例//geo:latitude,longitude//geo:latitude,longitude?z=zoom//geo:0,0?q=my+street+address//geo:0,0?q=business+near+city//google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom路徑規(guī)劃Uriuri=Uri.parse("/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");Intentit=newIntent(Intent.ACTION_VIEW,uri);startActivity(it);//wherestartLat,startLng,endLat,endLngarealongwith6decimalslike:50.123456打電話//叫出撥號(hào)程序Uriuri=Uri.parse("tel:0800000123");Intentit=newIntent(Intent.ACTION_DIAL,uri);startActivity(it);//直接打電話出去Uriuri=Uri.parse("tel:0800000123");Intentit=newIntent(Intent.ACTION_CALL,uri);startActivity(it);//用逼彳固,要在AndroidManifest.xml中,加上//<uses-permissionid="android.permission.CALL_PHONE"/>傳送SMS/MMS〃調(diào)用短信程序Intentit=newIntent(Intent.ACTION_VIEW,uri);it.putExtra("sms_body”,"TheSMStext");it.setType("vnd.android-dir/mms-sms");startActivity(it);〃傳送消息Uriuri=Uri.parse("smsto://0800000123");Intentit=newIntent(Intent.ACTION_SENDTO,uri);it.putExtra("sms_body”,"TheSMStext");startActivity(it);//傳送MMSUriuri=Uri.parse("content://media/external/images/media/23”);Intentit=newIntent(Intent.ACTION_SEND);it.putExtra("sms_body”,"sometext");it.putExtra(Intent.EXTRA_STREAM,uri);it.setType("image/png");startActivity(it);傳送EmailUriuri=Uri.parse("mailto:xxx@");Intentit=newIntent(Intent.ACTION_SENDTO,uri);startActivity(it);Intentit=newIntent(Intent.ACTION_SEND);it.putExtra(Intent.EXTRA_EMAIL,"me@");it.putExtra(Intent.EXTRA_TEXT,"Theemailbodytext");it.setType("text/plain");startActivity(Intent.createChooser(it,"ChooseEmailClient"));Intentit=newIntent(Intent.ACTION_SEND);String[]tos={"me@"};String[]ccs={"you@"};it.putExtra(Intent.EXTRA_EMAIL,tos);it.putExtra(Intent.EXTRA_CC,ccs);it.putExtra(Intent.EXTRA_TEXT,"Theemailbodytext");it.putExtra(Intent.EXTRA_SUBJECT,"Theemailsubjecttext");it.setType("message/rfc822");startActivity(Intent.createChooser(it,"ChooseEmailClient"));//傳送附件Intentit=newIntent(Intent.ACTION_SEND);it.putExtra(Intent.EXTRA_SUBJECT,"Theemailsubjecttext");it.putExtra(Intent.EXTRA_STREAM,"file:///sdcard/mysong.mp3");sendInt

溫馨提示

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

評(píng)論

0/150

提交評(píng)論