




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第八章第八章Service詳解詳解 倚動(dòng)軟件工廠實(shí)驗(yàn)室倚動(dòng)軟件工廠實(shí)驗(yàn)室 主要內(nèi)容主要內(nèi)容ServiceService簡(jiǎn)介簡(jiǎn)介Service是android 系統(tǒng)的四大組件之一,是與Activity最相似的組件,它們都是從Context派生出來(lái)的,但它不能自己運(yùn)行,只能在后臺(tái)運(yùn)行,可與其它組件進(jìn)行交互,相當(dāng)于一個(gè)沒(méi)有圖形界面的Activit組件。它需要通過(guò)某一個(gè)它需要通過(guò)某一個(gè)Activity或者其他或者其他Context對(duì)對(duì)象來(lái)調(diào)用象來(lái)調(diào)用。用途:實(shí)現(xiàn)后臺(tái)運(yùn)行和跨進(jìn)程訪問(wèn)。通過(guò)啟動(dòng)一個(gè)服務(wù),可以在不顯示界面的情況下在后臺(tái)運(yùn)行指定的任務(wù),這樣可以不影響用戶做其他事情,如后臺(tái)播放音樂(lè),下載資源等
2、。 Service類常用方法類常用方法 與開(kāi)發(fā)其它Android組件類似,開(kāi)發(fā)Service組件需要先開(kāi)發(fā)一個(gè)Service子類,該類需繼承系統(tǒng)提供的Service類,與Activity類似,Service也定義了一系列生命周期方法: abstract IBinder onBind(Intent intent):該方法是一個(gè)抽象方法,所有Service的子類必須實(shí)現(xiàn)該方法。該方法將返回一個(gè)IBinder對(duì)象,應(yīng)用程序可通過(guò)該對(duì)象與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)方法啟動(dòng)該Service時(shí)都會(huì)回調(diào)該方法;boolean onUnbind(Intent intent):當(dāng)該Service上綁定的所有客戶端都斷開(kāi)連接時(shí)將會(huì)回調(diào)該方法。Service開(kāi)發(fā)步驟開(kāi)發(fā)步驟u 開(kāi)發(fā)開(kāi)發(fā)Service組件需要先開(kāi)發(fā)一個(gè)組件需要先開(kāi)發(fā)一個(gè)Se
4、rvice子類,然后在子類,然后在AndroidManifest.xml文件中配置該文件中配置該Service,配置時(shí)可通過(guò),配置時(shí)可通過(guò)元素指定它可被哪些元素指定它可被哪些Intent啟動(dòng)。啟動(dòng)。u 在AndroidManifest.xml文件中配置Service: 注意事項(xiàng)注意事項(xiàng)u Action中的值一定要與程序中創(chuàng)建的Intent的Action的值一致,程序是根據(jù)Action的值來(lái)查找相應(yīng)的Service從而啟動(dòng)它。u 在為Service注冊(cè)后,我們便可以通過(guò)startService()或BindService()方法來(lái)啟動(dòng)該Service。通過(guò)stopService()來(lái)停止Serv
5、ice,unbindService()來(lái)解除與Service的綁定。Service啟動(dòng)方法啟動(dòng)方法Android系統(tǒng)中,啟動(dòng)Service有兩種方式:u通過(guò)Context的startService()啟動(dòng)Service,訪問(wèn)者與Service之間沒(méi)有關(guān)聯(lián),該Service將一直在后臺(tái)執(zhí)行,即使調(diào)用startService的進(jìn)程結(jié)束了,Service仍然還存在,直到有進(jìn)程調(diào)用stopService,或者Service結(jié)束自己(stopSelf()。這種情況下,Service與訪問(wèn)者之間無(wú)法進(jìn)行通信、數(shù)據(jù)交換。u通過(guò)Context的 bindService()方法啟動(dòng),Service就和調(diào)用bin
6、dService的組件綁定在一起,也就是說(shuō)當(dāng)調(diào)用bindService的組件銷毀了,那么它綁定的Service也要跟著被結(jié)束。Service啟動(dòng)方法啟動(dòng)方法注意注意:(1)一個(gè)服務(wù)可以與多個(gè)組件綁定,只有當(dāng)所有的組件都與之解除綁定,該服務(wù)才會(huì)被銷毀。(2)以上兩種啟動(dòng)Service的方法可以混合使用,只要Service同時(shí)實(shí)現(xiàn)了onStartedCommand() 和onBind()方法,那么只有調(diào)用stopService(),并調(diào)用unbindService()方法后,該Service才會(huì)被銷毀。bindServicebindService方法方法 Context(調(diào)用服務(wù)組件)的bindS
7、ervice()方法的完整方法簽名為:bindService(Intent service,ServiceConnection conn, int flags),該方法的三個(gè)參數(shù)解釋如下: service:該參數(shù)表示與服務(wù)類相關(guān)聯(lián)的Intent對(duì)象,用于指定所要啟動(dòng)的Service; flags:指定綁定時(shí)是否自動(dòng)創(chuàng)建Service(如果Service還未創(chuàng)建)。該參數(shù)可指定0(不自動(dòng)創(chuàng)建)或BIND_AUTO_CREATE(自動(dòng)創(chuàng)建)。bindServicebindService方法方法 conn:該參數(shù)是一個(gè)ServiceConnection對(duì)象,該對(duì)象用于監(jiān)聽(tīng)訪問(wèn)者與Service之間的
8、連接情況。當(dāng)訪問(wèn)者與Service之間連接成功時(shí),將回調(diào)該ServiceConnection對(duì)象的onServiceConnected(ComponentName name,IBinder service)方法;當(dāng)訪問(wèn)者與Service之間斷開(kāi)連接時(shí)將回調(diào)該ServiceConnection對(duì)象的onServiceDisconnected(ComponentName name)方法。onBindonBind方法方法(Service)(Service)u 當(dāng)開(kāi)發(fā)Service類時(shí),該Service類必須提供一個(gè)onBind()方法,在綁定本地Service的情況下,onBind()方法所返回的I
9、Binder接口將會(huì)傳給ServiceConnection對(duì)象里onServiceConnected(ComponentName name,IBinder service)方法的service參數(shù),這樣訪問(wèn)者就可以通過(guò)IBinder接口與Service進(jìn)行通信,對(duì)Service中的數(shù)據(jù)進(jìn)行操作。u 實(shí)際開(kāi)發(fā)時(shí)通常會(huì)采用繼承Binder類類(IBinder接口的實(shí)現(xiàn)類)的方式實(shí)現(xiàn)自己的IBinder接口。案例案例(FirstService)1、通過(guò)、通過(guò)Context的的startService()方法啟動(dòng)和停止()方法啟動(dòng)和停止Service2、通過(guò)、通過(guò)Context的的bindServic
10、e()方法綁定和解除綁定()方法綁定和解除綁定3、兩種方式混合使用、兩種方式混合使用ServiceService詳解詳解兩種方式混合使用時(shí),方法的執(zhí)行順序是怎么樣的??jī)煞N方式混合使用時(shí),方法的執(zhí)行順序是怎么樣的?問(wèn)題與討論問(wèn)題與討論1、先啟動(dòng)后綁定、先啟動(dòng)后綁定2、先綁定后啟動(dòng)、先綁定后啟動(dòng)案例總結(jié)案例總結(jié)ServiceService的生命周期的生命周期u 每當(dāng)Service被創(chuàng)建時(shí)會(huì)回調(diào)onCreate方法,每次Service被啟動(dòng)時(shí)都會(huì)回調(diào)onStartCommand方法,多次啟動(dòng)一個(gè)已有的Service組件將不會(huì)再回調(diào)onCreate方法,但每次啟動(dòng)時(shí)都會(huì)回調(diào)onStartCommand
11、方法。u 綁定服務(wù)的執(zhí)行過(guò)程: 執(zhí)行單擊事件方法根據(jù)Intent找到相應(yīng)的Service類,并初始化該類調(diào)用Service的onCreate方法調(diào)用該類的onBind方法調(diào)用Activity的onServiceConnected方法。u 多次單擊綁定服務(wù)按鈕,并不會(huì)重復(fù)執(zhí)行綁定方法。一旦解綁,調(diào)用unBind()方法,然后自動(dòng)銷毀。AIDLAIDL簡(jiǎn)介簡(jiǎn)介u AIDL是一種接口定義語(yǔ)言,用于約束兩個(gè)進(jìn)程間通信規(guī)則,供編譯器生成代碼,實(shí)現(xiàn)Android設(shè)備上的兩個(gè)進(jìn)程間通信(IPC)。u進(jìn)程之間的通信信息,首先會(huì)被轉(zhuǎn)換成AIDL協(xié)議消息,然后發(fā)送給對(duì)方,對(duì)方收到AIDL協(xié)議消息后再轉(zhuǎn)換成相應(yīng)的對(duì)
12、象。u由于進(jìn)程之間的通信信息需要雙向轉(zhuǎn)換,所以android采用代理類在背后實(shí)現(xiàn)了信息的雙向轉(zhuǎn)換,代理類由android編譯器生成,對(duì)開(kāi)發(fā)人員來(lái)說(shuō)是透明的。AIDL:Android Interface Definition LAIDLAIDL簡(jiǎn)介簡(jiǎn)介u 客戶端訪問(wèn)Service時(shí),Android并不是直接返回Service對(duì)象給客戶端,Service只是將一個(gè)回調(diào)對(duì)象(IBinder對(duì)象)通過(guò)onBind()方法回調(diào)給客戶端。u 與綁定本地Service不同的是,本地Service的onBind()方法會(huì)直接把IBinder對(duì)象本身傳給客戶端的ServiceConnection的onServi
13、ceConnected方法的第二個(gè)參數(shù)。但遠(yuǎn)程Service的onBind()方法只是將IBinder對(duì)象的代理傳給客戶端的ServiceConnection的onServiceConnected方法的第二個(gè)參數(shù)。當(dāng)客戶端獲取了遠(yuǎn)程的Service的IBinder對(duì)象的代理之后,接下來(lái)可通過(guò)該IBinder對(duì)象去回調(diào)遠(yuǎn)程Service的屬性或方法。AIDLAIDL簡(jiǎn)介簡(jiǎn)介 AIDL定義接口的源代碼必須以.aidl結(jié)尾; AIDL接口中用到數(shù)據(jù)類型,除了基本類型、String、List、Map、CharSequence之外,其他類型全部都需要導(dǎo)包,即使它們?cè)谕粋€(gè)包中也需要導(dǎo)包。 定義好AIDL
14、接口之后(如Song.aidl),ADT工具會(huì)自動(dòng)在gen目錄下生成相應(yīng)的包,并生成一個(gè)Song.java接口,在該接口里包含一個(gè)Stub內(nèi)部類,該內(nèi)部類實(shí)現(xiàn)了IBinder、Song兩個(gè)接口,這個(gè)Stub類將會(huì)作為遠(yuǎn)程Service的回調(diào)類。它內(nèi)部能實(shí)現(xiàn)一些功能。 開(kāi)發(fā)客戶端的第一步就是將Service端的AIDL接口文件復(fù)制到客戶端應(yīng)用中,復(fù)制到客戶端后ADT工具會(huì)為AIDL接口生成相應(yīng)的Java接口類。AIDL使用時(shí)需注意:使用時(shí)需注意:客戶端訪問(wèn)客戶端訪問(wèn)AIDLServiceAIDLService 1、創(chuàng)建、創(chuàng)建ServiceConnection對(duì)象;對(duì)象; 2、以、以Service
15、Connection對(duì)象作為參數(shù),調(diào)用對(duì)象作為參數(shù),調(diào)用Context的的bindService()方法綁定遠(yuǎn)程方法綁定遠(yuǎn)程Service。 3、將返回的、將返回的IBinder對(duì)象的代理類轉(zhuǎn)換成對(duì)象的代理類轉(zhuǎn)換成IBinder對(duì)象,對(duì)象,從而調(diào)用從而調(diào)用Service中的相應(yīng)方法。中的相應(yīng)方法。 客戶端綁定遠(yuǎn)程Service與綁定本地Service的區(qū)別不大,同樣只需要三步:案例案例 通過(guò)一個(gè)按鈕來(lái)獲取遠(yuǎn)程通過(guò)一個(gè)按鈕來(lái)獲取遠(yuǎn)程ServiceService的狀態(tài),并顯示在的狀態(tài),并顯示在兩個(gè)文本框中。兩個(gè)文本框中。 【示例代碼:示例代碼: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)。整個(gè)過(guò)程需要以下四步: 1、在Server端編寫(xiě)AIDL文件package .android;interface SongString getName();String getAuthor();案例案例u 編寫(xiě)Aidl文件時(shí),需要注意注意: 1.接口名和aidl文件名相同; 2.接口和方法前不用加訪問(wèn)權(quán)限修飾符pu
17、blic,private等,也不能用final,static; 3.Aidl默認(rèn)支持的類型包話java基本類型(int、long、boolean等)和(String、List、Map、CharSequence),使用這些類型時(shí)不需要import聲明。對(duì)于List和Map中的元素類型必須是Aidl支持的類型。如果使用自定義類型作為參數(shù)或返回值,自定義類型必須實(shí)現(xiàn)Parcelable接口。 4.自定義類型和AIDL生成的其它接口類型在aidl描述文件中,應(yīng)該顯式import,即便在該類和定義的包在同一個(gè)包中。 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會(huì)自動(dòng)在項(xiàng)目的gen目錄中同步生成Song.java接口文件。接口文件中生成一個(gè)Stub的抽象類,里面包括aidl定義的方法,還包括一些其它輔助性的方法。u 對(duì)于遠(yuǎn)程服務(wù)調(diào)用,遠(yuǎn)程服務(wù)返回給客戶端的對(duì)象為代理對(duì)象,客戶端在onServiceConnected(ComponentName name, IBinder service)方法引用該對(duì)象時(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)接口,而是通過(guò)繼承接口的Stub來(lái)實(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會(huì)自動(dòng)在A應(yīng)用的gen目錄中為aidl文件同步生成ICat.java接口文件,接下來(lái)就可以在AIDLClient應(yīng)用中實(shí)現(xiàn)與AIDLService應(yīng)用通信。AIDLClie
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)科醫(yī)師面試題及答案
- 如何護(hù)理營(yíng)養(yǎng)性缺鐵性貧血
- 勞動(dòng)仲裁內(nèi)部培訓(xùn)
- 影樓修片培訓(xùn)
- 地產(chǎn)基礎(chǔ)知識(shí)培訓(xùn)
- 消化內(nèi)科胃炎護(hù)理
- 小學(xué)素描繪畫(huà)課件
- 護(hù)理總結(jié)匯報(bào)
- 婦產(chǎn)科妊娠期婦女的護(hù)理
- 中專急救護(hù)理學(xué)
- 2025年廣東省廣州市南沙區(qū)中考二模道德與法治試題
- 2025屆重慶市普通高中學(xué)業(yè)水平選擇性考試預(yù)測(cè)歷史試題(含答案)
- 2025-2030中國(guó)眼底照相機(jī)行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 2024年深圳市大鵬新區(qū)區(qū)屬公辦中小學(xué)招聘教師真題
- 緬甸語(yǔ)教學(xué)與學(xué)習(xí)作業(yè)指導(dǎo)書(shū)
- 人教版小學(xué)語(yǔ)文四年級(jí)下冊(cè)作文范文2
- 大學(xué)語(yǔ)文試題及答案琴
- T/CSPSTC 112-2023氫氣管道工程施工技術(shù)規(guī)范
- 24春國(guó)家開(kāi)放大學(xué)《農(nóng)業(yè)推廣》調(diào)查報(bào)告參考答案
- 肝素鈉生產(chǎn)工藝綜述
- 壓力管道氬電聯(lián)焊作業(yè)指導(dǎo)書(shū)
評(píng)論
0/150
提交評(píng)論