版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第7章后臺服務(wù)7.1
Service簡介ServiceService是Android系統(tǒng)的服務(wù)組件,適用于開發(fā)沒有用戶界面且長時間在后臺運行的應(yīng)用功能。因為手機硬件性能和屏幕尺寸的限制,通常Android系統(tǒng)僅允許一個應(yīng)用程序處于激活狀態(tài)并顯示在手機屏幕上,而暫停其他處于未激活狀態(tài)的程序。因此,Android系統(tǒng)提供了一種后臺服務(wù)機制,允許在沒有用戶界面的情況下,使程序能夠長時間在后臺運行,實現(xiàn)應(yīng)用程序的后臺服務(wù)功能,并能夠處理事件或數(shù)據(jù)更新。7.1
Service簡介ServiceAndroid系統(tǒng)提供的Service(服務(wù))組件,不直接與用戶進行交互,能夠長期在后臺運行。在實際應(yīng)用中,很多應(yīng)用使用Service,如音頻播放器,軟件需要在關(guān)閉播放器界面后,仍能夠保持音樂持續(xù)播放,這就需要在Service組件中實現(xiàn)音樂播放功能7.1
Service簡介Service
Service適用于無需用戶干預(yù),長期運行的后臺功能Service沒有用戶界面,有利于降低系統(tǒng)資源的消耗Service比Activity具有更高的優(yōu)先級,因此在系統(tǒng)資源緊張時,Service不會被Android系統(tǒng)優(yōu)先終止即使Service被系統(tǒng)終止,在系統(tǒng)資源恢復(fù)后Service也將自動恢復(fù)運行狀態(tài),因此可以認為Service是在系統(tǒng)中永久運行的組件Service除了實現(xiàn)后臺服務(wù)功能,還可以用于進程間通信(InterProcessCommunication,IPC),解決不同Android應(yīng)用程序進程之間的調(diào)用和通訊問題7.1
Service簡介Service生命周期Service生命周期包括完全生命周期:onCreate()開始到OnDestroy()結(jié)束?;顒由芷冢簅nStartCommand()/onStart()開始到OnDestroy()結(jié)束。onCreate():Service的生命周期開始,完成Service的初始化工作。onStartCommand()/onStart():活動生命周期開始,執(zhí)行的操作。(onStart()在Android2之后已經(jīng)不再使用)onDestroy():Service的生命周期結(jié)束,釋放Service所有占用的資源。7.1
Service簡介Service生命周期Service的使用方式一般有兩種啟動方式:使用startService()方法啟用服務(wù)后,調(diào)用者與服務(wù)之間沒有關(guān)連。調(diào)用者直接退出而沒有調(diào)用stopService的話,Service會一直在后臺運行。下次調(diào)用者啟動仍然可以繼續(xù)調(diào)用Service
。綁定方式:
使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在一起了,調(diào)用者一旦退出,服務(wù)也就自動終止。7.1
Service簡介啟動方式通過調(diào)用Context.startService()啟動Service,通過調(diào)用Context.stopService()或Service.stopSelf()停止Service。因此,Service一定是由其它的組件啟動的,但停止過程可以通過其它組件或自身完成在啟動方式中,啟動Service的組件不能夠獲取到Service的對象實例,因此無法調(diào)用Service中的任何函數(shù),也不能夠獲取到Service中的任何狀態(tài)和數(shù)據(jù)信息能夠以啟動方式使用的Service,需要具備自管理的能力,而且不需要從通過函數(shù)調(diào)用獲取Service的功能和數(shù)據(jù)啟動流程:如果調(diào)用前服務(wù)沒有被創(chuàng)建,則會引起onCreate()->onStartCommand();如果已被創(chuàng)建,則多次調(diào)用startService只會引起onStartCommand()被多次調(diào)用。7.1
Service簡介綁定方式調(diào)用者(綁定Service的組件)可以調(diào)用Service中實現(xiàn)的函數(shù),或直接獲取Service中的狀態(tài)和數(shù)據(jù)信息調(diào)用者通過Context.bindService()建立服務(wù)鏈接,通過Context.unbindService()停止服務(wù)鏈接。如果在綁定過程中Service沒有啟動,Context.bindService()會自動啟動Service,而且同一個Service可以綁定多個服務(wù)鏈接,這樣可以同時為多個不同的組件提供服務(wù)。啟動流程:如果調(diào)用前服務(wù)沒被創(chuàng)建,則會引起onCreate()->onStartCommand();如果已被創(chuàng)建,則多次調(diào)用startService只會引起onStartCommand()被多次調(diào)用。結(jié)束方式:只能調(diào)用Context.stopService()結(jié)束服務(wù),系統(tǒng)會自動調(diào)用到onDestroy()方法。7.1
Service簡介啟動方式和綁定方式的結(jié)合這兩種使用方法并不是完全獨立的,在某些情況下可以混合使用如音樂播放器,后臺工作的Service通過Context.startService()啟動某個音樂播放,但在播放過程中如果用戶需要暫停音樂播放,則需要通過Context.bindService()獲取服務(wù)鏈接和Service對象實例,進而通過調(diào)用Service對象實例中的函數(shù),暫停音樂播放過程,并保存相關(guān)信息在這種情況下,如果調(diào)用Context.stopService()并不能夠停止Service,需要在所有的服務(wù)鏈接關(guān)閉后,Service才能夠真正的停止。7.2本地服務(wù)本地服務(wù)的調(diào)用者和服務(wù)都在同一個程序中,是不需要跨進程就可以實現(xiàn)服務(wù)的調(diào)用本地服務(wù)涉及服務(wù)的建立、啟動和停止,服務(wù)的綁定和取消綁定,以及如何在線程中實現(xiàn)服務(wù)7.2.1服務(wù)管理服務(wù)管理主要指服務(wù)的啟動和停止Service是一段在后臺運行、沒有用戶界面的代碼: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的對象實例7.2本地服務(wù)7.2.1服務(wù)管理Service一般需要重載onCreate()、onStartCommand()和onDestroy()。Android系統(tǒng)在創(chuàng)建Service時,會自動調(diào)用onCreate(),用戶一般在onCreate()完成必要的初始化工作,例如創(chuàng)建線程、建立數(shù)據(jù)庫鏈接等在Service關(guān)閉前,系統(tǒng)會自動調(diào)用onDestroy()函數(shù)釋放所有占用的資源。通過Context.startService(Intent)啟動Service,
onStartCommand()/onStart()則會被調(diào)用,重要的參數(shù)通過參數(shù)Intent傳遞給Service7.2本地服務(wù)7.2.1服務(wù)管理7.2本地服務(wù)7.2.1服務(wù)管理完成Service類后,需要在AndroidManifest.xml文件中注冊這個Service注冊Service非常重要,如果開發(fā)人員不對Service進行注冊,則Service根本無法啟動AndroidManifest.xml文件注冊Service:<serviceandroid:name=".RandomService"/>使用<service>標簽聲明服務(wù),其中的android:name表示Service類的名稱,一定要與建立的Service類名稱一致7.2本地服務(wù)7.2.1服務(wù)管理在完成Service代碼和在AndroidManifest.xml文件中注冊后。有兩種方法啟動Service,顯式啟動和隱式啟動顯式啟動需要在Intent中指明Service所在的類,并調(diào)用startService(Intent)啟動ServicefinalIntentserviceIntent=newIntent(this,RandomService.class);startService(serviceIntent);//Intent指明了啟動的Service所在類為RandomSerevice7.2本地服務(wù)7.2.1服務(wù)管理停止Service:將啟動Service的Intent傳遞給stopService()函數(shù):stopService(serviceIntent);在首次調(diào)用startService(Intent)函數(shù)啟動Service后,系統(tǒng)會先后調(diào)用onCreate()和onStartCommand()。如果是第二次調(diào)用startService(Intent)函數(shù),系統(tǒng)則僅調(diào)用onStartCommand(),而不再調(diào)用onCreate()在調(diào)用stopService(Intent)函數(shù)停止Service時,系統(tǒng)會調(diào)用onDestroy()無論調(diào)用過多少次startService(Intent),在調(diào)用stopService(Intent)函數(shù)時,系統(tǒng)僅調(diào)用一次onDestroy()7.2本地服務(wù)7.2.1服務(wù)管理SimpleRandomServiceDemo是在應(yīng)用程序中使用Service的示例,這個示例使用顯式啟動的方式啟動Service在工程中創(chuàng)建了RandomService服務(wù),該服務(wù)啟動后會產(chǎn)生一個隨機數(shù),并使用Toast顯示在屏幕上,如右圖所示7.2本地服務(wù)7.2.1服務(wù)管理示例通過界面上的“啟動Service”按鈕調(diào)用startService(Intent)函數(shù),啟動RandomService服務(wù)“停止Service”按鈕調(diào)用stopService(Intent)函數(shù),停止RandomService服務(wù)為了能夠清晰的觀察Service中onCreate()、
onStartCommand()和onDestroy()三個函數(shù)的調(diào)用順序,在每個函數(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ù)綁定當程序通過startService()和stopService()啟動、關(guān)閉Service時,Service與訪問者之間基本上不存在關(guān)聯(lián),因此Service和訪問者之間無法進行通信、數(shù)據(jù)交換。如果Service和訪問者之間需要進行方法調(diào)用或數(shù)據(jù)交換時,則應(yīng)該使用bindService()和unbindService方法啟動、關(guān)閉服務(wù)。以綁定方式使用Service,能夠獲取到Service實例,不僅能夠正常啟動Service,還能夠調(diào)用Service中的公有方法和屬性為了使Service支持綁定,需要在Service類中重載onBind()方法,并在onBind()方法中返回Service實例:7.2本地服務(wù)7.2.3服務(wù)綁定7.2本地服務(wù)7.2.3服務(wù)綁定當Service被綁定時,系統(tǒng)會調(diào)用onBind()函數(shù),通過onBind()函數(shù)的返回值,將Service實例返回給調(diào)用者從第11行代碼中可以看出,onBind()函數(shù)的返回值必須符合IBinder接口,因此在代碼的第2行聲明一個接口變量mBinder,mBinder符合onBind()函數(shù)返回值的要求,因此可將mBinder傳遞給調(diào)用者IBinder是用于進程內(nèi)部和進程間過程調(diào)用的輕量級接口,定義了與遠程對象交互的抽象協(xié)議,使用時通過繼承Binder的方法來實現(xiàn)繼承Binder的代碼在第4行,LocalBinder是繼承Binder的一個內(nèi)部類,并在代碼第5行實現(xiàn)了getService()函數(shù),當調(diào)用者獲取到mBinder后,通過調(diào)用getService()即可獲取到Service實例7.2本地服務(wù)7.2.3服務(wù)綁定調(diào)用者通過bindService()函數(shù)綁定服務(wù)調(diào)用者通過bindService()函數(shù)綁定服務(wù),并在第1個參數(shù)中將Intent傳遞給bindService()函數(shù),聲明需要啟動的Service第3個參數(shù)Context.BIND_AUTO_CREATE表明只要綁定存在,就自動建立Service同時也告知Android系統(tǒng),這個Service的重要程度與調(diào)用者相同,除非考慮終止調(diào)用者,否則不要關(guān)閉這個Service7.2本地服務(wù)7.2.3服務(wù)綁定bindService()函數(shù)的第2個參數(shù)是ServiceConnnection當綁定成功后,系統(tǒng)將調(diào)用ServiceConnnection的onServiceConnected()方法當綁定意外斷開后,系統(tǒng)將調(diào)用ServiceConnnection中的onServiceDisconnected方法因此,以綁定方式使用Service,調(diào)用者需要聲明一個ServiceConnnection,并重載內(nèi)部的onServiceConnected()方法和onServiceDisconnected方法,兩個方法的重載代碼如下7.2本地服務(wù)7.2.3服務(wù)綁定7.2本地服務(wù)7.2.3服務(wù)綁定在代碼的第4行中,綁定成功后通過getService()獲取Service實例,這樣便可以調(diào)用Service中的方法和屬性代碼第8行將Service實例指為null,表示綁定意外失效時,Service實例不再可用取消綁定僅需要使用unbindService()方法,并將ServiceConnnection傳遞給unbindService()方法但需要注意的是,unbindService()方法成功后,系統(tǒng)并不會調(diào)用onServiceConnected(),因為onServiceConnected()僅在意外斷開綁定時才被調(diào)用1unbindService(mConnection);7.2本地服務(wù)7.2.3服務(wù)綁定綁定方式中,當調(diào)用者通過bindService()函數(shù)綁定Servcie時,onCreate()函數(shù)和onBinde()函數(shù)將被先后調(diào)用當調(diào)用者通過unbindService()函數(shù)取消綁定Servcie時,onUnbind()函數(shù)將被調(diào)用。如果onUnbind()函數(shù)返回true,則表示重新綁定服務(wù)時,onRebind()函數(shù)將被調(diào)用。綁定方式的函數(shù)調(diào)用順序如下圖所示7.2本地服務(wù)7.2.3服務(wù)綁定SimpleMathServiceDemo是綁定方式使用Service的示例在示例中創(chuàng)建了MathService服務(wù),用來完成簡單的數(shù)學運算,這里的數(shù)學運算僅指加法運算,雖然沒有實際意義,但可以說明如何使用綁定方式調(diào)用Service中的公有方法在服務(wù)綁定后,用戶可以點擊“加法運算”,將兩個隨機產(chǎn)生的數(shù)值傳遞給MathService服務(wù),并從MathService實例中獲取到加法運算的結(jié)果,然后顯示在屏幕的上方“取消綁定”按鈕可以解除與MathService的綁定關(guā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等.壓縮文件請下載最新的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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 煤炭合作框架協(xié)議書
- 雪上運動器材租賃擔保合同
- 垃圾處理兼職操作員協(xié)議
- 倉儲物流環(huán)境管理員聘用協(xié)議
- 學校自來水供應(yīng)系統(tǒng)安裝協(xié)議
- 上市公司保姆服務(wù)合同樣本
- 機場擴建箱涵施工協(xié)議
- 生態(tài)園生態(tài)能源基地施工合同
- 電子元件清罐施工合同
- 網(wǎng)絡(luò)存儲服務(wù)器租賃合同
- 擋土墻計算實例
- 《無機化學》第七章分子結(jié)構(gòu)和晶體結(jié)構(gòu)
- 醫(yī)療耗材配送服務(wù)方案
- 動物生物技術(shù)(課件)
- EPC總承包項目設(shè)計的總體安排與資源配置方案
- 浙江省溫州市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
- 甲醇鈉車間操作規(guī)范流程(堿法)
- 建材行業(yè)重大安全事故隱患檢查表(根據(jù)2022版工貿(mào)行業(yè)重大生產(chǎn)安全事故隱患判定標準編制)
- 金屬催化偶聯(lián)反應(yīng)(共30張)課件
- 小學語文人教五年級上冊(統(tǒng)編2023年更新)第六單元-《父愛之舟》學歷案
- 《國民經(jīng)濟核算》課程教學大綱
評論
0/150
提交評論