第7章Android后臺(tái)服務(wù)_第1頁(yè)
第7章Android后臺(tái)服務(wù)_第2頁(yè)
第7章Android后臺(tái)服務(wù)_第3頁(yè)
第7章Android后臺(tái)服務(wù)_第4頁(yè)
第7章Android后臺(tái)服務(wù)_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章后臺(tái)服務(wù)7.1

Service簡(jiǎn)介ServiceService是Android系統(tǒng)的服務(wù)組件,適用于開發(fā)沒有用戶界面且長(zhǎng)時(shí)間在后臺(tái)運(yùn)行的應(yīng)用功能。因?yàn)槭謾C(jī)硬件性能和屏幕尺寸的限制,通常Android系統(tǒng)僅允許一個(gè)應(yīng)用程序處于激活狀態(tài)并顯示在手機(jī)屏幕上,而暫停其他處于未激活狀態(tài)的程序。因此,Android系統(tǒng)提供了一種后臺(tái)服務(wù)機(jī)制,允許在沒有用戶界面的情況下,使程序能夠長(zhǎng)時(shí)間在后臺(tái)運(yùn)行,實(shí)現(xiàn)應(yīng)用程序的后臺(tái)服務(wù)功能,并能夠處理事件或數(shù)據(jù)更新。7.1

Service簡(jiǎn)介ServiceAndroid系統(tǒng)提供的Service(服務(wù))組件,不直接與用戶進(jìn)行交互,能夠長(zhǎng)期在后臺(tái)運(yùn)行。在實(shí)際應(yīng)用中,很多應(yīng)用使用Service,如音頻播放器,軟件需要在關(guān)閉播放器界面后,仍能夠保持音樂持續(xù)播放,這就需要在Service組件中實(shí)現(xiàn)音樂播放功能7.1

Service簡(jiǎn)介Service

Service適用于無需用戶干預(yù),長(zhǎng)期運(yùn)行的后臺(tái)功能Service沒有用戶界面,有利于降低系統(tǒng)資源的消耗Service比Activity具有更高的優(yōu)先級(jí),因此在系統(tǒng)資源緊張時(shí),Service不會(huì)被Android系統(tǒng)優(yōu)先終止即使Service被系統(tǒng)終止,在系統(tǒng)資源恢復(fù)后Service也將自動(dòng)恢復(fù)運(yùn)行狀態(tài),因此可以認(rèn)為Service是在系統(tǒng)中永久運(yùn)行的組件Service除了實(shí)現(xiàn)后臺(tái)服務(wù)功能,還可以用于進(jìn)程間通信(InterProcessCommunication,IPC),解決不同Android應(yīng)用程序進(jìn)程之間的調(diào)用和通訊問題7.1

Service簡(jiǎn)介Service生命周期Service生命周期包括完全生命周期:onCreate()開始到OnDestroy()結(jié)束?;顒?dòng)生命周期:onStartCommand()/onStart()開始到OnDestroy()結(jié)束。onCreate():Service的生命周期開始,完成Service的初始化工作。onStartCommand()/onStart():活動(dòng)生命周期開始,執(zhí)行的操作。(onStart()在Android2之后已經(jīng)不再使用)onDestroy():Service的生命周期結(jié)束,釋放Service所有占用的資源。7.1

Service簡(jiǎn)介Service生命周期Service的使用方式一般有兩種啟動(dòng)方式:使用startService()方法啟用服務(wù)后,調(diào)用者與服務(wù)之間沒有關(guān)連。調(diào)用者直接退出而沒有調(diào)用stopService的話,Service會(huì)一直在后臺(tái)運(yùn)行。下次調(diào)用者啟動(dòng)仍然可以繼續(xù)調(diào)用Service

。綁定方式:

使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在一起了,調(diào)用者一旦退出,服務(wù)也就自動(dòng)終止。7.1

Service簡(jiǎn)介啟動(dòng)方式通過調(diào)用Context.startService()啟動(dòng)Service,通過調(diào)用Context.stopService()或Service.stopSelf()停止Service。因此,Service一定是由其它的組件啟動(dòng)的,但停止過程可以通過其它組件或自身完成在啟動(dòng)方式中,啟動(dòng)Service的組件不能夠獲取到Service的對(duì)象實(shí)例,因此無法調(diào)用Service中的任何函數(shù),也不能夠獲取到Service中的任何狀態(tài)和數(shù)據(jù)信息能夠以啟動(dòng)方式使用的Service,需要具備自管理的能力,而且不需要從通過函數(shù)調(diào)用獲取Service的功能和數(shù)據(jù)啟動(dòng)流程:如果調(diào)用前服務(wù)沒有被創(chuàng)建,則會(huì)引起onCreate()->onStartCommand();如果已被創(chuàng)建,則多次調(diào)用startService只會(huì)引起onStartCommand()被多次調(diào)用。7.1

