第三階段上課10、android應(yīng)用程序組件四service_第1頁
第三階段上課10、android應(yīng)用程序組件四service_第2頁
第三階段上課10、android應(yīng)用程序組件四service_第3頁
第三階段上課10、android應(yīng)用程序組件四service_第4頁
第三階段上課10、android應(yīng)用程序組件四service_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Graphic

Design

TrainingAndroid應(yīng)用程序組件(三)TRAININGCOURSE.12014-07——主講人:唐?!菊鲁棠繕?biāo)】

Service概述

Service生命周期

自定義Service

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

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

String

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

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

CharSequence-該類是被TextView和其他控件對象使用的字符序列。

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論