第三階段上課10、android應(yīng)用程序組件四service_第1頁(yè)
第三階段上課10、android應(yīng)用程序組件四service_第2頁(yè)
第三階段上課10、android應(yīng)用程序組件四service_第3頁(yè)
第三階段上課10、android應(yīng)用程序組件四service_第4頁(yè)
第三階段上課10、android應(yīng)用程序組件四service_第5頁(yè)
已閱讀5頁(yè),還剩23頁(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)介

Graphic

Design

TrainingAndroid應(yīng)用程序組件(三)TRAININGCOURSE.12014-07——主講人:唐睿【章程目標(biāo)】

Service概述

Service生命周期

自定義Service

Activity與Service之間的數(shù)據(jù)交互

IPC技術(shù)和AIDL接口編寫(xiě)服務(wù)是四大組件之一,與Activity是同級(jí)的,服務(wù)不帶UI,一直處于后臺(tái)運(yùn)行,做一些用時(shí)比較長(zhǎng)的操作在默認(rèn)情況下,服務(wù)運(yùn)行在應(yīng)用程序進(jìn)程的主線程中服務(wù)既不是一個(gè)獨(dú)立的進(jìn)程,也不是一個(gè)獨(dú)立的線程一般在activity中啟動(dòng)服務(wù)、停止服務(wù)服務(wù)主要用于兩個(gè)目的:后臺(tái)運(yùn)行(例如:處理耗時(shí)間的任務(wù)時(shí)不影響UI的操作)和跨進(jìn)程訪問(wèn)。【服務(wù)概述】服務(wù)按啟動(dòng)方式分為三類(lèi)Started:適用于Activity與服務(wù)之間沒(méi)有調(diào)用交互的情況用startService()來(lái)啟動(dòng)一旦啟動(dòng),就運(yùn)行在后臺(tái),即使啟動(dòng)它的對(duì)象都銷(xiāo)毀了,依然運(yùn)行通常只啟動(dòng),不返回值通常執(zhí)行完服務(wù)的操作后,服務(wù)自動(dòng)停止Bound:適用于Activity與服務(wù)之間需要傳遞參數(shù)或方法調(diào)用的情況bindService()來(lái)綁定提供客戶端服務(wù)器接口來(lái)啟動(dòng)發(fā)送請(qǐng)示,得到返回值,甚至通過(guò)IPC(Linux操作系統(tǒng)中,進(jìn)程之間通訊的機(jī)制)來(lái)跨應(yīng)用或跨進(jìn)程通訊只要有一個(gè)綁定者存在,那么服務(wù)繼續(xù)運(yùn)行,只有在所有綁定者都退出,服務(wù)才停止混合類(lèi)型兩種方法并不完全獨(dú)立,某些情況下可以混合使用保證Service后臺(tái)持續(xù)運(yùn)行,并允許交互【服務(wù)的分類(lèi)】單應(yīng)用程序多應(yīng)用程序【Started服務(wù)的生命周期】單應(yīng)用程序多應(yīng)用程序【Bound服務(wù)生命周期】【混合類(lèi)型生命周期】Started方法的實(shí)現(xiàn)步驟:繼承Service類(lèi),實(shí)現(xiàn)自己的服務(wù)重寫(xiě)mand/OnStart方法,服務(wù)的業(yè)務(wù)邏輯就寫(xiě)在這里在AndroidManifest中注冊(cè)服務(wù)用startService方法啟動(dòng)服務(wù)停止服務(wù):外部用stopService,內(nèi)部用stopSelf方法這種使用方式,服務(wù)會(huì)不定時(shí)的重啟.(非正常結(jié)束時(shí)系統(tǒng)會(huì)嘗試重新啟動(dòng))【實(shí)現(xiàn)Started服務(wù)的步驟】publicclassMusicServiceextendsService{@OverridepublicIBinderonBind(Intentintent){System.out.println("MusicServiceonBind");returnnull;}@Overridepublicintmand(Intentintent,intflags,intstartId){intiRet=super.mand(intent,flags,startId);//在這里實(shí)現(xiàn)代碼//…returniRet;}}【示例:Service類(lèi)實(shí)現(xiàn)】在AndroidMainfest.xml文件中<application> … <serviceandroid:enabled=“true”android:name=“.MusicService”</application>【示例:服務(wù)配置文件】Bound方法的實(shí)現(xiàn)步驟:繼承Service或Service類(lèi),實(shí)現(xiàn)自己的服務(wù)在Service類(lèi)中定義一個(gè)內(nèi)部類(lèi),這個(gè)類(lèi)實(shí)現(xiàn)IBinder接口,提供一個(gè)返回當(dāng)前Service對(duì)象的方法重寫(xiě)onBind()方法,服務(wù)的業(yè)務(wù)邏輯就寫(xiě)在這里,并返回剛才定義的IBinder對(duì)象。在AndroidManifest中注冊(cè)服務(wù)在Activity中用bindService方法來(lái)綁定服務(wù),并且在Activity類(lèi)中定義一個(gè)內(nèi)部類(lèi),這個(gè)類(lèi)實(shí)現(xiàn)ServiceConnection接口,用于返回綁定對(duì)象,并獲取綁定的服務(wù),通過(guò)獲取到的服務(wù)對(duì)象調(diào)用相應(yīng)的方法在Activity中用unBindService方法取消綁定服務(wù)【實(shí)現(xiàn)Bound服務(wù)的步驟】publicclassPlayServiceextendsService{ privateIBindermBinder=null; publicPlayService(){ mBinder=newPlayAdapter(); } @Override publicIBinderonBind(Intentintent){ //TODOAuto-generatedmethodstub Log.i("PlayService","onBind"); returnmBinder; }}【示例:繼承Service】有時(shí)候,我們不希望后臺(tái)服務(wù),被系統(tǒng)在資源不足的情況下,被殺死,所以我們會(huì)把服務(wù)設(shè)定為前臺(tái)服務(wù)(把服務(wù)設(shè)定為前臺(tái)服務(wù)并不是說(shuō)服務(wù)是可見(jiàn),而應(yīng)該理解為:是把服務(wù)的優(yōu)先級(jí)設(shè)高了),從而讓系統(tǒng)不會(huì)殺掉它比如:音樂(lè)播放器在后臺(tái)播放的時(shí)候,我們不希望被殺死服務(wù)開(kāi)始在前臺(tái)運(yùn)行:startForeground(int,notification)服務(wù)停止在前臺(tái)運(yùn)行:stopForeground(boolean)【在前臺(tái)運(yùn)行服務(wù)】服務(wù)端(Service)實(shí)現(xiàn)IBinder對(duì)象,并在onBind方法中返回在IBinder實(shí)現(xiàn)類(lèi)里實(shí)現(xiàn)返回實(shí)現(xiàn)要被外部調(diào)用的實(shí)現(xiàn)功能的public方法客戶端(Activity)實(shí)現(xiàn)一個(gè)類(lèi)繼承ServiceConnection,在這個(gè)類(lèi)中實(shí)現(xiàn)onServiceConnected和onServiceDisconnected方法onServiceConnected中有一個(gè)IBinder的參數(shù),直接強(qiáng)轉(zhuǎn)成服務(wù)端的Binder對(duì)象,并調(diào)用其方法來(lái)調(diào)用服務(wù)端功能。【單一應(yīng)用中簡(jiǎn)單數(shù)據(jù)交互】【簡(jiǎn)單交互圖】Android是基于Linux內(nèi)核的,各個(gè)進(jìn)程間或任務(wù)相對(duì)獨(dú)立,無(wú)法直接進(jìn)行通訊,需要借助專(zhuān)門(mén)技術(shù)來(lái)完成通訊(主要是數(shù)據(jù)交換)AndroidIPC(Inter-ProcessCommunication),進(jìn)程間通信技術(shù)如下:標(biāo)準(zhǔn)LinuxKernelIPC接口D-BUS接口AndroidBinder技術(shù)【AndroidIPC技術(shù)】AndroidBinder是一種在Android里廣泛使用的一種遠(yuǎn)程過(guò)程調(diào)用接口從結(jié)構(gòu)上來(lái)說(shuō)AndroidBinder系統(tǒng)是一種服務(wù)器/客戶機(jī)模式,包括BinderServer、BinderClient和AndroidBinder驅(qū)動(dòng),實(shí)際的數(shù)據(jù)傳輸就是通過(guò)AndroidBinder驅(qū)動(dòng)來(lái)完成的【Binder技術(shù)】【Binder機(jī)制實(shí)現(xiàn)原理】服務(wù)端(Service)和客戶端(Activity)1、服務(wù)端實(shí)現(xiàn)IBinder接口的對(duì)象,將被ServiceManager注冊(cè)登記,繼承Service可實(shí)現(xiàn)或(getDefaultServiceManager->addService)2、客戶端bindSerivce和ServiceConnection組合(或getService),得到遠(yuǎn)程端IBinder對(duì)象3、調(diào)用IBinder對(duì)象的transact方法,實(shí)現(xiàn)兩進(jìn)程間的Parcel數(shù)據(jù)交換注:ServiceManager與zygote服務(wù)都是在init進(jìn)程啟動(dòng)過(guò)程中被啟動(dòng)的注意:這個(gè)例子主要是本地應(yīng)用程序間的通信并不是遠(yuǎn)程通信。主要是為了理解Binder的調(diào)用形式,遠(yuǎn)程通信是基于這種通信形式的。【具體實(shí)現(xiàn)步驟】【IPC交互圖】publicclassMyServiceextendsService{Binderbinder=newBinder(){@OverrideprotectedbooleanonTransact(intcode,Parceldata,Parcelreply,intflags)throwsRemoteException{//TODOAuto-generatedmethodstubSystem.out.println("transactsth");returnsuper.onTransact(code,data,reply,flags);}};@OverridepublicIBinderonBind(Intentintent){//TODOAuto-generatedmethodstubreturnbinder;}}【服務(wù)端實(shí)現(xiàn)】綁定//實(shí)現(xiàn)ServiceConnection來(lái)獲得Ibinder對(duì)象IBinderbinder;ServiceConnectionsc=newServiceConnection(){@OverridepublicvoidonServiceDisconnected(ComponentNamename){}@OverridepublicvoidonServiceConnected(ComponentNamename,IBinderservice){ binder=service;}};//綁定服務(wù)Intenti=newIntent();ponent(newComponentName("llenlonv.service", "llenlonv.service.MyService"));bindService(i,sc,Context.BIND_AUTO_CREATE);【Activity實(shí)現(xiàn)(調(diào)用端)】發(fā)送消息給服務(wù)端Parceldata=Parcel.obtain();Parcelreply=Parcel.obtain();try{binder.transact(1,data,reply,0);}catch(RemoteExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}【Activity實(shí)現(xiàn)(調(diào)用端)】Android接口定義語(yǔ)言,實(shí)現(xiàn)遠(yuǎn)程的雙方在不熟悉IPC技術(shù)的條件下編寫(xiě)程序來(lái)實(shí)現(xiàn)程序間傳遞數(shù)據(jù)使用AIDL實(shí)現(xiàn)IPC服務(wù):創(chuàng)建.aidl文件-該文件(IAIDLService.aidl)定義了客戶端可用的方法和數(shù)據(jù)的接口。使用aidl工具,將接口文件轉(zhuǎn)化成IAIDLService.java,內(nèi)含Stub和Proxy定義(可由ADT插件自動(dòng)生成)實(shí)現(xiàn)接口-服務(wù)端還要定義一個(gè)服務(wù)類(lèi),內(nèi)部繼承并實(shí)現(xiàn)IAIDLService.Stub中的抽象方法客戶端使用IPlayer.Stub.asInterface靜態(tài)方法和SeviceConnection傳遞來(lái)的IBinder,獲得接口的代理實(shí)現(xiàn)對(duì)象,來(lái)實(shí)現(xiàn)對(duì)遠(yuǎn)程對(duì)象的調(diào)用【AIDL】AIDL使用類(lèi)似Java接口的語(yǔ)法來(lái)聲明IPC接口,描述其方法以及方法的參數(shù)和返回值。這些參數(shù)和返回值可以是任何類(lèi)型,甚至是其他AIDL生成的接口。重要的是必須導(dǎo)入所有非內(nèi)置類(lèi)型,哪怕是這些類(lèi)型是在與接口相同的包中。下面是AIDL能支持的數(shù)據(jù)類(lèi)型:Java編程語(yǔ)言的主要類(lèi)型(int,boolean等)—不需要import語(yǔ)句。以下的類(lèi)(不需要import語(yǔ)句):

String

List-列表中的所有元素必須是在此列出的類(lèi)型,包括其他AIDL生成的接口和可打包類(lèi)型。List可以像一般的類(lèi)(例如List<String>)那樣使用,另一邊接收的具體類(lèi)一般是一個(gè)ArrayList,這些方法會(huì)使用List接口。

Map-Map中的所有元素必須是在此列出的類(lèi)型,包括其他AIDL生成的接口和可打包類(lèi)型。一般的maps(例如Map<String,Integer>)不被支持,另一邊接收的具體類(lèi)一般是一個(gè)HashMap,這些方法會(huì)使用Map接口。

CharSequence-該類(lèi)是被TextView和其他控件對(duì)象使用的字符序列。

溫馨提示

  • 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)論