Service簡(jiǎn)介綁定方式調(diào)用者(綁定Service的組件)可以調(diào)用Service中實(shí)現(xiàn)的函數(shù),或直接獲取Service中的狀態(tài)和數(shù)據(jù)信息調(diào)用者通過Context.bindService()建立服務(wù)鏈接,通過Context.unbindService()停止服務(wù)鏈接。如果在綁定過程中Service沒有啟動(dòng),Context.bindService()會(huì)自動(dòng)啟動(dòng)Service,而且同一個(gè)Service可以綁定多個(gè)服務(wù)鏈接,這樣可以同時(shí)為多個(gè)不同的組件提供服務(wù)。啟動(dòng)流程:如果調(diào)用前服務(wù)沒被創(chuàng)建,則會(huì)引起onCreate()->onStartCommand();如果已被創(chuàng)建,則多次調(diào)用startService只會(huì)引起onStartCommand()被多次調(diào)用。結(jié)束方式:只能調(diào)用Context.stopService()結(jié)束服務(wù),系統(tǒng)會(huì)自動(dòng)調(diào)用到onDestroy()方法。7.1

Service簡(jiǎn)介啟動(dòng)方式和綁定方式的結(jié)合這兩種使用方法并不是完全獨(dú)立的,在某些情況下可以混合使用如音樂播放器,后臺(tái)工作的Service通過Context.startService()啟動(dòng)某個(gè)音樂播放,但在播放過程中如果用戶需要暫停音樂播放,則需要通過Context.bindService()獲取服務(wù)鏈接和Service對(duì)象實(shí)例,進(jìn)而通過調(diào)用Service對(duì)象實(shí)例中的函數(shù),暫停音樂播放過程,并保存相關(guān)信息在這種情況下,如果調(diào)用Context.stopService()并不能夠停止Service,需要在所有的服務(wù)鏈接關(guān)閉后,Service才能夠真正的停止。7.2本地服務(wù)本地服務(wù)的調(diào)用者和服務(wù)都在同一個(gè)程序中,是不需要跨進(jìn)程就可以實(shí)現(xiàn)服務(wù)的調(diào)用本地服務(wù)涉及服務(wù)的建立、啟動(dòng)和停止,服務(wù)的綁定和取消綁定,以及如何在線程中實(shí)現(xiàn)服務(wù)7.2.1服務(wù)管理服務(wù)管理主要指服務(wù)的啟動(dòng)和停止Service是一段在后臺(tái)運(yùn)行、沒有用戶界面的代碼:7.2本地服務(wù)7.2.1服務(wù)管理7.2本地服務(wù)7.2.1服務(wù)管理使用Service需要導(dǎo)入的包:1importandroid.app.Service;2importandroid.content.Intent;3importandroid.os.IBinder;第5行:RandomService繼承了android.app.Service類第7行重載onBind()函數(shù),onBind()函數(shù)是在Service被綁定后調(diào)用的函數(shù),返回Service的對(duì)象實(shí)例7.2本地服務(wù)7.2.1服務(wù)管理Service一般需要重載onCreate()、onStartCommand()和onDestroy()。Android系統(tǒng)在創(chuàng)建Service時(shí),會(huì)自動(dòng)調(diào)用onCreate(),用戶一般在onCreate()完成必要的初始化工作,例如創(chuàng)建線程、建立數(shù)據(jù)庫(kù)鏈接等在Service關(guān)閉前,系統(tǒng)會(huì)自動(dòng)調(diào)用onDestroy()函數(shù)釋放所有占用的資源。通過Context.startService(Intent)啟動(dòng)Service,

