在Android应用开发中,广播组件是一项关键技术,被广泛用于各种任务和场景。无论是发送系统级广播,还是在应用内部实现组件间的通信,了解和掌握广播组件的工作原理和使用方法对于每个Android开发者来说都是至关重要的。本文旨在帮助你深入了解Android广播组件,并给出一些实用的技巧和建议。
什么是广播?
广播包含哪些功能?
广播是如何发送和接收的?
如何注册广播,都有哪些注册方式?
都有哪些系统广播?
静态注册和动态注册有什么区别?
Android 如何快速创建一个广播接收器?
如何发送自定义广播?
广播都有哪些类型?
使用广播需要注意哪些安全合规问题?
广播(Broadcast)是Android操作系统中一种用于应用程序之间或应用程序内部进行通信的机制。它允许一个应用程序发送消息(广播事件),而其他应用程序可以接收并对这些消息做出响应。
系统广播是由Android操作系统自身发出的广播,用于通知应用程序有关设备状态和系统事件的变化。
广播动作 | 描述 | 说明 |
---|---|---|
android.net.conn.CONNECTIVITY_CHANGE |
网络状态变化 | 当设备的网络连接状态发生变化时发送的广播。可以通过监听该广播来检测网络连接的变化,并相应地调整应用程序的行为。 |
android.intent.action.BATTERY_CHANGED |
设备电量变化 | 当设备的电池电量发生变化时发送的广播。应用程序可以通过监听该广播来获取当前电池电量的信息,并根据电量的变化做出相应的操作。 |
android.intent.action.SCREEN_ON |
屏幕开启 | 当设备的屏幕被开启时发送的广播。应用程序可以通过监听该广播来执行特定的操作,如启动屏幕相关的功能。 |
android.intent.action.SCREEN_OFF |
屏幕关闭 | 当设备的屏幕被关闭时发送的广播。应用程序可以通过监听该广播来执行相应的操作,如关闭屏幕相关的功能。 |
android.intent.action.BOOT_COMPLETED |
设备启动完成 | 当设备启动完成后发送的广播。应用程序可以通过监听该广播来执行一些初始化操作或启动特定的服务,以确保应用程序在设备启动后正常运行。 |
android.intent.action.TIMEZONE_CHANGED |
时区变化 | 当设备的时区发生变化时发送的广播。应用程序可以根据时区的变化来调整与时间相关的功能。 |
android.intent.action.AIRPLANE_MODE |
飞行模式变化 | 当设备的飞行模式开启或关闭时发送的广播。应用程序可以通过监听该广播来做出相应的操作。 |
android.intent.action.MEDIA_MOUNTED |
存储媒体已挂载 | 当存储媒体(如SD卡)被挂载到设备上时发送的广播。应用程序可以通过监听该广播来响应存储媒体的挂载事件。 |
android.intent.action.MEDIA_REMOVED |
存储媒体已移除 | 当存储媒体(如SD卡)从设备中移除时发送的广播。应用程序可以通过监听该广播来做出相应的处理。 |
android.intent.action.PACKAGE_ADDED |
应用程序安装完成 | 当应用程序安装完成后发送的广播。应用程序可以通过监听该广播来执行相应的操作。 |
android.intent.action.PACKAGE_REMOVED |
应用程序卸载完成 | 当应用程序卸载完成后发送的广播。应用程序可以通过监听该广播来执行相应的操作。 |
android.intent.action.HEADSET_PLUG |
耳机插拔事件 | 当耳机被插入或拔出设备时发送的广播。应用程序可以通过监听该广播来做出相应的处理。 |
android.intent.action.WALLPAPER_CHANGED |
壁纸变化 | 当设备的壁纸发生变化时发送的广播。应用程序可以通过监听该广播来做出相应的处理。 |
在Android中,自定义广播的发送类型与系统广播类似,可以使用标准广播、有序广播和粘性广播
标准广播(Normal Broadcast)是Android中一种常见的广播类型。它是一种异步广播,意味着发送广播后,发送者不会等待接收者的处理结果,而是立即返回。所有匹配该广播的接收者都会同时接收到广播消息。
// 创建Intent对象
Intent intent = new Intent();
// 设置广播的动作
intent.setAction("com.example.MY_CUSTOM_ACTION");
// 发送有序广播
sendBroadcast(intent, null);
有序广播(Ordered Broadcast)是Android中另一种常见的广播类型。与标准广播不同,有序广播是按照优先级顺序依次发送给匹配的接收者,并且每个接收者在处理广播后可以选择终止广播或将广播传递给下一个接收者。
// 创建Intent对象
Intent intent = new Intent();
// 设置广播的动作
intent.setAction("com.example.MY_CUSTOM_ACTION");
// 发送有序广播
sendOrderedBroadcast(intent, null);
粘性广播(Sticky Broadcast)是Android中一种特殊类型的广播。与标准广播和有序广播不同,粘性广播会保留在系统中,即使没有匹配的接收者。当有新的接收者注册时,它们会立即收到最新的粘性广播。
// 创建Intent对象
Intent intent = new Intent();
// 设置广播的动作
intent.setAction("com.example.MY_CUSTOM_ACTION");
// 发送粘性广播
sendStickyBroadcast(intent);
本地广播(Local Broadcast)是一种特定于应用程序内部的广播机制,用于在应用程序的内部组件之间进行通信。与全局广播不同,本地广播只在应用程序的边界内传播,不会离开应用程序的上下文。
// 创建Intent对象
Intent intent = new Intent();
// 设置广播的动作
intent.setAction("com.example.MY_LOCAL_ACTION");
// 发送本地广播
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
在Android中,要接收广播,需要创建一个广播接收器(BroadcastReceiver)。广播接收器是一个组件,用于接收和处理发送到应用程序的广播消息。
创建一个继承自BroadcastReceiver的类,并实现onReceive(Context, Intent)方法。在onReceive方法中编写接收到广播后的处理逻辑。
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 在这里编写接收到广播后的处理逻辑
// 根据广播的动作或其他信息进行相应的操作
}
}
<receiver
android:name=".MyBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
intent-filter>
receiver>
// 创建广播接收器实例
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
// 创建IntentFilter对象,并添加接收的广播动作
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.MY_CUSTOM_ACTION");
// 注册广播接收器
context.registerReceiver(receiver, filter);
接收到广播后,需要在广播接收器(BroadcastReceiver)的onReceive(Context, Intent)方法中编写处理逻辑
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 在这里编写接收到广播后的处理逻辑
}
}
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Uri data = intent.getData();
Bundle extras = intent.getExtras();
// 根据广播的动作、数据或额外信息进行相应的处理
}
}
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ("com.example.MY_CUSTOM_ACTION".equals(action)) {
// 执行相应的操作
// ...
}
}
}
广播概览