版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章全局大喇叭,詳解廣播機(jī)制廣播機(jī)制簡(jiǎn)介為了便于進(jìn)行系統(tǒng)級(jí)別的消息通知,Android引入了一套廣播消息機(jī)制。每個(gè)應(yīng)用程序都可以對(duì)自己感興趣的廣播進(jìn)行注冊(cè),這樣該程序就只會(huì)收到自己所關(guān)心的廣播內(nèi)容,這些廣播可能是來(lái)自于系統(tǒng)的,也可能是來(lái)自于其他應(yīng)用程序的。Android提供了一套完整的API,允許應(yīng)用程序自由地發(fā)送和接收廣播。Android中的廣播主要可以分為兩種類(lèi)型:標(biāo)準(zhǔn)廣播和有序廣播。標(biāo)準(zhǔn)廣播標(biāo)準(zhǔn)廣播(normalbroadcasts)是一種完全異步執(zhí)行的廣播,在廣播發(fā)出之后,所有的BroadcastReceiver幾乎都會(huì)在同一時(shí)刻接收到收到這條廣播消息,因此它們之間沒(méi)有任何先后順序可言。這種廣播的效率會(huì)比較高,但同時(shí)也意味著它是無(wú)法被截?cái)嗟?。示意圖如下:有序廣播有序廣播(orderedbroadcasts)是一種同步執(zhí)行的廣播,在廣播發(fā)出之后,同一時(shí)刻只會(huì)有一個(gè)BroadcastReceiver能夠收到這條廣播消息,當(dāng)這個(gè)BroadcastReceiver中的邏輯執(zhí)行完畢后,廣播才會(huì)繼續(xù)傳遞。所以此時(shí)的BroadcastReceiver是有先后順序的,優(yōu)先級(jí)高的BroadcastReceiver就可以先收到廣播消息,并且前面的BroadcastReceiver還可以截?cái)嗾趥鬟f的廣播,這樣后面的BroadcastReceiver就無(wú)法收到廣播消息了。示意圖如下:接收系統(tǒng)廣播接收系統(tǒng)廣播開(kāi)發(fā)者可以根據(jù)自己感興趣的廣播,自由地注冊(cè)BroadcastReceiver,這樣當(dāng)有相應(yīng)的廣播發(fā)出時(shí),相應(yīng)的BroadcastReceiver就能夠收到該廣播,并可以在內(nèi)部進(jìn)行邏輯處理。注冊(cè)BroadcastReceiver的方式一般有兩種:在代碼中注冊(cè)和在AndroidManifest.xml中注冊(cè)。其中前者也被稱(chēng)為動(dòng)態(tài)注冊(cè),后者也被稱(chēng)為靜態(tài)注冊(cè)。動(dòng)態(tài)注冊(cè)監(jiān)聽(tīng)時(shí)間變化動(dòng)態(tài)注冊(cè)的代碼示例如下:classMainActivity:AppCompatActivity(){lateinitvartimeChangeReceiver:TimeChangeReceiveroverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)valintentFilter=IntentFilter()intentFilter.addAction("ent.action.TIME_TICK")timeChangeReceiver=TimeChangeReceiver()registerReceiver(timeChangeReceiver,intentFilter)}overridefunonDestroy(){super.onDestroy()unregisterReceiver(timeChangeReceiver)}innerclassTimeChangeReceiver:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent){Toast.makeText(context,"Timehaschanged",Toast.LENGTH_SHORT).show()}}}監(jiān)聽(tīng)到系統(tǒng)時(shí)間發(fā)生了變化靜態(tài)注冊(cè)實(shí)現(xiàn)開(kāi)機(jī)啟動(dòng)靜態(tài)注冊(cè)的代碼示例如下:classBootCompleteReceiver:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent){Toast.makeText(context,"BootComplete",Toast.LENGTH_LONG).show()}
}靜態(tài)注冊(cè)實(shí)現(xiàn)開(kāi)機(jī)啟動(dòng)另外,靜態(tài)的BroadcastReceiver一定要在AndroidManifest.xml文件中注冊(cè)才可以使用:<manifestxmlns:android="/apk/res/android"package="com.example.broadcasttest"><uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme">…<receiverandroid:name=".BootCompleteReceiver"android:enabled="true"android:exported="true"><intent-filter><actionandroid:name="ent.action.BOOT_COMPLETED"/></intent-filter></receiver></application></manifest>接收系統(tǒng)開(kāi)機(jī)廣播發(fā)送自定義廣播發(fā)送標(biāo)準(zhǔn)廣播構(gòu)建一個(gè)Intent對(duì)象,并把要發(fā)送的廣播的值傳入。然后調(diào)用Intent的setPackage()方法,并傳入當(dāng)前應(yīng)用程序的包名。最后調(diào)用sendBroadcast()方法將廣播發(fā)送出去,這樣所有監(jiān)聽(tīng)com.example.broadcasttest.MY_BROADCAST這條廣播的BroadcastReceiver就會(huì)收到消息了。此時(shí)發(fā)出去的廣播就是一條標(biāo)準(zhǔn)廣播。classMainActivity:AppCompatActivity(){
overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)button.setOnClickListener{valintent=Intent("com.example.broadcasttest.MY_BROADCAST")intent.setPackage(packageName)sendBroadcast(intent)}}
}發(fā)送有序廣播和標(biāo)準(zhǔn)廣播不同,有序廣播是一種同步執(zhí)行的廣播,并且是可以被截?cái)嗟?。classMainActivity:AppCompatActivity(){
overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)button.setOnClickListener{valintent=Intent("com.example.broadcasttest.MY_BROADCAST")intent.setPackage(packageName)
sendOrderedBroadcast(intent,null)}}
}發(fā)送有序廣播只需要改動(dòng)一行代碼,即將sendBroadcast()方法改成sendOrderedBroadcast()方法。接收自定義廣播在發(fā)送廣播之前,我們還是需要先定義一個(gè)BroadcastReceiver來(lái)準(zhǔn)備接收此廣播,不然發(fā)出去也是白發(fā)。因此新建一個(gè)MyBroadcastReceiver,并在onReceive()方法中加入如下代碼:classMyBroadcastReceiver:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent){Toast.makeText(context,"receivedinMyBroadcastReceiver",Toast.LENGTH_SHORT).show()}}接收自定義廣播然后在AndroidManifest.xml中對(duì)這個(gè)BroadcastReceiver進(jìn)行注冊(cè):<manifestxmlns:android="/apk/res/android"package="com.example.broadcasttest">…<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme">…<receiverandroid:name=".MyBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter><actionandroid:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver></application></manifest>點(diǎn)擊按鈕后收到廣播Kotlin課堂定義高階函數(shù)如果一個(gè)函數(shù)接收另一個(gè)函數(shù)作為參數(shù),或者返回值的類(lèi)型是另一個(gè)函數(shù),那么該函數(shù)就稱(chēng)為高階函數(shù)。funexample(func:(String,Int)->Unit){func("hello",123)}可以看到,這里的example()函數(shù)接收了一個(gè)函數(shù)類(lèi)型的參數(shù),因此example()函數(shù)就是一個(gè)高階函數(shù)。而調(diào)用一個(gè)函數(shù)類(lèi)型的參數(shù),它的語(yǔ)法類(lèi)似于調(diào)用一個(gè)普通的函數(shù),只需要在參數(shù)名的后面加上一對(duì)括號(hào),并在括號(hào)中傳入必要的參數(shù)即可。內(nèi)聯(lián)函數(shù)的作用內(nèi)聯(lián)函數(shù)可以將使用Lambda表達(dá)式帶來(lái)的運(yùn)行時(shí)開(kāi)銷(xiāo)完全消除。它的工作原理并不復(fù)雜,就是Kotlin編譯器會(huì)將內(nèi)聯(lián)函數(shù)中的代碼在編譯的時(shí)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026四川成都中醫(yī)藥大學(xué)第二附屬醫(yī)院招聘2人 (第二批)考試備考題庫(kù)及答案解析
- 2026湖南長(zhǎng)沙市新城學(xué)校春季教師招聘4人考試備考題庫(kù)及答案解析
- 江蘇國(guó)信揚(yáng)州發(fā)電有限責(zé)任公司冬季社會(huì)招聘5人考試參考試題及答案解析
- 2026甘肅省西北民族大學(xué)專(zhuān)任教師招聘50人考試參考題庫(kù)及答案解析
- 2026西藏林芝市察隅縣農(nóng)村公益電影放映人員招聘1人考試備考題庫(kù)及答案解析
- 2026內(nèi)蒙古錫林郭勒盟深能北方能源控股有限公司招聘考試參考題庫(kù)及答案解析
- 2026年甘肅慶陽(yáng)西峰數(shù)字服務(wù)就業(yè)中心招募考試備考試題及答案解析
- 羥甲香豆素在神經(jīng)退行性疾病中的潛在應(yīng)用-洞察及研究
- 激素治療新進(jìn)展-洞察及研究
- 基爾霍夫矩陣在學(xué)生表現(xiàn)與學(xué)習(xí)效果中的應(yīng)用-洞察及研究
- 資源與運(yùn)營(yíng)管理-第一次形考任務(wù)-國(guó)開(kāi)-參考資料
- (高清版)DBJ33∕T 1318-2024 建筑結(jié)構(gòu)抗震性能化設(shè)計(jì)標(biāo)準(zhǔn)
- 施工虧損報(bào)告范文
- 2025年包頭輕工職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)附答案
- DB33-T 1406-2024 職務(wù)科技成果轉(zhuǎn)化管理規(guī)范
- 七年級(jí)上學(xué)期數(shù)學(xué)備課組期末復(fù)習(xí)計(jì)劃
- 病理檢驗(yàn)技術(shù)(第3版)課件 第10章 細(xì)胞學(xué)檢查技術(shù)
- 鄉(xiāng)鎮(zhèn)污泥處理應(yīng)急預(yù)案
- 海上導(dǎo)管架安裝監(jiān)理細(xì)則
- 中醫(yī)九種體質(zhì)的養(yǎng)生課件模板
- DL∕T 1938-2018 垃圾發(fā)電廠爐渣處理技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論