onStartCommand()/onStart()則會(huì)被調(diào)用,重要的參數(shù)通過參數(shù)Intent傳遞給Service7.2本地服務(wù)7.2.1服務(wù)管理7.2本地服務(wù)7.2.1服務(wù)管理完成Service類后,需要在AndroidManifest.xml文件中注冊(cè)這個(gè)Service注冊(cè)Service非常重要,如果開發(fā)人員不對(duì)Service進(jìn)行注冊(cè),則Service根本無法啟動(dòng)AndroidManifest.xml文件注冊(cè)Service:<serviceandroid:name=".RandomService"/>使用<service>標(biāo)簽聲明服務(wù),其中的android:name表示Service類的名稱,一定要與建立的Service類名稱一致7.2本地服務(wù)7.2.1服務(wù)管理在完成Service代碼和在AndroidManifest.xml文件中注冊(cè)后。有兩種方法啟動(dòng)Service,顯式啟動(dòng)和隱式啟動(dòng)顯式啟動(dòng)需要在Intent中指明Service所在的類,并調(diào)用startService(Intent)啟動(dòng)ServicefinalIntentserviceIntent=newIntent(this,RandomService.class);startService(serviceIntent);//Intent指明了啟動(dòng)的Service所在類為RandomSerevice7.2本地服務(wù)7.2.1服務(wù)管理停止Service:將啟動(dòng)Service的Intent傳遞給stopService()函數(shù):stopService(serviceIntent);在首次調(diào)用startService(Intent)函數(shù)啟動(dòng)Service后,系統(tǒng)會(huì)先后調(diào)用onCreate()和onStartCommand()。如果是第二次調(diào)用startService(Intent)函數(shù),系統(tǒng)則僅調(diào)用onStartCommand(),而不再調(diào)用onCreate()在調(diào)用stopService(Intent)函數(shù)停止Service時(shí),系統(tǒng)會(huì)調(diào)用onDestroy()無論調(diào)用過多少次startService(Intent),在調(diào)用stopService(Intent)函數(shù)時(shí),系統(tǒng)僅調(diào)用一次onDestroy()7.2本地服務(wù)7.2.1服務(wù)管理SimpleRandomServiceDemo是在應(yīng)用程序中使用Service的示例,這個(gè)示例使用顯式啟動(dòng)的方式啟動(dòng)Service在工程中創(chuàng)建了RandomService服務(wù),該服務(wù)啟動(dòng)后會(huì)產(chǎn)生一個(gè)隨機(jī)數(shù),并使用Toast顯示在屏幕上,如右圖所示7.2本地服務(wù)7.2.1服務(wù)管理示例通過界面上的“啟動(dòng)Service”按鈕調(diào)用startService(Intent)函數(shù),啟動(dòng)RandomService服務(wù)“停止Service”按鈕調(diào)用stopService(Intent)函數(shù),停止RandomService服務(wù)為了能夠清晰的觀察Service中onCreate()、

