一、继承
java.lang.Object
↳ android.content.BroadcastReceiver
二、简介
- BroadcastReceiver:Android四大组件之一,主要用于接收广播和发送广播
- 标准广播:发送广播,所有广播接收器都能收到广播
- 有序广播:发送广播,按照广播接收器设置的顺序接收,前一个广播接收器可以截断广播
三、公共方法
- setResultCode(int code) 设置广播的结果代码;仅适用于通过Context.sendOrderedBroadcast发送的广播
- getResultCode() 获取由前一个接收器设置的结果代码
- setResultData(String data) 设置广播的结果数据;仅适用于通过Context.sendOrderedBroadcast发送的广播
- getResultData() 获取由前一个接收器设置的结果数据
- setResultExtras(Bundle extras) 设置广播的结果附加内容;仅适用于通过Context.sendOrderedBroadcast发送的广播。
- getResultExtras(boolean makeMap) 获取由前一个接收器设置的结果额外数据
- setResult(int code, String data, Bundle extras) 设置广播返回的所有结果数据;仅适用于通过Context.sendOrderedBroadcast发送的广播。
- getAbortBroadcast() 获取当前广播接收器是否中止
- abortBroadcast() 设置指示此接收器应中止当前广播的标志;仅适用于通过Context.sendOrderedBroadcast发送的广播。这将阻止任何其他广播接收器接收广播。
- clearAbortBroadcast() 清除指示此接收器应中止当前广播的标志。
- goAsync() 这可以由onReceive中的应用程序调用,以允许它在从该函数返回后保持广播活动。作为一般规则,广播接收器被允许运行长达10秒,然后系统会认为它们没有响应,并对应用程序进行ANR
- peekService(Context myContext, Intent service) 为已绑定的服务提供绑定器。此方法是同步的,如果不存在,则不会启动目标服务,因此从onReceive调用是安全的。peecService()要返回一个非null的IBinder接口,该服务必须在之前发布过它。换句话说,某个组件必须调用了Context.bindService(Intent,ServiceConnection,int)
- isOrderedBroadcast() 如果接收器当前正在处理已排序的广播,则返回true
- isInitialStickyBroadcast() 如果接收器当前正在处理粘性广播的初始值,即上次广播且当前保存在粘性缓存中的值,则返回true,因此这不是当前广播的直接结果。
- setDebugUnregister(boolean debug) 控制包含对Context.registerReceiver()的不匹配调用的调试帮助
- getDebugUnregister() 返回给setDebugUnregister的最后一个值
四、标准广播
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<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.BroadcastReceiverDemo"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<receiver
android:name=".TestBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="test" />
</intent-filter>
</receiver>
</application>
</manifest>
class TestBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (null != intent) {
var data = intent.getStringExtra("data")
Log.d("data", data + "");
}
}
}
class MainActivity : AppCompatActivity() {
lateinit var btn_send: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initView()
initData()
initClick()
}
private fun initView() {
btn_send = findViewById(R.id.btn_send)
}
private fun initData() {
}
private fun initClick() {
btn_send.setOnClickListener {
val intent = Intent("test")
intent.putExtra("data", "123")
sendBroadcast(intent)
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送广播"
android:textSize="30sp" />
</LinearLayout>
五、有序广播
package com.empty.demo
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
class TestBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (null != intent) {
var data = intent.getStringExtra("data")
Log.d("TestBroadcastReceiver", data + "");
}
//终止之后广播接收器
abortBroadcast()
}
}
class Test1BroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (null != intent) {
var data = intent.getStringExtra("data")
Log.d("Test1BroadcastReceiver", data + "");
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<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.BroadcastReceiverDemo"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<receiver
android:name=".TestBroadcastReceiver"
android:exported="true">
<intent-filter android:priority="1">
<action android:name="test" />
</intent-filter>
</receiver>
<receiver
android:name=".Test1BroadcastReceiver"
android:exported="true">
<intent-filter android:priority="0">
<action android:name="test" />
</intent-filter>
</receiver>
</application>
</manifest>
class MainActivity : AppCompatActivity() {
lateinit var btn_send: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initView()
initData()
initClick()
}
private fun initView() {
btn_send = findViewById(R.id.btn_send)
}
private fun initData() {
}
private fun initClick() {
btn_send.setOnClickListener {
val intent = Intent("test")
intent.putExtra("data", "123")
sendOrderedBroadcast(intent,null)
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送广播"
android:textSize="30sp" />
</LinearLayout>
六、广播注册
静态注册
<receiver
android:name=".TestBroadcastReceiver"
android:exported="true">
<intent-filter android:priority="1">
<action android:name="test" />
</intent-filter>
</receiver>
动态注册
val testBroadcastReceiver = TestBroadcastReceiver()
val filter = IntentFilter();
filter.addAction("test")
registerReceiver(testBroadcastReceiver, filter);
//注销广播
unregisterReceiver(testBroadcastReceiver)