




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Android內(nèi)容總結(jié)1.android四大組件:activity、service服務(wù)、contentprovider內(nèi)容提供者、BroadCastReciver廣播接收器。Activity:應(yīng)用程序中,一個activity通常就是一個獨立的屏幕,上面可以顯示一些控件也可以監(jiān)聽并處理用戶的事件做出相應(yīng)。Activity之間使用intent通信。在intent的描述結(jié)構(gòu)中,有兩個最重要的部分:動作和動作對應(yīng)的數(shù)據(jù)。典型的動作類型有:main(activity門戶)、pick、edit、view等。而動作對應(yīng)的數(shù)據(jù)以url的形式表示。例如:要查看一個人的聯(lián)系方式,你需要創(chuàng)建一個動作類型為VIEW的
2、intent,以及一個表示這個人的URI。與之有關(guān)系的一個類:intentfilter。相對于intent是一個有效的做某事的請求,一個intentfilter則用于描述一個activity或者intentreceiver能夠操作那些intent。一個activity如果要顯示一個人的聯(lián)系方式時,需要聲明一個intentfilter,這個intentfilter要知道怎么去處理view動作和表示一個人的url。Intentfilter需要在androidmanifest.xml中定義。通過解析各種intent,從一個屏幕導(dǎo)航到另一個屏幕是很簡單的。當(dāng)向前導(dǎo)航時,activity會調(diào)用start
3、activity(intentmyintent),然后,系統(tǒng)會在所有安裝的應(yīng)用程序中定義的intentfilter中查找,找到最匹配的myintent的intent對應(yīng)的activity。新的activity家收到myintent的通知后,開始運行。當(dāng)startactivity方法被調(diào)用將觸發(fā)解析myintent的動作,這個機制提供了兩個關(guān)鍵好處:Activitys能夠重復(fù)利用從其他組件中以intent的形式產(chǎn)生的請求。Activitys可以在任何時候被一個具有相同intentfilter的新activity取代配置啟動項的activity<intent-filter><ac
4、tionandroid:name=”ent.action.MAIN”/><actionandroid:name=”ent.category.LAUNCHER”/></intent-filter>BroadCastReceiver廣播接收器:應(yīng)用可以使用它對外部事件進行過濾,只對感興趣的外部事件(如電話呼入時,數(shù)據(jù)網(wǎng)絡(luò)可用時)進行接收并作出響應(yīng)。廣播接收器沒有用戶界面。可以在啟動activity或者service來響應(yīng)它們接收到的信息,或者使用notificationmanager來通知用戶。通知可以用很多種方式來吸引用戶
5、的注意力閃動背燈、震動等。一般來說,閃在狀態(tài)欄中放上一個持久的圖標(biāo),用可以打開它并獲取消息。廣播類型:普通廣播,通過Context.sendBroadcast(intentmyintent)發(fā)送的有序廣播:通過Context.sendOrderedBroadcast(intent,receiverpermissin)發(fā)送的。第二個參數(shù)決定該廣播的級別,-1000到1000之間,值越大,發(fā)送的優(yōu)先級越高;廣播接受者接受廣播時的級別可通過intentfilter中的priority進行設(shè)置為2147483647時優(yōu)先級最高,同級別的接收的先后是隨機的,在到級別低的收到廣播,高級別的或同級別先接收到
6、廣播的可以通過abortBroadcast()方法截斷廣播使其它的接受者無法收到該廣播,還有其他構(gòu)造函數(shù)。異步廣播:通過Context.sendStickyBroadcast(intentmyintent)發(fā)送的,還有sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,initialData,initialExtras)方法,該方法具有有序廣播的特性也有異步廣播的特性;發(fā)送異步廣播要:<uses-permissionandroid:name="android.permission.BROA
7、DCAST_STICKY"/>權(quán)限,接收并處理完Intent后,廣播依然存在,直到你調(diào)用removeStickyBroadcast(intent)主動把它去掉。注:發(fā)送廣播時的intent參數(shù)與context.startactivity()啟動時的intent不同,前者可以被多個訂閱它的廣播接收器調(diào)用,后者只能被activity或service調(diào)用。監(jiān)聽廣播intent步驟:1、寫一個繼承broadcastreceiver的類,重寫onreceive()方法,廣播接收器僅在它執(zhí)行這個方法時處于活動狀態(tài),當(dāng)onreceive()返回后,即為失活狀態(tài)。為了保證用戶交互過程的流暢,一
8、些費時操作要放到線程中2、注冊廣播接收者,有動態(tài)注冊和靜態(tài)注冊靜態(tài)注冊:<receiverandroid:name=".SMSBroadcastReceiver"><intent-filterandroid:priority="2147483647"><actionandroid:name="vider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>動態(tài)注冊,一般在Activity可交互時onRe
9、sume()內(nèi)注冊BroadcastReceiverIntentFilterintentFilter=newIntentFilter("vider.Telephony.SMS_RECEIV"registerReceiver(mBatteryInfoReceiver,intentFilter);/反注冊unregisterReceiver(receiver);生命周期只有十秒左右,如果在onreceive()內(nèi)做超出十秒內(nèi)的事情,就會報anr(applicationnoresponse)程序無響應(yīng)的錯誤信息,如果需要完成一項比較耗時的工作,應(yīng)該通過發(fā)送i
10、ntent給service,由service來完成,這里不能使用子線程來解決,因為broadcastreceiver的生命周期很短,子線程還沒有結(jié)束broadcastreceiver就結(jié)束了。Broadcastreceiver一旦結(jié)束,此時broadcastreceiver的所在進程很容易在系統(tǒng)需要內(nèi)存時被優(yōu)先殺死,因為他屬于空進程。如果它的宿主進程被殺死,那么正在工作的子線程也會被殺死,所以采用子線程來解決時不可靠的。動態(tài)注冊廣播接收器的一個特點:當(dāng)用來注冊的activity關(guān)掉后,廣播也就失效了,靜態(tài)注冊無需擔(dān)憂廣播接收器是否被關(guān)閉,只要是設(shè)是開啟狀態(tài)。光比接收器也是打開著的。也就是說哪怕
11、app本身未啟動,該app在訂閱的廣播在觸發(fā)時也會對他器作用系統(tǒng)常見廣播intent:開機啟動、電池電量變化、時間改變等廣播Service服務(wù):一個service時一段長生命周期的,沒有用戶界面的程序,可以用來開發(fā)如監(jiān)控類的程序。Service使用步驟:1、繼承service類2、在Androidmanifest.xml配置清單文件中<application>節(jié)點中對服務(wù)進行配置<servicename=”/>服務(wù)不能自己運行,需要通過context.startservice()或者conext.bindservice()啟動服務(wù)通過前者啟動服務(wù)于調(diào)用者沒有關(guān)系,即使調(diào)
12、用者關(guān)閉了,服務(wù)器仍然像停止服務(wù)要調(diào)用context.stopservice()。此時系統(tǒng)會自動調(diào)用ondestory(),使用此方法啟動時,服務(wù)首次啟動系統(tǒng)先調(diào)用服務(wù)的oncreate()-onstart(),如果服務(wù)已經(jīng)啟動再次調(diào)用只會觸發(fā)onstart()方法。使用后者啟動服務(wù)與調(diào)用者綁定,只要調(diào)用者關(guān)閉服務(wù)就終止,使用此方法啟動時,服務(wù)首次啟動系統(tǒng)先調(diào)用服務(wù)的onCreate()->onBind(),如果服務(wù)已經(jīng)啟動再次調(diào)用不會再觸發(fā)這2個方法,調(diào)用者退出時系統(tǒng)會調(diào)用服務(wù)的onUnbind()->onDestory(),想主動解除綁定可使用Contex.unbindServ
13、ice(),系統(tǒng)依次調(diào)用onUnbind()->onDestory();Contentprovider內(nèi)容提供者Android平臺提供了contentprovider使一個應(yīng)用程序的指定數(shù)據(jù)集提供給其他應(yīng)用程序。這些數(shù)據(jù)可以存儲在文件系統(tǒng)中、在一個sqlite、或以任何其他合理的方式。其他應(yīng)用可以通過ContentResolver類(ContentProviderAccessApp例子)從該內(nèi)容提供者中獲取或則存入數(shù)據(jù)。只有需要在多個應(yīng)用程序間共享數(shù)據(jù)才需要內(nèi)容提供者。好處:統(tǒng)一數(shù)據(jù)訪問方式。Android系統(tǒng)自帶的內(nèi)容提供者,這些內(nèi)容提供者在sdk文檔中vider
14、java包中都有介紹。mediastore如:browser、calllog、contacts(groups、people、phones、photos)、images(thumbnails)、mediastore(albums、artists、audio、genres、playlists)、settings、videoCalllog:地址和接收到電話信息Contact.people.phones:存儲電話信息Setting.system:系統(tǒng)設(shè)置和偏好設(shè)置使用contentprovider對外共享數(shù)據(jù)的步驟1、繼承contentprovider類并根據(jù)需求重寫方法2、在Androidmanif
15、est.xml當(dāng)中使用<provider>對contentprovider進行配置注冊(內(nèi)容提供者注冊它自己就像網(wǎng)站注冊域名),ContentProvider采用authoritie(原意授權(quán),可理解為域名)作為唯一標(biāo)識,方便其他應(yīng)用能找到生命周期Android應(yīng)用程序的生命周期是由android框架進行管理,而不是由應(yīng)用程序直接控制。通常,每一個應(yīng)用程序,都會產(chǎn)生一個進程。當(dāng)系統(tǒng)內(nèi)存即將不足的時候,會按照優(yōu)先級自動進行進程的回收。不管是使用者和開發(fā)者,都無法確定應(yīng)用程序何時會被回收。Activity生命周期四種狀態(tài),7個重要方法和三個嵌套循環(huán)1>四種狀態(tài)活動(Active/
16、Running)狀態(tài)當(dāng)Activity運行在屏幕前臺(處于當(dāng)前任務(wù)活動棧的最上面),此時它獲取了焦點能響應(yīng)用戶的操作,屬于運行狀態(tài),同一個時刻只會有一個Activity處于活動(Active)或運行(Running)狀態(tài)暫停(Paused)狀態(tài)當(dāng)Activity失去焦點但仍對用戶可見(如在它之上有另一個透明的Activity或Toast、AlertDialog等彈出窗口時)它處于暫停狀態(tài)。暫停的Activity仍然是存活狀態(tài)(它保留著所有的狀態(tài)和成員信息并保持和窗口管理器的連接),但是當(dāng)系統(tǒng)內(nèi)存極小時可以被系統(tǒng)殺掉。用戶啟動了Activity,正在運行,而且可見,但是一個通知或者其他的提示出現(xiàn)
17、在屏幕的最上層,此時可以看到Activity但是不能和它交互。比如有電話進來,用戶可以選擇接聽或者忽略;停止(Stopped)狀態(tài)完全被另一個Activity遮擋時處于停止?fàn)顟B(tài),它仍然保留著所有的狀態(tài)和成員信息。只是對用戶不可見,當(dāng)其他地方需要內(nèi)存時它往往被系統(tǒng)殺掉。用戶啟動了Activity,正在運行,但是因為其他Activity的啟動或者切換而隱藏。這時該activity不能直接操作,除了通過通知;非活動(Dead)狀態(tài)Activity尚未被啟動、已經(jīng)被手動終止,或已經(jīng)被系統(tǒng)回收時處于非活動的狀態(tài),要手動終止Activity,可以在程序中調(diào)用"finish"方法。act
18、ivity不在是啟動的,比如電話做了重置(reset),或者activity被終止,比如因為內(nèi)存不夠了。如果是(按根據(jù)內(nèi)存不足時的回收規(guī)則)被系統(tǒng)回收,可能是因為內(nèi)存不足了內(nèi)存不足時,Dalvak虛擬機會根據(jù)其內(nèi)存回收規(guī)則來回收內(nèi)存:1.先回收與其他Activity或Service/IntentReceiver無關(guān)的進程(即優(yōu)先回收獨立的Activity)因此建議,我們的一些(耗時)后臺操作,最好是作成Service的形式2.不可見(處于Stopped狀態(tài)的)Activity3.Service進程(除非真的沒有內(nèi)存可用時會被銷毀)4.非活動的可見的(Paused狀態(tài)的)Activity5.當(dāng)前
19、正在運行(Active/Running狀態(tài)的)Activity2>7個重要方法,當(dāng)Activity從一種狀態(tài)進入另一狀態(tài)時系統(tǒng)會自動調(diào)用下面相應(yīng)的方android系統(tǒng)通過調(diào)用一些約定的activity方法,來轉(zhuǎn)換activity的狀態(tài)。onCreate()方法和onDestroy()方法onCreate()方法被調(diào)用的情況:1. 當(dāng)activity第一次被創(chuàng)建的時候,帶null參數(shù);2. 如果activity已經(jīng)運行過,后來被kill掉,將調(diào)用帶Bundle參數(shù)的onCreate()方法,該參數(shù)來源于onSaveInstanceState()3. 當(dāng)activity處于不同的設(shè)備狀態(tài)時,
20、比如從豎顯到橫顯,將會調(diào)用onCreate()方法重建activityonDestroy被調(diào)用的情況,即當(dāng)activity關(guān)閉的情況:1. activity執(zhí)行了finish()方法2. android需要RAM,可能會緊急關(guān)閉activity需要注意的是,如果內(nèi)存十分緊急,可能不會調(diào)用onDestroy方法,而是系統(tǒng)不顧一切的關(guān)閉掉,比如來電話的時候。onDestroy()通常用于釋放在onCreate()方法中獲得的資源。onStart()、onRestart()和onStop()方法activity在前臺執(zhí)行,可能因為是第一次啟動,或者從隱藏狀態(tài)重新帶回前臺(比如其他的activity或
21、者來電話)。以上情況都會執(zhí)行onStart()。onRestart()方法會在activity已經(jīng)停止,重新開始的時候調(diào)用。onStop()方法在activity要停止的時候調(diào)用。onPause()和onResume()方法onResume()方法在activity要前臺運行的時候執(zhí)行,比如第一次初始啟動后,或者從停止(stop)狀態(tài)重新開始,或者當(dāng)一個彈出對話框被清除(比如來電話)。這是刷新UI的最佳位置,可以在此方法中刷新視圖,或者調(diào)用后臺線程更新UI。相應(yīng)的,當(dāng)其他activity奪取了當(dāng)前activity的控制權(quán)后,需要調(diào)用當(dāng)前activity的onPause()方法。在此方法中,應(yīng)該
22、取消任何在onResume()方法中做的事情。比如關(guān)閉后臺線程,釋放任何獨占方位的資源(比如攝像頭)。一旦onPause()方法被調(diào)用,android系統(tǒng)將保留對此activity所在進程在任何時刻kill的權(quán)利。因此在此狀態(tài)下不會可靠的收到將來的事件消息。對狀態(tài)的合理處理一般情況下,上述方法會處理應(yīng)用程序通用的事情。比如通過onCreate()方法關(guān)聯(lián)出最后的UI,通過onPause()方法關(guān)閉后臺線程。但有時需要為activity保存狀態(tài)。比如有個計算器程序activity,計算結(jié)果后,可能又做了其他事情,用戶回頭想查剛才計算的結(jié)果。因為計算器有可能因為內(nèi)存稀缺而關(guān)閉。這時需要使用onSa
23、veInstanceState()方法,android會通過該方法保存狀態(tài),可以覆蓋該方法保存自己的狀態(tài)值到Bundle。然后通過onCreate()或者onRestoreInstanceState()方法得到Bundle對象實例恢復(fù)這些自定義狀態(tài)。3>3個嵌套循環(huán)1.Activity完整的生命周期:從第一次調(diào)用onCreate()開始直到調(diào)用onDestroy()結(jié)束2.Activity的可視生命周期:從調(diào)用onStart()到相應(yīng)的調(diào)用onStop()在這兩個方法之間,可以保持顯示Activity所需要的資源。如在onStart()中注冊一個廣播接收者監(jiān)聽影響你的UI的改變,在onS
24、top()中注銷。3.Activity的前臺生命周期:從調(diào)用onResume()到相應(yīng)的調(diào)用onPause()。BroadcastReceive廣播接收器生命周期:生命周期只有十秒左右,如果在onReceive()內(nèi)做超過十秒內(nèi)的事情,就會報ANR(ApplicationNoResponse)程序無響應(yīng)的錯誤信息它的生命周期為從回調(diào)onReceive()方法開始到該方法返回結(jié)果后結(jié)束Service生命周期Service完整的生命周期:從調(diào)用oncreate()開始直接到調(diào)用ondestory()結(jié)束Service有兩種使用方法:1>以調(diào)用Context.startService()啟動,
25、而以調(diào)用Context.stopService()結(jié)束2>以調(diào)用Context.bindService()方法建立,以調(diào)用Context.unbindService()關(guān)閉service重要的生命周期方法當(dāng)用戶調(diào)用startService()或bindService()時,Service第一次被實例化的時候系統(tǒng)會調(diào)用,整個生命周期只調(diào)用1次這個方法,通常用于初始化設(shè)置。注意:多次調(diào)用startService()或bindService()方法不會多次觸發(fā)onCreate()方法voidonCreate()當(dāng)用戶調(diào)用stopService()或unbindService()來停止服務(wù)時被系
26、統(tǒng)調(diào)用,(整個生命周期只調(diào)用1次)用來釋放onCreate()方法中創(chuàng)建的資源voidonDestroy()通過startService()方法啟動的服務(wù)初始化結(jié)束后系統(tǒng)會調(diào)用該方法,用于處理傳遞給startService()的Intent對象。如音樂服務(wù)會打開Intent來探明將要播放哪首音樂,并開始播放。注意:多次調(diào)用startService()方法會多次觸發(fā)onStart()方法voidonStart(Intentintent)通過bindService()方法啟動的服務(wù)初始化結(jié)束后系統(tǒng)會調(diào)用該方法,用來綁定傳遞給bindService的Intent的對象。注意:多次調(diào)用bindServ
27、ice()時,如果該服務(wù)已啟動則不會再觸發(fā)此方法IBinderonBind(Intentintent)用戶調(diào)用unbindService()時系統(tǒng)調(diào)用此方法,Intent對象同樣傳遞給該方法booleanonUnbind(Intentintent)如果有新的客戶端連接至該服務(wù),只有當(dāng)舊的調(diào)用onUnbind()后,新的才會調(diào)用該方法voidonRebind(Intentintent)Activity應(yīng)用表示層(基類Activity)應(yīng)用程序中的每個屏幕都是通過繼承和擴展基類Activity來實現(xiàn)的。同一應(yīng)用中的每個Activity是相互獨立的。程序啟動后顯示的第一幅畫面是應(yīng)用程序的第一個Act
28、ivity(默認窗口),而后可以根據(jù)需要從這個Activity啟動另一個新的Activity。Activity利用View來實現(xiàn)應(yīng)用中的GUI(用戶直接通過GUI和應(yīng)用程序做交互)。Activity窗口內(nèi)的可見內(nèi)容通過基類View提供。使用Activity.setContentView()方法設(shè)置當(dāng)前Activity中的View對象。每個View對象控制著窗口內(nèi)的一個矩形空間;View是一種層次化結(jié)構(gòu),ParentView中的布局屬性會被子View繼承;位于View層次關(guān)系最底層的子View對象所代表的矩形空間就是跟用戶進行交互的地方Activity狀態(tài)回調(diào):onCreateonStarton
29、RestartonResumeonPauseonStoponDestroyService沒有可見的用戶界面,但能夠長時間運行于后臺(基類Service)運行于應(yīng)用程序進程的主線程中,因此Service不會阻塞其他組件和用戶界面。Service是不能自己啟動的,必須通過Context對象(如一個Activity)調(diào)用startService或bindService方法來啟動(用這兩種方法啟動的Service的生命周期不同)。1.調(diào)用startService方法a)若Service沒有啟動,則首先會調(diào)用該Service的onCreate方法,然后再調(diào)用onStart方法。b)若Service已經(jīng)啟
30、動,則會直接調(diào)用onStart方法c)該方法啟動的Service,可以通過Context對象調(diào)用stopService來關(guān)閉,也可以通過Service自身調(diào)用stopSelf()或stopSelfResult()來關(guān)閉,關(guān)閉之前調(diào)用onDestory方法。2.調(diào)用bindService方法,使當(dāng)前Context對象通過一個ServiceConnection的對象綁定到所指定的Servicea)若Service沒有啟動,則首先會調(diào)用該Service的onCreate方法初始化啟動,然后調(diào)用Service的onBind方法初始化綁定。b)如果綁定Service的Context對象被銷毀時,被綁定的
31、Service也會調(diào)用onUnbind和onDestroy方法停止運行c)注意:BroadcastReceiver是不能綁定服務(wù)的。d)一個綁定Service的Context對象還可以通過unbindService()來取消對服務(wù)的綁定。e)取消時,Service會調(diào)用unbind方法,若Service是通過bindService來啟動的,還會調(diào)用onDestroy方法來停止服務(wù)。Service狀態(tài)回調(diào):onCreateonStartonBindonRebindonUnbindonDestroyBroadcastReceiver用戶接收廣播通知的組件(基類BroadcastReceiver)A
32、ndroid中的廣播要么來自于系統(tǒng),要么來自普通應(yīng)用程序。很多事件都可能導(dǎo)致系統(tǒng)廣播,如手機所在時區(qū)發(fā)生變化,電池電量低,用戶改變系統(tǒng)語言設(shè)置等。來自普通應(yīng)用程序,如一個應(yīng)用程序通知其他應(yīng)用程序某些數(shù)據(jù)已經(jīng)下載完畢。為了響應(yīng)不同的事件通知,應(yīng)用程序可以注冊不同的BroadcastReceiver。所有的BroadcastReceiver都繼承自基類BroadcastReceiver。BroadcastReceiver自身并不實現(xiàn)圖形用戶界面,但是當(dāng)它收到某個通知后,BroadcastReceiver可以啟動Activity作為響應(yīng),或者通過NotificationMananger提醒用戶。Br
33、oadcastReceiver是對發(fā)送出來的Broadcast進行過濾接收并響應(yīng)的一類組件。發(fā)送Broadcast信息1.把要發(fā)送的信息和用于過濾得信息(如Action、Category)裝入一個Intent對象2.調(diào)用Context.sendBroadcast()、sendOrderBroadcast()、sendStickyBroadcast()方法,廣播該Intent對象3.使用sendBroadcast()或sendStickyBroadcast()方法發(fā)出去的Intent,所有滿足條件的BroadcastReceiver都會隨機地執(zhí)行其onReceive()方法;4.而sendOrd
34、erBroadcast()發(fā)出去的Intent,會根據(jù)BroadcastReceiver注冊時IntentFilter設(shè)置的優(yōu)先級的順序來執(zhí)行,相同優(yōu)先級的BroadcastReceiver則是隨機執(zhí)行5.sendStickyBroadcast()方法主要的不同是,Intent在發(fā)送后一直存在,并且在以后調(diào)用registerReceiver()注冊相匹配的Intent時會把這個Intent直接返回。6.若在使用sendBroadcast()方法時指定了接收的權(quán)限,這只有在AndroidManifest.xml中用<uses-permission>標(biāo)簽聲明了擁有此權(quán)限的Broadca
35、stReceiver才會有可能接收到發(fā)送來Broadcast。7.若在注冊BroadcastReciever時,指定了可接收的Broadcast的權(quán)限,則只有在包內(nèi)的AndroidManifest.xml中用<uses-permission>標(biāo)簽聲明了,擁有此權(quán)限的Context對象所發(fā)送的Broadcast才有可能被這個BroadcastReceiver所接收。接收Broadcast消息1.繼承BroadcastReceiver類,并實現(xiàn)onReceive方法2.注冊BroadcastReceiver(有2種方法:一種方法是,靜態(tài)地在AndroidManifest.xml中用&l
36、t;receiver>標(biāo)簽聲明,并在標(biāo)簽內(nèi)用<intent-filter>標(biāo)簽設(shè)置過濾器;另一種方法,動態(tài)地在代碼中先定義并設(shè)置好一個IntentFilter對象,然后再需要注冊的地方調(diào)用Context.registerReceiver()方法)(取消注冊時,調(diào)用Context.unregisterReceiver()方法)ContentProvider為解決應(yīng)用程序間數(shù)據(jù)通信、共享的問題(基類ContentProvider)在Android中,每個應(yīng)用程序都是用自己的用戶ID并在自己的進程中運行。這樣的好處是,可以有效地保護系統(tǒng)及應(yīng)用程序,避免被其他不正常德應(yīng)用程序所影響,
37、每個進程都擁有獨立的進程地址空間和虛擬空間。ContentProvider可以將應(yīng)用程序特定的數(shù)據(jù)提供給另一個應(yīng)用程序使用。其數(shù)據(jù)存儲方式可以是Android文件系統(tǒng)、SQLite數(shù)據(jù)庫或者其他合理的方式。當(dāng)數(shù)據(jù)需要在應(yīng)用程序間共享時,我們就可以利用ContentProvider為數(shù)據(jù)定義一個URI。之后,其他應(yīng)用程序?qū)?shù)據(jù)進行查詢或者修改時,只需要從當(dāng)前上下文對象獲得一個ContentResolver,然后傳入響應(yīng)的URI就可以了。ContentProvider繼承自基類ContentProvider,并且實現(xiàn)了一組標(biāo)準接口。通過這組接口,其他應(yīng)用程序能對數(shù)據(jù)進行讀寫和存儲。然而,需要使用數(shù)
38、據(jù)的應(yīng)用程序并不是直接調(diào)用這組方法,而是通過調(diào)用ContentResolver對象的方法來完成。ContentResolver對象可以與任意ContentProvider通信。要為當(dāng)前應(yīng)用程序的私有數(shù)據(jù)定義URI,就需要專門定義一個繼承自ContentProvider的類,然后根據(jù)不同的操作調(diào)用的方法去實現(xiàn)這些方法的功能。ContentResolver類為應(yīng)用程序提供了接入Content機制的方法。要構(gòu)造一個ContentResolver對象可以為構(gòu)造方法ContentResolver(Contextcontext)傳入一個Context對象,也可以直接通過Context對象調(diào)用getCont
39、entResolver()方法獲得有的ContentResolver對象后,就可以通過調(diào)用其query()、insert()、update()等方法來對數(shù)據(jù)進行操作了。一旦需要以上4種Android應(yīng)用程序基本組件完成請求,Android會首先確認該組件所在進程是否運行,如果沒有運行,Android將先啟動進程,同時確認被請求組件的實例是否存在,否則將創(chuàng)建一個新的組件實例。Intent連接組件的紐帶以上4種基本組件中,除了ContentProvider是通過ContentResolver激活外,其他3種組件Activity、Service和BroadcastReceiver都是由Intent異
40、步消息激活的。Intent在不同的組件之間傳遞消息,將一個組件的請求意圖傳給另一個組件。因此,Intent是包含具體請求信息的對象。針對不同的組件,Intent所包含的消息內(nèi)容有所不同,且不同組件的激活方式也不同,且不同類型組件有傳遞Intent的不同方式。Intent是一種運行時綁定(runtimebinding)機制,它能夠在程序運行的過程中連接兩個不同的組件。通過Intent,你的程序可以向Android表到某種請求或者意愿,Android會根據(jù)意愿的內(nèi)容選擇適當(dāng)?shù)慕M件來處理請求。激活一個新的Activity,或者讓一個現(xiàn)有的Activity執(zhí)行一個新的操作,可以通過調(diào)用如下兩種方法(這
41、兩匯總方法需要傳入的Intent參數(shù)稱為ActivityActionIntent):1.Context.startActivity()2.Activity.startActivityForResult()啟動一個新的服務(wù),或者向一個已有的服務(wù)傳遞新的指令,可以調(diào)用如下兩種方法:1.Context.startService()2.Context.bindService()發(fā)送廣播Intent(所有已注冊的擁有與之相匹配IntenFilter的BroadcastReceiv就會被激活),可以調(diào)用如下三種方法:1.Context.sendBroadcast()2.Context.sendOrderB
42、roadcast()3.Context.sendStickBroadcast()Intent一旦發(fā)出,Android都會準確找到相匹配的一個或多個Activity、Service或BroadcastReceiver作響應(yīng)。所以,不同類型的Intent消息不會出現(xiàn)重疊,BroadcastIntent消息只會發(fā)送給BroadcastReceiver,而絕不可能發(fā)送給Activity或Server。有startActivity()傳遞的消息也只可能發(fā)送給Activity,由startService()傳遞的Intent只可能發(fā)送給Service。Intent對象抽象地描述了執(zhí)行操作,Intent的主
43、要組成部分;1.目標(biāo)組件名稱??蛇x項a)組件名稱是一個ComponentName對象,是目標(biāo)組件類名和目標(biāo)組件所在應(yīng)用程序包的組合b)組件中的包名不一定要和manifes文件中包名完全匹配c)如果Intent消息中指明了目標(biāo)組件的名稱,這就是一個顯示消息,Intent會傳遞給指明的組件。d)如果目標(biāo)組件名稱并沒有指定,Android則通過Intent內(nèi)的其他信息和已注冊的IntentFilter的比較來選擇合適的目標(biāo)組件2.Action隱式比較a)描述Intent所觸發(fā)動作的名字字符串。b)理論上Action可以為任何字符串,而與Android系統(tǒng)應(yīng)用有關(guān)的Action字符串以靜態(tài)字符串常量的
44、形式定義在了Intent類中。3.Data隱式比較a)描述Intent要操作的的數(shù)據(jù)的URI和數(shù)據(jù)類型。b)正確設(shè)置Intent的數(shù)據(jù)對于Android尋找系統(tǒng)中匹配Intent請求的組件很重要。4.Category隱式比較a)是對被請求組件的額外描述信息。b)Android也在Intent類中定義了一組靜態(tài)字符串常量表示Intent不同的類別。5.Extraa)當(dāng)我們使用Intent連接不同組件時,有時需要在Intent中附加額外的信息,以便將數(shù)據(jù)傳遞給目標(biāo)Activity。b)Extra用鍵值對結(jié)構(gòu)保存在Intent對象當(dāng)中,Intent對象通過調(diào)用方法putExtras()和getExt
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 礦石買賣運輸合同范本
- 危廢處置合同范本
- 醫(yī)院標(biāo)識設(shè)計合同范本
- 農(nóng)村聯(lián)營合同范本
- 反恐安全運輸合同范例
- 上半年政務(wù)工作總結(jié)
- 危運司機合同范本
- 設(shè)備保養(yǎng)合同范本
- 合伙做母嬰店合同范本
- 產(chǎn)品批發(fā)代銷合同范本
- AQ6111-2023個體防護裝備安全管理規(guī)范
- GGD交流低壓配電柜運行、維護說明書、安裝、操作手冊
- JCT2354-2016 衛(wèi)生陶瓷企業(yè)安全生產(chǎn)規(guī)范
- 2024年全國國家版圖(中小學(xué)組)知識競賽題庫及答案
- QBT 2605-2003 工業(yè)氯化鎂行業(yè)標(biāo)準
- 2024年江西機電職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫帶答案
- 《拒絕沉迷手機遠離“垃圾快樂”》班會課件
- 普通高中政治課程標(biāo)準測試題及答案
- 2024年知識競賽-《民用爆炸物品安全管理條例》知識競賽筆試參考題庫含答案
- 屋頂 屋頂?shù)呐潘O(shè)計 屋頂?shù)呐潘绞剑ńㄖ?gòu)造)
- Web-of-sciencenew文獻檢索-課件
評論
0/150
提交評論