Android四大組件之broadcast廣播詳解
基礎(chǔ)廣播
兩大類廣播
標(biāo)準(zhǔn)廣播:異步執(zhí)行,廣播發(fā)出后所有 receiver 同時(shí)接收,無先后順序,無法被截?cái)啵?/p>
有序廣播:同步執(zhí)行,類似于中間件,每個(gè) receiver 攔截廣播后有權(quán)將其下放到下一個(gè) receiver 或者直接截?cái)啵?/p>
廣播的動(dòng)態(tài)和靜態(tài)注冊(cè)
動(dòng)態(tài)注冊(cè):寫在代碼里面的監(jiān)聽事件;
靜態(tài)注冊(cè):寫在 manifest.xml 里面的監(jiān)聽;
目前,由于安卓為了維護(hù)用戶系統(tǒng)安全,故所有的隱式廣播均不允許靜態(tài)注冊(cè)
監(jiān)聽時(shí)間變化
在主 activity 里面編寫如下代碼,實(shí)現(xiàn)每隔一分鐘監(jiān)聽一次時(shí)間變化并 toast 彈出信息;
package com.zhiyiyi.listviewdemo
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.zhiyiyi.listviewdemo.R
import com.zhiyiyi.listviewdemo.RecyclerAdapter
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
import kotlin.collections.ArrayList
class MainActivity : AppCompatActivity() {
// 延遲初始化監(jiān)聽器
lateinit var timeChangeReceiver: TimeChangeReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 設(shè)置過濾器
val intentFilter = IntentFilter()
// 過濾的廣播類型為TIME_TICK
intentFilter.addAction("android.intent.action.TIME_TICK")
// 實(shí)例化監(jiān)聽器
timeChangeReceiver = TimeChangeReceiver()
// 注冊(cè)廣播監(jiān)聽器
registerReceiver(timeChangeReceiver, intentFilter)
}
override fun onDestroy() {
super.onDestroy()
// 銷毀activity的時(shí)候別忘了注銷廣播監(jiān)聽器
unregisterReceiver(timeChangeReceiver)
}
// 使用內(nèi)部類動(dòng)態(tài)注冊(cè)廣播監(jiān)聽器
inner class TimeChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Toast.makeText(context, "time changed", Toast.LENGTH_SHORT).show()
}
}
}監(jiān)聽系統(tǒng)啟動(dòng)案例
創(chuàng)建 receiver
我們可以右鍵點(diǎn)擊項(xiàng)目,來使用官方提供的模板創(chuàng)建 broadcastreceiver;
這種方式創(chuàng)建后,會(huì)自動(dòng)在 manifest 文件內(nèi)注冊(cè)該外部 receiver,否則會(huì)需要我們手動(dòng)來進(jìn)行注冊(cè),十分不方便;
我們據(jù)此創(chuàng)建 BootReceiver.kt
編寫代碼如下,依舊是接收到廣播彈出 toast
package com.zhiyiyi.listviewdemo
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.widget.Toast
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "boot start", Toast.LENGTH_SHORT).show()
}
}
設(shè)置權(quán)限
為了監(jiān)聽系統(tǒng)啟動(dòng)廣播,我們需要靜態(tài)注冊(cè)(該廣播事實(shí)上是一個(gè)隱式廣播,但因?yàn)榘踩[患小,安卓并沒有禁止其靜態(tài)注冊(cè)?。?/p>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 在這里注冊(cè)權(quán)限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ListViewDemo"
tools:targetApi="31">
<receiver
android:name=".BootReceiver"
android:enabled="true"
android:exported="true">
<!-- 設(shè)置過濾器 -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
...
</application>
</manifest>發(fā)送自定義廣播
如何發(fā)送與接收
新建廣播監(jiān)聽器文件:CustomReceiver.kt
編寫監(jiān)聽到后反應(yīng)
class CustomReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "custom receiver", Toast.LENGTH_SHORT).show()
}
}
在 manifest 中在對(duì)應(yīng)監(jiān)聽器下設(shè)置過濾器
<receiver
android:name=".BootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
主 activity 中設(shè)置點(diǎn)擊按鈕發(fā)送廣播,此時(shí)自定義監(jiān)聽器監(jiān)聽到信息,彈出 toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
broad_btn.setOnClickListener {
val intent = Intent("receiver.MYCUSTOM")
Log.d(TAG, "onClick: fuck")
intent.setPackage(packageName)
sendBroadcast(intent)
}
}
}解釋一下 setPackage
因?yàn)樗须[式廣播都無法使用靜態(tài)注冊(cè),而我們使用的自定義廣播全部都是隱式廣播;
我們只有使用 setPackage 將自身變成顯示廣播,才能推送到隱式廣播接收器;
有序廣播
監(jiān)聽器在 manifest 中注冊(cè)時(shí),在過濾器后加上出現(xiàn)設(shè)置權(quán)限值;
權(quán)限越高的越早能截獲信息;
<intent-filter android:priority="100">
主 activity 使用 sendOrderedBroadcast 來發(fā)送有序列的廣播;
第一個(gè)參數(shù)是 intent,第二個(gè)參數(shù)我們一般都填 null
sendOrderedBroadcast(intent,null)
自定義廣播的末尾可以加上 abortBroadcast 可以銷毀該廣播,即廣播終止位置到此為止,后面的優(yōu)先級(jí)較低的都無監(jiān)聽器法接受到了
class CustomReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
...
// 攔截并銷毀該廣播
abortBroadcast()
}
}到此這篇關(guān)于Android四大組件之broadcast廣播詳解的文章就介紹到這了,更多相關(guān)Android broadcast內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 3D旋轉(zhuǎn)動(dòng)畫效果實(shí)現(xiàn)分解
如何實(shí)現(xiàn)View的3D旋轉(zhuǎn)效果,實(shí)現(xiàn)的主要原理就是圍繞Y軸旋轉(zhuǎn),同時(shí)在Z軸方面上有一個(gè)深入的縮放,具體實(shí)現(xiàn)代碼如下,感興趣的朋友可以參考下哈2013-06-06
Android調(diào)用系統(tǒng)圖片裁剪限定尺寸及7.0照相問題的解決方法
這篇文章主要介紹了Android調(diào)用系統(tǒng)圖片裁剪限定尺寸,及7.0照相問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
android自定義view實(shí)現(xiàn)數(shù)字進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了android自定義view實(shí)現(xiàn)數(shù)字進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android TextView實(shí)現(xiàn)圖文混合編排的方法
這篇文章主要為大家詳細(xì)介紹了Android TextView實(shí)現(xiàn)圖文混合編排的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Android仿UC底部菜單欄實(shí)現(xiàn)原理與代碼
最近剛看完ViewPager,開始我打算用自定義的imgBtn,但是發(fā)現(xiàn)放在pager選項(xiàng)卡中不好排版,所以最好選了GridView,接下來介紹底部菜單欄實(shí)現(xiàn)2013-01-01
Android中HorizontalScrollView使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android中HorizontalScrollView使用方法,感興趣的小伙伴們可以參考一下2016-05-05
Android seekbar實(shí)現(xiàn)可拖動(dòng)進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android seekbar實(shí)現(xiàn)可拖動(dòng)進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
Android入門之LinearLayout、AbsoluteLayout的用法實(shí)例講解
這篇文章主要介紹了Android入門之LinearLayout、AbsoluteLayout的用法,對(duì)于Android初學(xué)者有很好的參考借鑒價(jià)值,需要的朋友可以參考下2014-08-08
Android開發(fā)升級(jí)AGP7.0后的一些適配方法技巧
這篇文章主要為大家介紹了升級(jí)AGP7.0后的一些適配方法技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

