《Android移動(dòng)應(yīng)用開發(fā)》創(chuàng)建Service_第1頁
《Android移動(dòng)應(yīng)用開發(fā)》創(chuàng)建Service_第2頁
《Android移動(dòng)應(yīng)用開發(fā)》創(chuàng)建Service_第3頁
《Android移動(dòng)應(yīng)用開發(fā)》創(chuàng)建Service_第4頁
《Android移動(dòng)應(yīng)用開發(fā)》創(chuàng)建Service_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Service2023/9/28092023/9/28認(rèn)識Service創(chuàng)建Service目錄CONTENT12啟動(dòng)Service3綁定Service4參考教材:《Android應(yīng)用開發(fā)項(xiàng)目化教程》認(rèn)識Service作用Service是一種應(yīng)用組件,它可以長時(shí)間的在后臺運(yùn)行并且不提供任何用戶界面。Service主要負(fù)責(zé)更新數(shù)據(jù)源和可見的Activity,并觸發(fā)Notification。Service可以由其他應(yīng)用組件啟動(dòng)并在后臺運(yùn)行,即使用戶切換到其他應(yīng)用程序,該Service也會(huì)一直運(yùn)行。另外,其他組件可以綁定到Service上與之交互,甚至能夠進(jìn)行進(jìn)程間通信。1創(chuàng)建Service創(chuàng)建方法創(chuàng)建一個(gè)繼承自android.app.Service或者它的子類的類,并重載一些回調(diào)方法來處理Service生命周期的關(guān)鍵環(huán)節(jié),同時(shí)為組件綁定該Service提供一種合適的機(jī)制。在AndroidManifest中注冊Service。2<manifest...>

...

<application...>

<service

android:name=".ExampleService"

/>

...

</application>

</manifest>

