第八章Service詳解_第1頁
第八章Service詳解_第2頁
第八章Service詳解_第3頁
第八章Service詳解_第4頁
第八章Service詳解_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第八章第八章Service詳解詳解 倚動軟件工廠實驗室倚動軟件工廠實驗室 主要內(nèi)容主要內(nèi)容ServiceService簡介簡介Service是android 系統(tǒng)的四大組件之一,是與Activity最相似的組件,它們都是從Context派生出來的,但它不能自己運行,只能在后臺運行,可與其它組件進行交互,相當于一個沒有圖形界面的Activit組件。它需要通過某一個它需要通過某一個Activity或者其他或者其他Context對對象來調用象來調用。用途:實現(xiàn)后臺運行和跨進程訪問。通過啟動一個服務,可以在不顯示界面的情況下在后臺運行指定的任務,這樣可以不影響用戶做其他事情,如后臺播放音樂,下載資源等

2、。 Service類常用方法類常用方法 與開發(fā)其它Android組件類似,開發(fā)Service組件需要先開發(fā)一個Service子類,該類需繼承系統(tǒng)提供的Service類,與Activity類似,Service也定義了一系列生命周期方法: abstract IBinder onBind(Intent intent):該方法是一個抽象方法,所有Service的子類必須實現(xiàn)該方法。該方法將返回一個IBinder對象,應用程序可通過該對象與Service組件通信;void onCreate():當Service第一次被創(chuàng)建時,將立即回調該方法;Service類常用方法類常用方法void onDestro

3、y():當Service被關閉之前,將回調該方法;void onStartCommand(Intent intent, int flags,int startId):該方法的早期版本是void onStart(Intent intent, int startId),每次客戶端調用startService(Intent intent)方法啟動該Service時都會回調該方法;boolean onUnbind(Intent intent):當該Service上綁定的所有客戶端都斷開連接時將會回調該方法。Service開發(fā)步驟開發(fā)步驟u 開發(fā)開發(fā)Service組件需要先開發(fā)一個組件需要先開發(fā)一個Se

4、rvice子類,然后在子類,然后在AndroidManifest.xml文件中配置該文件中配置該Service,配置時可通過,配置時可通過元素指定它可被哪些元素指定它可被哪些Intent啟動。啟動。u 在AndroidManifest.xml文件中配置Service: 注意事項注意事項u Action中的值一定要與程序中創(chuàng)建的Intent的Action的值一致,程序是根據(jù)Action的值來查找相應的Service從而啟動它。u 在為Service注冊后,我們便可以通過startService()或BindService()方法來啟動該Service。通過stopService()來停止Serv