onStartCommand()和onDestroy()三個(gè)函數(shù)的調(diào)用順序,在每個(gè)函數(shù)中都使用Toast在界面上產(chǎn)生提示信息RandomService.java文件的代碼如下7.2本地服務(wù)7.2.1服務(wù)管理RandomService.java文件的代碼7.2本地服務(wù)7.2.1服務(wù)管理RandomService.java文件的代碼7.2本地服務(wù)7.2.1服務(wù)管理RandomService.java文件的代碼7.2本地服務(wù)7.2.1服務(wù)管理AndroidManifest.xml文件的代碼如下7.2本地服務(wù)7.2.1服務(wù)管理示例SimpleRandomServiceDemoActivity.java文件的代碼如下7.2本地服務(wù)7.2.1服務(wù)管理SimpleRandomServiceDemoActivity.java文件的代碼7.2本地服務(wù)7.2.1服務(wù)管理SimpleRandomServiceDemoActivity.java文件的代碼7.2本地服務(wù)7.2.3服務(wù)綁定當(dāng)程序通過startService()和stopService()啟動(dòng)、關(guān)閉Service時(shí),Service與訪問者之間基本上不存在關(guān)聯(lián),因此Service和訪問者之間無法進(jìn)行通信、數(shù)據(jù)交換。如果Service和訪問者之間需要進(jìn)行方法調(diào)用或數(shù)據(jù)交換時(shí),則應(yīng)該使用bindService()和unbindService方法啟動(dòng)、關(guān)閉服務(wù)。以綁定方式使用Service,能夠獲取到Service實(shí)例,不僅能夠正常啟動(dòng)Service,還能夠調(diào)用Service中的公有方法和屬性為了使Service支持綁定,需要在Service類中重載onBind()方法,并在onBind()方法中返回Service實(shí)例:7.2本地服務(wù)7.2.3服務(wù)綁定7.2本地服務(wù)7.2.3服務(wù)綁定當(dāng)Service被綁定時(shí),系統(tǒng)會(huì)調(diào)用onBind()函數(shù),通過onBind()函數(shù)的返回值,將Service實(shí)例返回給調(diào)用者從第11行代碼中可以看出,onBind()函數(shù)的返回值必須符合IBinder接口,因此在代碼的第2行聲明一個(gè)接口變量mBinder,mBinder符合onBind()函數(shù)返回值的要求,因此可將mBinder傳遞給調(diào)用者IBinder是用于進(jìn)程內(nèi)部和進(jìn)程間過程調(diào)用的輕量級(jí)接口,定義了與遠(yuǎn)程對(duì)象交互的抽象協(xié)議,使用時(shí)通過繼承Binder的方法來實(shí)現(xiàn)繼承Binder的代碼在第4行,LocalBinder是繼承Binder的一個(gè)內(nèi)部類,并在代碼第5行實(shí)現(xiàn)了getService()函數(shù),當(dāng)調(diào)用者獲取到mBinder后,通過調(diào)用getService()即可獲取到Service實(shí)例7.2本地服務(wù)7.2.3服務(wù)綁定調(diào)用者通過bindService()函數(shù)綁定服務(wù)調(diào)用者通過bindService()函數(shù)綁定服務(wù),并在第1個(gè)參數(shù)中將Intent傳遞給bindService()函數(shù),聲明需要啟動(dòng)的Service第3個(gè)參數(shù)Context.BIND_AUTO_CREATE表明只要綁定存在,就自動(dòng)建立Service同時(shí)也告知Android系統(tǒng),這個(gè)Service的重要程度與調(diào)用者相同,除非考慮終止調(diào)用者,否則不要關(guān)閉這個(gè)Service7.2本地服務(wù)7.2.3服務(wù)綁定bindService()函數(shù)的第2個(gè)參數(shù)是ServiceConnnection當(dāng)綁定成功后,系統(tǒng)將調(diào)用ServiceConnnection的onServiceConnected()方法當(dāng)綁定意外斷開后,系統(tǒng)將調(diào)用ServiceConnnection中的onServiceDisconnected方法因此,以綁定方式使用Service,調(diào)用者需要聲明一個(gè)ServiceConnnection,并重載內(nèi)部的onServiceConnected()方法和onServiceDisconnected方法,兩個(gè)方法的重載代碼如下7.2本地服務(wù)7.2.3服務(wù)綁定7.2本地服務(wù)7.2.3服務(wù)綁定在代碼的第4行中,綁定成功后通過getService()獲取Service實(shí)例,這樣便可以調(diào)用Service中的方法和屬性代碼第8行將Service實(shí)例指為null,表示綁定意外失效時(shí),Service實(shí)例不再可用取消綁定僅需要使用unbindService()方法,并將ServiceConnnection傳遞給unbindService()方法但需要注意的是,unbindService()方法成功后,系統(tǒng)并不會(huì)調(diào)用onServiceConnected(),因?yàn)閛nServiceConnected()僅在意外斷開綁定時(shí)才被調(diào)用1unbindService(mConnection);7.2本地服務(wù)7.2.3服務(wù)綁定綁定方式中,當(dāng)調(diào)用者通過bindService()函數(shù)綁定Servcie時(shí),onCreate()函數(shù)和onBinde()函數(shù)將被先后調(diào)用當(dāng)調(diào)用者通過unbindService()函數(shù)取消綁定Servcie時(shí),onUnbind()函數(shù)將被調(diào)用。如果onUnbind()函數(shù)返回true,則表示重新綁定服務(wù)時(shí),onRebind()函數(shù)將被調(diào)用。綁定方式的函數(shù)調(diào)用順序如下圖所示7.2本地服務(wù)7.2.3服務(wù)綁定SimpleMathServiceDemo是綁定方式使用Service的示例在示例中創(chuàng)建了MathService服務(wù),用來完成簡(jiǎn)單的數(shù)學(xué)運(yùn)算,這里的數(shù)學(xué)運(yùn)算僅指加法運(yùn)算,雖然沒有實(shí)際意義,但可以說明如何使用綁定方式調(diào)用Service中的公有方法在服務(wù)綁定后,用戶可以點(diǎn)擊“加法運(yùn)算”,將兩個(gè)隨機(jī)產(chǎn)生的數(shù)值傳遞給MathService服務(wù),并從MathService實(shí)例中獲取到加法運(yùn)算的結(jié)果,然后顯示在屏幕的上方“取消綁定”按鈕可以解除與MathService的綁定關(guān)系,在取消綁定后,點(diǎn)擊“加法運(yùn)算”按鈕將無法獲取運(yùn)算結(jié)果7.2本地服務(wù)7.2.3服務(wù)綁定SimpleMathServiceDemo是綁定方式使用Service的示例SimpleMathServiceDemo的用戶界面如下圖所示7.2本地服務(wù)7.2.3服務(wù)綁定SimpleMathServic

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論