創(chuàng)建Service回調(diào)方法onStartCommand()當(dāng)其他組件調(diào)用startService()來啟動(dòng)一個(gè)Service時(shí),系統(tǒng)將調(diào)用這個(gè)方法,這個(gè)Service被啟動(dòng)并可以無限期地運(yùn)行在后臺。如果實(shí)現(xiàn)了該方法,那么必須在Service完成時(shí)通過調(diào)用stopSelf()或stopService()停止它。如果Service只是提供BoundService,那么就不需要實(shí)現(xiàn)這個(gè)方法。2創(chuàng)建Service回調(diào)方法onBind()當(dāng)其他組件通過調(diào)用bindService()與Service綁定時(shí),系統(tǒng)調(diào)用此方法。在對這個(gè)方法的實(shí)現(xiàn)中,必須通過返回一個(gè)IBinder對象提供一個(gè)供客戶端和Service通信的接口。如果不允許服務(wù)被綁定,那么這里返回null,否則必須實(shí)現(xiàn)這個(gè)接口。2創(chuàng)建Service回調(diào)方法onCreate()系統(tǒng)在Service第一次被創(chuàng)建的時(shí)候調(diào)用該方法,執(zhí)行一次性的配置過程。它是在onStartCommand()和onBind()方法之前被調(diào)用的。如果這個(gè)Service已經(jīng)在運(yùn)行了,那么這個(gè)方法不會(huì)被調(diào)用。2創(chuàng)建Service回調(diào)方法onDestroy()系統(tǒng)在一個(gè)Service不再被使用,并且準(zhǔn)備銷毀的時(shí)候調(diào)用該方法,它是Service收到的最后一個(gè)被調(diào)用的方法。在這里可以進(jìn)行一些清除工作,例如線程、注冊的監(jiān)聽以及接收器等。2啟動(dòng)ServiceStartedService啟動(dòng)方法另一個(gè)組件通過調(diào)用startService()啟動(dòng),Service的onStartCommand()方法被調(diào)用以接收此Intent。3啟動(dòng)ServiceStartedService特點(diǎn)服務(wù)啟動(dòng)之后,其生命周期即獨(dú)立于啟動(dòng)它的組件,并且可以在后臺無限期地運(yùn)行,即使啟動(dòng)服務(wù)的組件已被銷毀也不受影響。因此,服務(wù)應(yīng)通過調(diào)用stopSelf()結(jié)束工作來自行停止運(yùn)行,或者由另一個(gè)組件通過調(diào)用stopService()來停止它。注意:默認(rèn)情況下,服務(wù)與服務(wù)聲明所在的應(yīng)用運(yùn)行于同一進(jìn)程,而且運(yùn)行于該應(yīng)用的主線程中。因此,如果服務(wù)在用戶與來自同一應(yīng)用的Activity進(jìn)行交互時(shí)執(zhí)行密集型或阻止性操作,則會(huì)降低Activity性能。為了避免影響應(yīng)用性能,應(yīng)在服務(wù)內(nèi)啟動(dòng)新線程。3啟動(dòng)ServiceStartedService生命周期該服務(wù)在其他組件調(diào)用startService()時(shí)創(chuàng)建,然后無限期運(yùn)行,且必須通過調(diào)用stopSelf()來自行停止運(yùn)行。此外,其他組件也可以通過調(diào)用stopService()來停止服務(wù)。服務(wù)停止后,系統(tǒng)會(huì)將其銷毀。3啟動(dòng)ServiceBindService啟動(dòng)方法另一個(gè)組件通過調(diào)用bindService()綁定,Service的onBind()方法被調(diào)用以返回IBinder。3啟動(dòng)ServiceBindService綁定流程首先必須定義指定客戶端如何與服務(wù)通信的接口。服務(wù)與客戶端之間的這個(gè)接口必須是IBinder的實(shí)現(xiàn),并且服務(wù)必須從onBind()回調(diào)方法返回它。一旦客戶端收到IBinder,即可開始通過該接口與服務(wù)進(jìn)行交互。實(shí)現(xiàn)onBind()回調(diào)方法以返回IBinder,用于定義與服務(wù)通信的接口。然后,其他應(yīng)用組件可以調(diào)用bindService()來檢索該接口,并開始對服務(wù)調(diào)用方法。服務(wù)只用于與其綁定的應(yīng)用組件,因此如果沒有組件綁定到服務(wù),則系統(tǒng)會(huì)銷毀服務(wù)(不必按通過onStartCommand()啟動(dòng)的服務(wù)那樣來停止綁定服務(wù))。3啟動(dòng)ServiceBindService綁定特點(diǎn)多個(gè)客戶端可以同時(shí)綁定到服務(wù)??蛻舳送瓿膳c服務(wù)的交互后,會(huì)調(diào)用unbindService()取消綁定。一旦沒有客戶端綁定到該服務(wù),系統(tǒng)就會(huì)銷毀它。3啟動(dòng)ServiceBindService生命周期該服務(wù)在另一個(gè)組件(客戶端)調(diào)用bindService()時(shí)創(chuàng)建。然后,客戶端通過IBinder接口與服務(wù)進(jìn)行通信??蛻舳丝梢酝ㄟ^調(diào)用unbindService()關(guān)閉連接。多個(gè)客戶端可以綁定到相同服務(wù),而且當(dāng)所有綁定全部取消后,系統(tǒng)即會(huì)銷毀該服務(wù)。(服務(wù)不必自行停止運(yùn)行。)3啟動(dòng)Service同時(shí)調(diào)用startService和bindService方法3綁定Service創(chuàng)建綁定服務(wù)三種方法定義接口擴(kuò)展Binder類如果服務(wù)是供自有應(yīng)用專用,并且在與客戶端相同的進(jìn)程中運(yùn)行(常見情況),則應(yīng)通過擴(kuò)展Binder類并從onBind()返回它的一個(gè)實(shí)例來創(chuàng)建接口。客戶端收到Binder后,可利用它直接訪問Binder實(shí)現(xiàn)中乃至Service中可用的公共方法。如果服務(wù)只是自有應(yīng)用的后臺工作線程,則優(yōu)先采用這種方法。不以這種方式創(chuàng)建接口的唯一原因是,服務(wù)被其他應(yīng)用或不同的進(jìn)程占用。4綁定Service創(chuàng)建綁定服務(wù)三種方法定義接口使用Messenger如需讓接口跨不同的進(jìn)程工作,則可使用Messenger為服務(wù)創(chuàng)建接口。服務(wù)可以這種方式定義對應(yīng)于不同類型Message對象的Handler。此Handler是Messenger的基礎(chǔ),后者隨后可與客戶端分享一個(gè)IBinder,從而讓客戶端能利用Message對象向服務(wù)發(fā)送命令。此外,客戶端還可定義自有Messenger,以便服務(wù)回傳消息。這是執(zhí)行進(jìn)程間通信(IPC)的最簡單方法,因?yàn)镸essenger會(huì)在單一線程中創(chuàng)建包含所有請求的隊(duì)列,這樣就不必對服務(wù)進(jìn)行線程安全設(shè)計(jì)。4綁定Service創(chuàng)建綁定服務(wù)三種方法定義接口使用AIDLAIDL(Android接口定義語言)執(zhí)行所有將對象分解成原語的工作,操作系統(tǒng)可以識別這些原語并將它們編組到各進(jìn)程中,以執(zhí)行IPC。采用Messenger的方法實(shí)際上是以AIDL作為其底層結(jié)構(gòu)。如上所述,Messenger會(huì)在單一線程中創(chuàng)建包含所有客戶端請求的隊(duì)列,以便服務(wù)一次接收一個(gè)請求。不過,如果想讓服務(wù)同時(shí)處理多個(gè)請求,則可直接使用AIDL。在此情況下,服務(wù)必須具備多線程處理能力,并采用線程安全式設(shè)計(jì)。如需直接使用AIDL,必須創(chuàng)建一個(gè)定義編程接口的.aidl文件。AndroidSDK工具利用該文件生成一個(gè)實(shí)現(xiàn)接口并處理IPC的抽象類,隨后可在服務(wù)內(nèi)對其進(jìn)行擴(kuò)展。4綁定Service擴(kuò)展Binder類基本步驟在服務(wù)中,創(chuàng)建一個(gè)可滿足下列任一要求的Binder實(shí)例:包含客戶端可調(diào)用的公共方法返回當(dāng)前Service實(shí)例,其中包含客戶端可調(diào)用的公共方法或返回由服務(wù)承載的其他類的實(shí)例,其中包含客戶端可調(diào)用的公共方法從onBind()回調(diào)方法返回此Binder實(shí)例。在客戶端中,從onServiceConnected()回調(diào)方法接收Binder,并使用提供的方法調(diào)用綁定服務(wù)。4綁定Service擴(kuò)展Binder類示例:創(chuàng)建ServiceLocalBinder為客戶端提供getService()方法,以檢索LocalService的當(dāng)前實(shí)例。這樣,客戶端便可調(diào)用服務(wù)中的公共方法。例如,客戶端可調(diào)用服務(wù)中的getRandomNumber()。4綁定Service擴(kuò)展Binder類示例:綁定ServiceActivity會(huì)綁定到LocalService并調(diào)用getRandomNumber()。4綁定Service使用Messenger基本步驟服務(wù)實(shí)現(xiàn)一個(gè)Handler,由其接收來自客戶端的每個(gè)調(diào)用的回調(diào)Handler用于創(chuàng)建Messenger對象(對Handler的引用)Messenger創(chuàng)建一個(gè)IBinder,服務(wù)通過onBind()使其返回客戶端客戶端使用IBinder將Messenger(引用服務(wù)的Handler)實(shí)例化,然后使用后者將Message對象發(fā)送給服務(wù)服務(wù)在其Handler中(具體地講,是在handleMessage()方法中)接收每個(gè)Message這樣,客戶端并沒有調(diào)用服務(wù)的“方法”。而客戶端傳遞的“消息”(Message對象)是服務(wù)在其Handler中接收的。4綁定Service使用Messenger示例:創(chuàng)建Service服務(wù)就是在Handler的handleMessage()方法中接收傳入的Message,并根據(jù)what成員決定下一步操作。4綁定Service使用Messenger示例:綁定Service客戶端只需根據(jù)服務(wù)返回的IBinder創(chuàng)建一個(gè)Messenger,然后利用send()發(fā)送一條消息。4綁定Service綁定到服務(wù)調(diào)用bindService()綁定到服務(wù)。綁定是異步的。要接收IBinder,客戶端必須創(chuàng)建一個(gè)ServiceConnection實(shí)例,并將其傳遞給bindService()。ServiceConnection包括一個(gè)回調(diào)方法,系統(tǒng)通過調(diào)用它來傳遞IBinder。無法從廣播接收器綁定到服務(wù)。4綁定Service綁定到服務(wù)基本步驟實(shí)現(xiàn)ServiceConnection。onServiceConnected()系統(tǒng)會(huì)調(diào)用該方法以傳遞服務(wù)的onBind()方法返回的IBinder。onServiceDisconnected()系統(tǒng)會(huì)在與服務(wù)的連接意外中斷時(shí)(例如當(dāng)服務(wù)崩潰或被終止時(shí))調(diào)用該方法。當(dāng)客戶端取消綁定時(shí),系統(tǒng)“絕對不會(huì)”調(diào)用該方法。調(diào)用bindService()以傳遞ServiceConnection實(shí)現(xiàn)。當(dāng)系統(tǒng)調(diào)用onServiceConnected()回調(diào)方法時(shí),可以使用接口定義的方法開始調(diào)用服務(wù)。要斷開與服務(wù)的連接,調(diào)用unbindService()。4綁定Service綁定到服務(wù)bindServi

溫馨提示

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

評論

0/150

提交評論