5、ice,unbindService()來解除與Service的綁定。Service啟動方法啟動方法Android系統(tǒng)中,啟動Service有兩種方式:u通過Context的startService()啟動Service,訪問者與Service之間沒有關聯(lián),該Service將一直在后臺執(zhí)行,即使調用startService的進程結束了,Service仍然還存在,直到有進程調用stopService,或者Service結束自己(stopSelf()。這種情況下,Service與訪問者之間無法進行通信、數(shù)據(jù)交換。u通過Context的 bindService()方法啟動,Service就和調用bin

6、dService的組件綁定在一起,也就是說當調用bindService的組件銷毀了,那么它綁定的Service也要跟著被結束。Service啟動方法啟動方法注意注意:(1)一個服務可以與多個組件綁定,只有當所有的組件都與之解除綁定,該服務才會被銷毀。(2)以上兩種啟動Service的方法可以混合使用,只要Service同時實現(xiàn)了onStartedCommand() 和onBind()方法,那么只有調用stopService(),并調用unbindService()方法后,該Service才會被銷毀。bindServicebindService方法方法 Context(調用服務組件)的bindS

7、ervice()方法的完整方法簽名為:bindService(Intent service,ServiceConnection conn, int flags),該方法的三個參數(shù)解釋如下: service:該參數(shù)表示與服務類相關聯(lián)的Intent對象,用于指定所要啟動的Service; flags:指定綁定時是否自動創(chuàng)建Service(如果Service還未創(chuàng)建)。該參數(shù)可指定0(不自動創(chuàng)建)或BIND_AUTO_CREATE(自動創(chuàng)建)。bindServicebindService方法方法 conn:該參數(shù)是一個ServiceConnection對象,該對象用于監(jiān)聽訪問者與Service之間的

8、連接情況。當訪問者與Service之間連接成功時,將回調該ServiceConnection對象的onServiceConnected(ComponentName name,IBinder service)方法;當訪問者與Service之間斷開連接時將回調該ServiceConnection對象的onServiceDisconnected(ComponentName name)方法。onBindonBind方法方法(Service)(Service)u 當開發(fā)Service類時,該Service類必須提供一個onBind()方法,在綁定本地Service的情況下,onBind()方法所返回的I

9、Binder接口將會傳給ServiceConnection對象里onServiceConnected(ComponentName name,IBinder service)方法的service參數(shù),這樣訪問者就可以通過IBinder接口與Service進行通信,對Service中的數(shù)據(jù)進行操作。u 實際開發(fā)時通常會采用繼承Binder類類(IBinder接口的實現(xiàn)類)的方式實現(xiàn)自己的IBinder接口。案例案例(FirstService)1、通過、通過Context的的startService()方法啟動和停止()方法啟動和停止Service2、通過、通過Context的的bindServic

10、e()方法綁定和解除綁定()方法綁定和解除綁定3、兩種方式混合使用、兩種方式混合使用ServiceService詳解詳解兩種方式混合使用時,方法的執(zhí)行順序是怎么樣的?兩種方式混合使用時,方法的執(zhí)行順序是怎么樣的?問題與討論問題與討論1、先啟動后綁定、先啟動后綁定2、先綁定后啟動、先綁定后啟動案例總結案例總結ServiceService的生命周期的生命周期u 每當Service被創(chuàng)建時會回調onCreate方法,每次Service被啟動時都會回調onStartCommand方法,多次啟動一個已有的Service組件將不會再回調onCreate方法,但每次啟動時都會回調onStartCommand

11、方法。u 綁定服務的執(zhí)行過程: 執(zhí)行單擊事件方法根據(jù)Intent找到相應的Service類,并初始化該類調用Service的onCreate方法調用該類的onBind方法調用Activity的onServiceConnected方法。u 多次單擊綁定服務按鈕,并不會重復執(zhí)行綁定方法。一旦解綁,調用unBind()方法,然后自動銷毀。AIDLAIDL簡介簡介u AIDL是一種接口定義語言,用于約束兩個進程間通信規(guī)則,供編譯器生成代碼,實現(xiàn)Android設備上的兩個進程間通信(IPC)。u進程之間的通信信息,首先會被轉換成AIDL協(xié)議消息,然后發(fā)送給對方,對方收到AIDL協(xié)議消息后再轉換成相應的對

12、象。u由于進程之間的通信信息需要雙向轉換,所以android采用代理類在背后實現(xiàn)了信息的雙向轉換,代理類由android編譯器生成,對開發(fā)人員來說是透明的。AIDL:Android Interface Definition LAIDLAIDL簡介簡介u 客戶端訪問Service時,Android并不是直接返回Service對象給客戶端,Service只是將一個回調對象(IBinder對象)通過onBind()方法回調給客戶端。u 與綁定本地Service不同的是,本地Service的onBind()方法會直接把IBinder對象本身傳給客戶端的ServiceConnection的onServi

13、ceConnected方法的第二個參數(shù)。但遠程Service的onBind()方法只是將IBinder對象的代理傳給客戶端的ServiceConnection的onServiceConnected方法的第二個參數(shù)。當客戶端獲取了遠程的Service的IBinder對象的代理之后,接下來可通過該IBinder對象去回調遠程Service的屬性或方法。AIDLAIDL簡介簡介 AIDL定義接口的源代碼必須以.aidl結尾; AIDL接口中用到數(shù)據(jù)類型,除了基本類型、String、List、Map、CharSequence之外,其他類型全部都需要導包,即使它們在同一個包中也需要導包。 定義好AIDL

14、接口之后(如Song.aidl),ADT工具會自動在gen目錄下生成相應的包,并生成一個Song.java接口,在該接口里包含一個Stub內(nèi)部類,該內(nèi)部類實現(xiàn)了IBinder、Song兩個接口,這個Stub類將會作為遠程Service的回調類。它內(nèi)部能實現(xiàn)一些功能。 開發(fā)客戶端的第一步就是將Service端的AIDL接口文件復制到客戶端應用中,復制到客戶端后ADT工具會為AIDL接口生成相應的Java接口類。AIDL使用時需注意:使用時需注意:客戶端訪問客戶端訪問AIDLServiceAIDLService 1、創(chuàng)建、創(chuàng)建ServiceConnection對象;對象; 2、以、以Service

15、Connection對象作為參數(shù),調用對象作為參數(shù),調用Context的的bindService()方法綁定遠程方法綁定遠程Service。 3、將返回的、將返回的IBinder對象的代理類轉換成對象的代理類轉換成IBinder對象,對象,從而調用從而調用Service中的相應方法。中的相應方法。 客戶端綁定遠程Service與綁定本地Service的區(qū)別不大,同樣只需要三步:案例案例 通過一個按鈕來獲取遠程通過一個按鈕來獲取遠程ServiceService的狀態(tài),并顯示在的狀態(tài),并顯示在兩個文本框中。兩個文本框中。 【示例代碼:示例代碼:codes/08/ADILClientcodes/08

16、/ADILClient】案例案例 假設A應用需要與B應用進行通信,調用B應用中的getColor()、getWeight()方法,B應用以Service方式向A應用提供服務。(我們可以把A應用看成是客戶端,B應用看成是服務端,分別命名為AIDLClient 、AIDLServer)。整個過程需要以下四步: 1、在Server端編寫AIDL文件package .android;interface SongString getName();String getAuthor();案例案例u 編寫Aidl文件時,需要注意注意: 1.接口名和aidl文件名相同; 2.接口和方法前不用加訪問權限修飾符pu

17、blic,private等,也不能用final,static; 3.Aidl默認支持的類型包話java基本類型(int、long、boolean等)和(String、List、Map、CharSequence),使用這些類型時不需要import聲明。對于List和Map中的元素類型必須是Aidl支持的類型。如果使用自定義類型作為參數(shù)或返回值,自定義類型必須實現(xiàn)Parcelable接口。 4.自定義類型和AIDL生成的其它接口類型在aidl描述文件中,應該顯式import,即便在該類和定義的包在同一個包中。 5.在aidl文件中所有非Java基本類型參數(shù)必須加上in、out、inout標記,以指

18、明參數(shù)是輸入?yún)?shù)、輸出參數(shù)還是輸入輸出參數(shù)。 6.Java原始類型默認的標記為in,不能為其它標記。案例案例u 當完成aidl文件創(chuàng)建后,eclipse會自動在項目的gen目錄中同步生成Song.java接口文件。接口文件中生成一個Stub的抽象類,里面包括aidl定義的方法,還包括一些其它輔助性的方法。u 對于遠程服務調用,遠程服務返回給客戶端的對象為代理對象,客戶端在onServiceConnected(ComponentName name, IBinder service)方法引用該對象時不能直接強轉成接口類型的實例,而應該使用asInterface(IBinder iBinder)進行

19、類型轉換。案例案例 2、在ADILServer應用中實現(xiàn)aidl文件生成的接口(本例是Song),但并非直接實現(xiàn)接口,而是通過繼承接口的Stub來實現(xiàn)(Stub抽象類內(nèi)部實現(xiàn)了aidl接口),并且實現(xiàn)接口中的方法。public class SongBinder extends Stubpublic String getName() throws RemoteException return name;public String getAuthor() throws RemoteException return author;案例案例 3、把AIDLService應用中aidl文件所在package連同aidl文件一起拷貝到客戶端AIDLClient應用,eclipse會自動在A應用的gen目錄中為aidl文件同步生成ICat.java接口文件,接下來就可以在AIDLClient應用中實現(xiàn)與AIDLService應用通信。AIDLClie

溫馨提示

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

評論

0/150

提交評論