)
前言本文章代码均在 android 14 上测试成功下图此文章广播总结。作用在应用程序之间 或者 应用内部不同组件之间传递消息。发送广播Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_broad); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - { Insets systemBars insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); /* 点击按钮后发送广播 */ findViewById(R.id.btn_send_broad).setOnClickListener(v - { // 1. 创建意图对象 并指定行为。注意注册广播接收器、接收广播、发送广播的意图对象行为须一致。 Intent intent new Intent(com.study.csdn); // 2. 发送标准广播 sendBroadcast(intent); }); }接收广播接收广播分为两块创建广播接收器 和 注册、注销广播接收器。接收器要想接收消息必须先注册。1. 创建广播接收器/** * 创建广播接收器广播接收器需继承 BroadcastReceiver, 并实现 onReceive() */ class BroadTest extends BroadcastReceiver { Override public void onReceive(Context context, Intent intent) { /* 判断意图对象行为 */ if (intent ! null intent.getAction().equals(com.study.csdn)) { Log.d(调试, onReceive: intent.getStringExtra(value)); } } }2. 动态注册、注销广播private BroadTest broadTest; Override protected void onStart() { super.onStart(); /* 代码动态注册 */ /* 1. 创建接收器实例 */ broadTest new BroadTest(); /* 2. 创建过滤器 */ IntentFilter filter new IntentFilter(com.study.chapter04); /* 3. 注册广播 */ if (Build.VERSION.SDK_INT Build.VERSION_CODES.TIRAMISU) { // android 13开始 动态注册广播 必须指定是否允许外部 App 发送广播 registerReceiver(broadTest, filter, Context.RECEIVER_EXPORTED); // 允许 } else { registerReceiver(broadTest, filter); } Log.d(调试, onStart: 广播接收器已注册); } Override protected void onStop() { super.onStop(); unregisterReceiver(broadTest); }3. 完整代码package com.study.chapter04.csdn; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.study.chapter04.R; public class BroadActivity extends AppCompatActivity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_broad); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - { Insets systemBars insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); /* 点击按钮后发送广播 */ findViewById(R.id.btn_send_broad).setOnClickListener(v - { // 1. 创建意图对象 并指定行为。注意注册广播接收器、接收广播、发送广播的意图对象行为须一致。 Intent intent new Intent(com.study.chapter04) .putExtra(value, 标准广播); // 2. 发送标准广播 sendBroadcast(intent); Log.d(调试, onCreate: 广播已发送); }); } private BroadTest broadTest; Override protected void onStart() { super.onStart(); /* 1. 创建接收器实例 */ broadTest new BroadTest(); /* 2. 创建过滤器 */ IntentFilter filter new IntentFilter(com.study.chapter04); /* 3. 注册广播 */ if (Build.VERSION.SDK_INT Build.VERSION_CODES.TIRAMISU) { // android 13开始 动态注册广播 必须指定是否允许外部 App 发送广播 registerReceiver(broadTest, filter, Context.RECEIVER_EXPORTED); // 允许 } else { registerReceiver(broadTest, filter); } Log.d(调试, onStart: 广播接收器已注册); } Override protected void onStop() { super.onStop(); unregisterReceiver(broadTest); Log.d(调试, onStop: 广播接收器已注销); } /** * 创建广播接收器广播接收器需继承 BroadcastReceiver, 并实现 onReceive() */ private class BroadTest extends BroadcastReceiver { Override public void onReceive(Context context, Intent intent) { /* 接收指定 action 的广播 */ if (intent ! null intent.getAction().equals(com.study.chapter04)) { Log.d(调试, onReceive: 接收到 intent.getStringExtra(value)); } } } }有序广播当一个广播有多个接收器时这些接收器会根据广播优先级或广播注册优先级来按序接听广播。有序广播有可以 实现广播拦截。// 2.1 发送有序广播 findViewById(R.id.btn_send_orderBroad).setOnClickListener(v - { Intent intent new Intent(com.study.chapter04) .putExtra(value, 有序广播); sendOrderedBroadcast(intent, null); });再创建一个接收器。/** * 再 创建一个接收器 */ private class BroadTest2 extends BroadcastReceiver { Override public void onReceive(Context context, Intent intent) { /* 接收指定 action 的广播 */ if (intent ! null intent.getAction().equals(com.study.chapter04)) { Log.d(调试, onReceive2: 接收到 intent.getStringExtra(value)); /* 拦截广播 */ abortBroadcast(); } } }注册、注销刚才的接收器。和标准广播步骤相同。private BroadTest broadTest; private BroadTest2 broadTest2; Override protected void onStart() { super.onStart(); /* 1. 创建接收器实例 */ broadTest new BroadTest(); broadTest2 new BroadTest2(); /* 2. 创建过滤器 */ IntentFilter filter new IntentFilter(com.study.chapter04); IntentFilter filter2 new IntentFilter(com.study.chapter04); /* 设置优先级 广播先看优先级值越大先接收 再看 注册顺序先注册先接收 */ filter2.setPriority(1); /* 3. 注册广播 */ if (Build.VERSION.SDK_INT Build.VERSION_CODES.TIRAMISU) { // android 13开始 动态注册广播 必须指定是否允许外部 App 发送广播 registerReceiver(broadTest, filter, Context.RECEIVER_EXPORTED); // 允许 registerReceiver(broadTest2, filter2, Context.RECEIVER_EXPORTED); } else { registerReceiver(broadTest, filter); registerReceiver(broadTest2, filter2); } Log.d(调试, onStart: 广播接收器已注册); } Override protected void onStop() { super.onStop(); unregisterReceiver(broadTest); unregisterReceiver(broadTest2); Log.d(调试, onStop: 广播接收器已注销); }完整代码package com.study.chapter04.csdn; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.study.chapter04.R; public class BroadActivity extends AppCompatActivity { Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_broad); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - { Insets systemBars insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); /* 点击按钮后发送广播 */ findViewById(R.id.btn_send_broad).setOnClickListener(v - { // 1. 创建意图对象 并指定行为。注意注册广播接收器、接收广播、发送广播的意图对象行为须一致。 Intent intent new Intent(com.study.chapter04) .putExtra(value, 标准广播); // 2. 发送标准广播 sendBroadcast(intent); Log.d(调试, onCreate: 广播已发送); }); findViewById(R.id.btn_send_orderBroad).setOnClickListener(v - { Intent intent new Intent(com.study.chapter04) .putExtra(value, 有序广播); /* 发送标准广播 */ sendOrderedBroadcast(intent, null); }); } private BroadTest broadTest; private BroadTest2 broadTest2; Override protected void onStart() { super.onStart(); /* 1. 创建接收器实例 */ broadTest new BroadTest(); broadTest2 new BroadTest2(); /* 2. 创建过滤器 */ IntentFilter filter new IntentFilter(com.study.chapter04); IntentFilter filter2 new IntentFilter(com.study.chapter04); /* 设置优先级 广播先看优先级值越大先接收 再看 注册顺序先注册先接收 */ filter2.setPriority(1); /* 3. 注册广播 */ if (Build.VERSION.SDK_INT Build.VERSION_CODES.TIRAMISU) { // android 13开始 动态注册广播 必须指定是否允许外部 App 发送广播 registerReceiver(broadTest, filter, Context.RECEIVER_EXPORTED); // 允许 registerReceiver(broadTest2, filter2, Context.RECEIVER_EXPORTED); } else { registerReceiver(broadTest, filter); registerReceiver(broadTest2, filter2); } Log.d(调试, onStart: 广播接收器已注册); } Override protected void onStop() { super.onStop(); unregisterReceiver(broadTest); unregisterReceiver(broadTest2); Log.d(调试, onStop: 广播接收器已注销); } /** * 创建广播接收器广播接收器需继承 BroadcastReceiver, 并实现 onReceive() */ private class BroadTest extends BroadcastReceiver { Override public void onReceive(Context context, Intent intent) { /* 接收指定 action 的广播 */ if (intent ! null intent.getAction().equals(com.study.chapter04)) { Log.d(调试, onReceive: 接收到 intent.getStringExtra(value)); } } } /** * 再 创建一个接收器 */ private class BroadTest2 extends BroadcastReceiver { Override public void onReceive(Context context, Intent intent) { /* 接收指定 action 的广播 */ if (intent ! null intent.getAction().equals(com.study.chapter04)) { Log.d(调试, onReceive2: 接收到 intent.getStringExtra(value)); /* 拦截广播 */ abortBroadcast(); } } } }静态注册新建接收器静态注册很简单直接新建接收器就行。它会自动帮我们注册。去 AndroidMainfest.xml 文件 会发现 已经注册好了。发送广播Android 8.0 开始发送隐式 Intent只设置了 action没有指定目标组件或包名静态注册的接收器无法接收广播。必须使用intent.setPackage(目标包名)或intent.setComponent(...)显式指定组件由于注册、注销接收器等逻辑相同就不在赘述这里只演示发送广播。// 方法一 Intent intent new Intent(com.study.chapter04) .putExtra(value, 静态注册的广播); if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) { intent.setPackage(getPackageName()); } sendBroadcast(intent); // 方法二 Intent intent new Intent(com.study.chapter04) .putExtra(value, 静态注册的广播); if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) { intent.setComponent(new ComponentName(this, com.study.chapter04.csdn.MyReceiver)); // 参数一 Context 对象 参数二广播接收器 } sendBroadcast(intent);