![第八章Service詳解_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/18/11fb52d9-9ed3-4b9d-a848-2cb5f540ff90/11fb52d9-9ed3-4b9d-a848-2cb5f540ff901.gif)
![第八章Service詳解_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/18/11fb52d9-9ed3-4b9d-a848-2cb5f540ff90/11fb52d9-9ed3-4b9d-a848-2cb5f540ff902.gif)
![第八章Service詳解_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/18/11fb52d9-9ed3-4b9d-a848-2cb5f540ff90/11fb52d9-9ed3-4b9d-a848-2cb5f540ff903.gif)
![第八章Service詳解_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/18/11fb52d9-9ed3-4b9d-a848-2cb5f540ff90/11fb52d9-9ed3-4b9d-a848-2cb5f540ff904.gif)
![第八章Service詳解_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/18/11fb52d9-9ed3-4b9d-a848-2cb5f540ff90/11fb52d9-9ed3-4b9d-a848-2cb5f540ff905.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第八章第八章Service詳解詳解 倚動軟件工廠實(shí)驗(yàn)室倚動軟件工廠實(shí)驗(yàn)室 主要內(nèi)容主要內(nèi)容ServiceService簡介簡介Service是android 系統(tǒng)的四大組件之一,是與Activity最相似的組件,它們都是從Context派生出來的,但它不能自己運(yùn)行,只能在后臺運(yùn)行,可與其它組件進(jìn)行交互,相當(dāng)于一個沒有圖形界面的Activit組件。它需要通過某一個它需要通過某一個Activity或者其他或者其他Context對對象來調(diào)用象來調(diào)用。用途:實(shí)現(xiàn)后臺運(yùn)行和跨進(jìn)程訪問。通過啟動一個服務(wù),可以在不顯示界面的情況下在后臺運(yùn)行指定的任務(wù),這樣可以不影響用戶做其他事情,如后臺播放音樂,下載資源等
2、。 Service類常用方法類常用方法 與開發(fā)其它Android組件類似,開發(fā)Service組件需要先開發(fā)一個Service子類,該類需繼承系統(tǒng)提供的Service類,與Activity類似,Service也定義了一系列生命周期方法: abstract IBinder onBind(Intent intent):該方法是一個抽象方法,所有Service的子類必須實(shí)現(xiàn)該方法。該方法將返回一個IBinder對象,應(yīng)用程序可通過該對象與Service組件通信;void onCreate():當(dāng)Service第一次被創(chuàng)建時(shí),將立即回調(diào)該方法;Service類常用方法類常用方法void onDestro
3、y():當(dāng)Service被關(guān)閉之前,將回調(diào)該方法;void onStartCommand(Intent intent, int flags,int startId):該方法的早期版本是void onStart(Intent intent, int startId),每次客戶端調(diào)用startService(Intent intent)方法啟動該Service時(shí)都會回調(diào)該方法;boolean onUnbind(Intent intent):當(dāng)該Service上綁定的所有客戶端都斷開連接時(shí)將會回調(diào)該方法。Service開發(fā)步驟開發(fā)步驟u 開發(fā)開發(fā)Service組件需要先開發(fā)一個組件需要先開發(fā)一個Se
4、rvice子類,然后在子類,然后在AndroidManifest.xml文件中配置該文件中配置該Service,配置時(shí)可通過,配置時(shí)可通過元素指定它可被哪些元素指定它可被哪些Intent啟動。啟動。u 在AndroidManifest.xml文件中配置Service: 注意事項(xiàng)注意事項(xiàng)u Action中的值一定要與程序中創(chuàng)建的Intent的Action的值一致,程序是根據(jù)Action的值來查找相應(yīng)的Service從而啟動它。u 在為Service注冊后,我們便可以通過startService()或BindService()方法來啟動該Service。通過stopService()來停止Serv
5、ice,unbindService()來解除與Service的綁定。Service啟動方法啟動方法Android系統(tǒng)中,啟動Service有兩種方式:u通過Context的startService()啟動Service,訪問者與Service之間沒有關(guān)聯(lián),該Service將一直在后臺執(zhí)行,即使調(diào)用startService的進(jìn)程結(jié)束了,Service仍然還存在,直到有進(jìn)程調(diào)用stopService,或者Service結(jié)束自己(stopSelf()。這種情況下,Service與訪問者之間無法進(jìn)行通信、數(shù)據(jù)交換。u通過Context的 bindService()方法啟動,Service就和調(diào)用bin
6、dService的組件綁定在一起,也就是說當(dāng)調(diào)用bindService的組件銷毀了,那么它綁定的Service也要跟著被結(jié)束。Service啟動方法啟動方法注意注意:(1)一個服務(wù)可以與多個組件綁定,只有當(dāng)所有的組件都與之解除綁定,該服務(wù)才會被銷毀。(2)以上兩種啟動Service的方法可以混合使用,只要Service同時(shí)實(shí)現(xiàn)了onStartedCommand() 和onBind()方法,那么只有調(diào)用stopService(),并調(diào)用unbindService()方法后,該Service才會被銷毀。bindServicebindService方法方法 Context(調(diào)用服務(wù)組件)的bindS
7、ervice()方法的完整方法簽名為:bindService(Intent service,ServiceConnection conn, int flags),該方法的三個參數(shù)解釋如下: service:該參數(shù)表示與服務(wù)類相關(guān)聯(lián)的Intent對象,用于指定所要啟動的Service; flags:指定綁定時(shí)是否自動創(chuàng)建Service(如果Service還未創(chuàng)建)。該參數(shù)可指定0(不自動創(chuàng)建)或BIND_AUTO_CREATE(自動創(chuàng)建)。bindServicebindService方法方法 conn:該參數(shù)是一個ServiceConnection對象,該對象用于監(jiān)聽訪問者與Service之間的
8、連接情況。當(dāng)訪問者與Service之間連接成功時(shí),將回調(diào)該ServiceConnection對象的onServiceConnected(ComponentName name,IBinder service)方法;當(dāng)訪問者與Service之間斷開連接時(shí)將回調(diào)該ServiceConnection對象的onServiceDisconnected(ComponentName name)方法。onBindonBind方法方法(Service)(Service)u 當(dāng)開發(fā)Service類時(shí),該Service類必須提供一個onBind()方法,在綁定本地Service的情況下,onBind()方法所返回的I
9、Binder接口將會傳給ServiceConnection對象里onServiceConnected(ComponentName name,IBinder service)方法的service參數(shù),這樣訪問者就可以通過IBinder接口與Service進(jìn)行通信,對Service中的數(shù)據(jù)進(jìn)行操作。u 實(shí)際開發(fā)時(shí)通常會采用繼承Binder類類(IBinder接口的實(shí)現(xiàn)類)的方式實(shí)現(xiàn)自己的IBinder接口。案例案例(FirstService)1、通過、通過Context的的startService()方法啟動和停止()方法啟動和停止Service2、通過、通過Context的的bindServic
10、e()方法綁定和解除綁定()方法綁定和解除綁定3、兩種方式混合使用、兩種方式混合使用ServiceService詳解詳解兩種方式混合使用時(shí),方法的執(zhí)行順序是怎么樣的?兩種方式混合使用時(shí),方法的執(zhí)行順序是怎么樣的?問題與討論問題與討論1、先啟動后綁定、先啟動后綁定2、先綁定后啟動、先綁定后啟動案例總結(jié)案例總結(jié)ServiceService的生命周期的生命周期u 每當(dāng)Service被創(chuàng)建時(shí)會回調(diào)onCreate方法,每次Service被啟動時(shí)都會回調(diào)onStartCommand方法,多次啟動一個已有的Service組件將不會再回調(diào)onCreate方法,但每次啟動時(shí)都會回調(diào)onStartCommand
11、方法。u 綁定服務(wù)的執(zhí)行過程: 執(zhí)行單擊事件方法根據(jù)Intent找到相應(yīng)的Service類,并初始化該類調(diào)用Service的onCreate方法調(diào)用該類的onBind方法調(diào)用Activity的onServiceConnected方法。u 多次單擊綁定服務(wù)按鈕,并不會重復(fù)執(zhí)行綁定方法。一旦解綁,調(diào)用unBind()方法,然后自動銷毀。AIDLAIDL簡介簡介u AIDL是一種接口定義語言,用于約束兩個進(jìn)程間通信規(guī)則,供編譯器生成代碼,實(shí)現(xiàn)Android設(shè)備上的兩個進(jìn)程間通信(IPC)。u進(jìn)程之間的通信信息,首先會被轉(zhuǎn)換成AIDL協(xié)議消息,然后發(fā)送給對方,對方收到AIDL協(xié)議消息后再轉(zhuǎn)換成相應(yīng)的對
12、象。u由于進(jìn)程之間的通信信息需要雙向轉(zhuǎn)換,所以android采用代理類在背后實(shí)現(xiàn)了信息的雙向轉(zhuǎn)換,代理類由android編譯器生成,對開發(fā)人員來說是透明的。AIDL:Android Interface Definition LAIDLAIDL簡介簡介u 客戶端訪問Service時(shí),Android并不是直接返回Service對象給客戶端,Service只是將一個回調(diào)對象(IBinder對象)通過onBind()方法回調(diào)給客戶端。u 與綁定本地Service不同的是,本地Service的onBind()方法會直接把IBinder對象本身傳給客戶端的ServiceConnection的onServi
13、ceConnected方法的第二個參數(shù)。但遠(yuǎn)程Service的onBind()方法只是將IBinder對象的代理傳給客戶端的ServiceConnection的onServiceConnected方法的第二個參數(shù)。當(dāng)客戶端獲取了遠(yuǎn)程的Service的IBinder對象的代理之后,接下來可通過該IBinder對象去回調(diào)遠(yuǎn)程Service的屬性或方法。AIDLAIDL簡介簡介 AIDL定義接口的源代碼必須以.aidl結(jié)尾; AIDL接口中用到數(shù)據(jù)類型,除了基本類型、String、List、Map、CharSequence之外,其他類型全部都需要導(dǎo)包,即使它們在同一個包中也需要導(dǎo)包。 定義好AIDL
14、接口之后(如Song.aidl),ADT工具會自動在gen目錄下生成相應(yīng)的包,并生成一個Song.java接口,在該接口里包含一個Stub內(nèi)部類,該內(nèi)部類實(shí)現(xiàn)了IBinder、Song兩個接口,這個Stub類將會作為遠(yuǎn)程Service的回調(diào)類。它內(nèi)部能實(shí)現(xiàn)一些功能。 開發(fā)客戶端的第一步就是將Service端的AIDL接口文件復(fù)制到客戶端應(yīng)用中,復(fù)制到客戶端后ADT工具會為AIDL接口生成相應(yīng)的Java接口類。AIDL使用時(shí)需注意:使用時(shí)需注意:客戶端訪問客戶端訪問AIDLServiceAIDLService 1、創(chuàng)建、創(chuàng)建ServiceConnection對象;對象; 2、以、以Service
15、Connection對象作為參數(shù),調(diào)用對象作為參數(shù),調(diào)用Context的的bindService()方法綁定遠(yuǎn)程方法綁定遠(yuǎn)程Service。 3、將返回的、將返回的IBinder對象的代理類轉(zhuǎn)換成對象的代理類轉(zhuǎn)換成IBinder對象,對象,從而調(diào)用從而調(diào)用Service中的相應(yīng)方法。中的相應(yīng)方法。 客戶端綁定遠(yuǎn)程Service與綁定本地Service的區(qū)別不大,同樣只需要三步:案例案例 通過一個按鈕來獲取遠(yuǎn)程通過一個按鈕來獲取遠(yuǎn)程ServiceService的狀態(tài),并顯示在的狀態(tài),并顯示在兩個文本框中。兩個文本框中。 【示例代碼:示例代碼:codes/08/ADILClientcodes/08
16、/ADILClient】案例案例 假設(shè)A應(yīng)用需要與B應(yīng)用進(jìn)行通信,調(diào)用B應(yīng)用中的getColor()、getWeight()方法,B應(yīng)用以Service方式向A應(yīng)用提供服務(wù)。(我們可以把A應(yīng)用看成是客戶端,B應(yīng)用看成是服務(wù)端,分別命名為AIDLClient 、AIDLServer)。整個過程需要以下四步: 1、在Server端編寫AIDL文件package .android;interface SongString getName();String getAuthor();案例案例u 編寫Aidl文件時(shí),需要注意注意: 1.接口名和aidl文件名相同; 2.接口和方法前不用加訪問權(quán)限修飾符pu
17、blic,private等,也不能用final,static; 3.Aidl默認(rèn)支持的類型包話java基本類型(int、long、boolean等)和(String、List、Map、CharSequence),使用這些類型時(shí)不需要import聲明。對于List和Map中的元素類型必須是Aidl支持的類型。如果使用自定義類型作為參數(shù)或返回值,自定義類型必須實(shí)現(xiàn)Parcelable接口。 4.自定義類型和AIDL生成的其它接口類型在aidl描述文件中,應(yīng)該顯式import,即便在該類和定義的包在同一個包中。 5.在aidl文件中所有非Java基本類型參數(shù)必須加上in、out、inout標(biāo)記,以指
18、明參數(shù)是輸入?yún)?shù)、輸出參數(shù)還是輸入輸出參數(shù)。 6.Java原始類型默認(rèn)的標(biāo)記為in,不能為其它標(biāo)記。案例案例u 當(dāng)完成aidl文件創(chuàng)建后,eclipse會自動在項(xiàng)目的gen目錄中同步生成Song.java接口文件。接口文件中生成一個Stub的抽象類,里面包括aidl定義的方法,還包括一些其它輔助性的方法。u 對于遠(yuǎn)程服務(wù)調(diào)用,遠(yuǎn)程服務(wù)返回給客戶端的對象為代理對象,客戶端在onServiceConnected(ComponentName name, IBinder service)方法引用該對象時(shí)不能直接強(qiáng)轉(zhuǎn)成接口類型的實(shí)例,而應(yīng)該使用asInterface(IBinder iBinder)進(jìn)行
19、類型轉(zhuǎn)換。案例案例 2、在ADILServer應(yīng)用中實(shí)現(xiàn)aidl文件生成的接口(本例是Song),但并非直接實(shí)現(xiàn)接口,而是通過繼承接口的Stub來實(shí)現(xiàn)(Stub抽象類內(nèi)部實(shí)現(xiàn)了aidl接口),并且實(shí)現(xiàn)接口中的方法。public class SongBinder extends Stubpublic String getName() throws RemoteException return name;public String getAuthor() throws RemoteException return author;案例案例 3、把AIDLService應(yīng)用中aidl文件所在package連同aidl文件一起拷貝到客戶端AIDLClient應(yīng)用,eclipse會自動在A應(yīng)用的gen目錄中為aidl文件同步生成ICat.java接口文件,接下來就可以在AIDLClient應(yīng)用中實(shí)現(xiàn)與AIDLService應(yīng)用通信。AIDLClie
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 董海霞二年級語文《葡萄溝》教學(xué)設(shè)計(jì)新
- DB4415T 48-2025茶角胸葉甲綜合防控技術(shù)規(guī)程
- LED廣告屏幕安裝與維護(hù)合同模板
- 個人消費(fèi)貸款合同范例
- 二手住宅買賣合同正規(guī)范本
- 二手房分期付款合同書
- 不履行購銷合同糾紛案解析
- 專利權(quán)轉(zhuǎn)讓及合作協(xié)議合同書
- 專項(xiàng)企業(yè)產(chǎn)(股)權(quán)托管合同文本
- 個人債務(wù)重組還款合同樣本
- DB13(J)-T 8541-2023 全過程工程咨詢服務(wù)標(biāo)準(zhǔn)
- 英語語法基礎(chǔ)知識大全
- 河南省安陽市2024年中考一模語文試卷(含答案)
- TD/T 1044-2014 生產(chǎn)項(xiàng)目土地復(fù)墾驗(yàn)收規(guī)程(正式版)
- 2024年湖南現(xiàn)代物流職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案1套
- 垃圾桶創(chuàng)新設(shè)計(jì)說明書
- 《游戲界面設(shè)計(jì)專題實(shí)踐》課件-知識點(diǎn)1:游戲圖標(biāo)設(shè)計(jì)定義、分類與設(shè)計(jì)原則
- 病案信息技術(shù)(中級)考試真題及答案5篇
- 婦科圍手術(shù)期護(hù)理課件
- 蔚來汽車技術(shù)
- 浙教版勞動二年級上冊全冊教案
評論
0/150
提交評論