版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第7章 服務(wù)與消息廣播,本章介紹的主要內(nèi)容是Android平臺(tái)中的另外兩個(gè)組件,服務(wù)Service和消息廣播接收者BroadcastReceiver。 Service與Activity類(lèi)似,它們都表示可執(zhí)行的程序。只是Service類(lèi)并不像Activity一樣提供與用戶(hù)交互的表示層,Service是一種后臺(tái)運(yùn)行的Android組件。它位于android.app包下。本章將詳細(xì)講解Service的應(yīng)用,并對(duì)相關(guān)的廣播進(jìn)行相應(yīng)介紹。,Service是一個(gè)具有較長(zhǎng)的生命周期的程序。但是它沒(méi)有用戶(hù)界面,一直在Android后臺(tái)運(yùn)行。當(dāng)應(yīng)用程序不需要在前臺(tái)顯示某些界面時(shí),可以使用Service來(lái)完成,比
2、如后臺(tái)的數(shù)據(jù)計(jì)算,從Internet下載數(shù)據(jù),后臺(tái)音樂(lè)播放等。,7.1 Service簡(jiǎn)介,Service的開(kāi)發(fā)共分為兩步:定義Service和配置Service。下面依次講解這兩個(gè)步驟。 Service的開(kāi)發(fā)共分為兩步:定義Service和配置Service。下面依次講解這兩個(gè)步驟。 1.定義Service 定義一個(gè)Service子類(lèi)繼承于Service, 2.配置Service 在AndroidManifest.xml文件中,配置該Service。有兩種配置方法。 第一種是顯示配置,只需使用標(biāo)簽聲明Service的名稱(chēng)。與其他組件標(biāo)簽(例如)并列位于標(biāo)簽內(nèi),為同一個(gè)應(yīng)用程序所用。 第二種是
3、隱式配置,除了聲明Service名稱(chēng)之外,還需要為Service配置子標(biāo)簽。通過(guò)匹配Action屬性,說(shuō)明該Service可以被哪些Intent啟動(dòng)。,7.1.1 開(kāi)發(fā)Service,Service的生命周期包括運(yùn)行和停止兩個(gè)階段。Service的啟動(dòng)方式有兩種:context.startService()和context.bindService()。不同的啟動(dòng)方法,對(duì)Service生命周期的影響不同。 使用context.startService()啟動(dòng)Service,訪問(wèn)者與Service沒(méi)有關(guān)聯(lián)。即使訪問(wèn)者退出了,Service依然運(yùn)行;使用context.bindService()啟動(dòng)
4、Service,訪問(wèn)者與Service就綁定在一起。訪問(wèn)者一旦退出,Service就終止運(yùn)行,7.1.2 Service的生命周期,本節(jié)我們通過(guò)Service的開(kāi)發(fā),使用兩種不同的方法對(duì)Service進(jìn)行操作,觀察Service的生命周期,以及狀態(tài)變化。,7.2 操作Service,Service一般由Activity啟動(dòng)。當(dāng)Activity調(diào)用startService()方法啟動(dòng)Service時(shí),如果Service還沒(méi)有運(yùn)行,則Android先調(diào)用onCreate(),然后調(diào)用onStartCommand()啟動(dòng)Service。Service進(jìn)入運(yùn)行狀態(tài)。stopService的時(shí)候直接on
5、Destroy()結(jié)束Service。如果是調(diào)用者自己直接退出,而沒(méi)有調(diào)用stopService的話(huà),Service會(huì)一直在后臺(tái)運(yùn)行。,7.2.1 使用context.startService()啟動(dòng)Service,調(diào)用context.bindSerivce()方法,綁定Service到Activity,依次執(zhí)行onCreate()onBind(),Service被啟動(dòng)。調(diào)用context.unBindService()解除綁定,Srevice依次調(diào)用onUnbind()onDestroy()退出服務(wù)。當(dāng)結(jié)束與Service綁定的Activity時(shí),Service也會(huì)被終止。,7.2.2 使用
6、context.bindService()啟動(dòng)Service,根據(jù)通信方式,Service可以分為兩種類(lèi)型:本地服務(wù)(Local Service)和遠(yuǎn)程服務(wù)(Remote Service)本地服務(wù)用于應(yīng)用程序內(nèi)部,遠(yuǎn)程服務(wù)用于Android系統(tǒng)內(nèi)的應(yīng)用程序之間。下面詳細(xì)講解這兩種Service的通信方式。,7.3 Service通信,當(dāng)程序通過(guò)startService()和stopService()啟動(dòng)、關(guān)閉Service時(shí),Service與訪問(wèn)者之間沒(méi)有太多關(guān)系。因此無(wú)法進(jìn)行通信和數(shù)據(jù)交換。 如果Service和訪問(wèn)者之間需要進(jìn)行通信,應(yīng)該調(diào)用bindService()綁定Service與訪
7、問(wèn)者,通信結(jié)束之后,再調(diào)用unBindSevice()解除綁定,退出Service。 綁定Service之后,Service類(lèi)中的Ibinder onbind(Intent intent) 方法的返回值,將傳遞給在訪問(wèn)者類(lèi)中聲明的,ServiceConnection的onServiceConnected(ComponentName name,Ibinder service)方法中作參數(shù)。這樣,訪問(wèn)者就可以通過(guò)Inbind對(duì)象,實(shí)現(xiàn)與Service之間的通信。,7.3.1 本地服務(wù)通信,在Android系統(tǒng)中,各應(yīng)用程序都運(yùn)行在自己的進(jìn)程中。進(jìn)程之間一般無(wú)法直接進(jìn)行通信或者數(shù)據(jù)交換。Androi
8、d提供了AIDL工具來(lái)實(shí)現(xiàn)跨進(jìn)程的通信。 AIDL(Android Interface Definition Language)是一種IDL接口定義語(yǔ)言((Interface Definition Language)語(yǔ)言,用于生成可以在Android設(shè)備上兩個(gè)進(jìn)程之間進(jìn)行進(jìn)程間通信(Internet Process Connection IPC)的代碼。如果在一個(gè)進(jìn)程中(例如Activity)要調(diào)用另一個(gè)進(jìn)程中(例如Service)的對(duì)象,就可以使用AIDL來(lái)實(shí)現(xiàn)。,7.3.2 遠(yuǎn)程服務(wù)通信,以上示例都是我們自定義開(kāi)發(fā)的Service服務(wù)。其實(shí),Android系統(tǒng)也提供了很多Service服務(wù)
9、供用戶(hù)使用。這些服務(wù)通過(guò)getSystemService(String serviceName)方法獲得,比如第5章中的Notification。下面我們來(lái)學(xué)習(xí)一些常用的系統(tǒng)Service。,7.4 系統(tǒng)提供的Service,TelephonyManager是Android提供的系統(tǒng)服務(wù)之一。通關(guān)它可以獲取手機(jī)的各種相關(guān)信息,例如設(shè)備ID號(hào)、SIM卡號(hào)等等。,7.4.1 電話(huà)管理器TelephonyManager,SmsManager是Android提供的與短信相關(guān)的系統(tǒng)服務(wù)。該Service使用流程如下: 1.獲取SmsManager實(shí)例對(duì)象 使用該Service之前,首先需要獲取該對(duì)象。
10、2.調(diào)用SmsManager相關(guān)方法 SmsManager類(lèi)中,提供了與短信相關(guān)的方法 3.聲明PendingIntent對(duì)象 在以上兩個(gè)方法中,都使用到PendingIntent參數(shù)。因此在調(diào)用SmsManager相關(guān)方法之前,需要聲明一個(gè)PendingIntent對(duì)象。 PendingIntent這個(gè)類(lèi)用于處理即將發(fā)生的事情。要得到一個(gè)pendingIntent對(duì)象,使用方法類(lèi)的靜態(tài)方法getActivity(Context, int, Intent, int), getBroadcast(Context, int, Intent, int), getService(Context, in
11、t, Intent, int) 分別對(duì)應(yīng)著Intent的3個(gè)行為:跳轉(zhuǎn)到一個(gè)Activity組件、打開(kāi)一個(gè)廣播組件和打開(kāi)一個(gè)服務(wù)組件。,7.4.2 短信管理器SmsManager,AudioManager是用來(lái)控制手機(jī)鈴聲和音量的系統(tǒng)服務(wù)。該Service使用流程如下: 1.獲取AudioManager實(shí)例對(duì)象 使用該Service之前,首先需要獲取該對(duì)象。 2.調(diào)用AudioManager相關(guān)方法 獲取了AudioManager實(shí)例對(duì)象后,我們就可以調(diào)用它的相關(guān)方法。AudioManager提供了一系列控制手機(jī)音量的方法,7.4.3 音頻管理器AudioManager,Android手機(jī)中的
12、振動(dòng)由Vibrator實(shí)現(xiàn)。在與用戶(hù)交互時(shí),常常會(huì)用到振動(dòng)功能,尤其在游戲中,應(yīng)用廣泛,比如爆炸,碰撞等。 1.獲取Vibrator實(shí)例對(duì)象 使用該Service之前,首先需要獲取該對(duì)象。 2.調(diào)用Vibrator相關(guān)方法 獲取了Vibrator實(shí)例對(duì)象后,我們就可以調(diào)用它的相關(guān)方法。,7.4.4 振動(dòng)器Vibrator,在Android中,廣播Broadcast是一種廣泛運(yùn)用在應(yīng)用程序之間的用于傳送消息的機(jī)制。而B(niǎo)roadcastReceiver是用來(lái)過(guò)濾接收并響應(yīng)Broadcast的一類(lèi)組件。它可以監(jiān)聽(tīng)系統(tǒng)全局的廣播消息,非常方便的實(shí)現(xiàn)系統(tǒng)中不同組件之間通信。,7.5 廣播接收者Broad
13、castReceiver,BroadcastReceiver的運(yùn)行機(jī)理非常簡(jiǎn)單。開(kāi)發(fā)過(guò)程如下: 開(kāi)發(fā)BroadcastReceiver的子類(lèi),重寫(xiě)其中的onReceive()方法; 注冊(cè)BroadcastReceiver對(duì)象; 將需要廣播的消息封裝到Intent中,然后調(diào)用方法發(fā)送出去; 通過(guò)IntentFilter對(duì)象過(guò)濾Intent,處理與其匹配的廣播。 1.注冊(cè)BroadcastReceiver 與其他組件相同,BroadcastReceiver在使用之前,也需要在AndroidManifest.xml中注冊(cè)靜態(tài)注冊(cè)。靜態(tài)注冊(cè)的特點(diǎn)是,不管改應(yīng)用程序是否處于活動(dòng)狀態(tài),都會(huì)進(jìn)行監(jiān)聽(tīng)。注冊(cè)B
14、roadcastReceiver使用標(biāo)簽。然后通過(guò)標(biāo)簽設(shè)置過(guò)濾條件。與其他組件(例如)并列位于標(biāo)簽內(nèi),為同一個(gè)應(yīng)用程序所用。BroadcastReceiver也可以在代碼中注冊(cè)動(dòng)態(tài)注冊(cè)。首先創(chuàng)建IntentFilter對(duì)象,并設(shè)置過(guò)濾條件,然后通過(guò)Context.registerReceiver()方法來(lái)注冊(cè),通過(guò)Context.unregisterReceiver()方法取消注冊(cè)。動(dòng)態(tài)注冊(cè)的特點(diǎn)是,在代碼中進(jìn)行注冊(cè)后,當(dāng)應(yīng)用程序關(guān)閉后,就不再進(jìn)行監(jiān)聽(tīng)。,7.5.1 開(kāi)發(fā)BroadcastReceiver,Android系統(tǒng)提供了Conte.sendBroadcast()和Context.se
15、ndOrderedBroadcast()兩種方法發(fā)送廣播或有序廣播,供BroadcastReceiver接收并處理。 Conte.sendBroadcast()發(fā)送的廣播,所有滿(mǎn)足條件的BroadcastReceiver都會(huì)執(zhí)行其onReceive()方法來(lái)處理響應(yīng)。 Context.sendOrderedBroadcast發(fā)送的有序廣播。會(huì)根據(jù)BroadcastReceiver注冊(cè)時(shí)IntentFilter的優(yōu)先級(jí)順序來(lái)執(zhí)行onReceive()方法。優(yōu)先級(jí)在的android:priority中聲明,也可以在代碼中通過(guò)IntentFilter.setPriority()方法設(shè)置。數(shù)越大優(yōu)先級(jí)別越高。,2.發(fā)送廣播,除了接收用戶(hù)發(fā)送的廣播之外,BroadcastReceiver還
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024私家花園景觀綠化工程施工合同
- 2024辦公樓轉(zhuǎn)租合同
- 2024設(shè)備運(yùn)輸合同正規(guī)范本
- 2024學(xué)校食堂委托服務(wù)合同
- 數(shù)字化農(nóng)業(yè)項(xiàng)目的驗(yàn)收與后期運(yùn)營(yíng)
- 大數(shù)據(jù)智能決策模型在數(shù)字化農(nóng)業(yè)中的構(gòu)建與優(yōu)化
- 蘇州科技大學(xué)天平學(xué)院《應(yīng)用統(tǒng)計(jì)》2021-2022學(xué)年第一學(xué)期期末試卷
- 《端午鴨蛋曉南講》課件
- 2024房屋的合同協(xié)議書(shū)格式
- 2024年中外合作經(jīng)營(yíng)企業(yè)合同范本
- 《工程勘察設(shè)計(jì)收費(fèi)管理規(guī)定》計(jì)價(jià)格2002-10號(hào)文
- 宿舍消防疏散圖
- 常用焊條合格證
- 站場(chǎng)明敷接地扁鋼安裝技術(shù)要求
- 《個(gè)人防護(hù)用品PPE》ppt課件
- 國(guó)際貿(mào)易SimTrade外貿(mào)實(shí)習(xí)報(bào)告
- 導(dǎo)師帶徒實(shí)施辦法6、30
- 《Fishing with Grandpa》RAZ分級(jí)閱讀繪本pdf資源
- 水穩(wěn)施工方案(完整版)
- 跨海大橋施工方案
- MATLAB語(yǔ)言課程論文 基于MATLAB的電磁場(chǎng)數(shù)值圖像分析
評(píng)論
0/150
提交評(píng)論