Android 广播和短信广播详解
在 Android 中,广播(Broadcast) 是一种用于应用之间、应用与系统之间通信的机制。通过广播,应用可以发送一些全局通知,其他应用可以接收并响应这些通知。Android 广播机制分为两类:常规广播 和 短信广播。
一、Android 广播概述
广播是一种消息传递机制,类似于传统的广播电台的广播方式。它允许在 Android 系统中不同的组件(如活动、服务等)之间进行通信。广播的关键组成部分包括:
- 发送者(Sender):发送广播的应用或组件。
- 接收者(Receiver):接收并处理广播的应用或组件。通常是广播接收器(
BroadcastReceiver
)。 - 广播消息(Intent):用于传递广播消息的对象。广播消息通过
Intent
进行传递。
广播的工作流程:
- 发送广播:应用通过
sendBroadcast(Intent)
方法发送广播。 - 接收广播:广播接收器 (
BroadcastReceiver
) 监听特定的广播,通过注册接收器来接收并处理广播。
二、广播类型
Android 中的广播大体可以分为以下几种类型:
- 普通广播(Normal Broadcast):
- 这种广播是异步的,不保证接收者接收到广播的顺序。
- 广播发送后,系统会尽快将消息发送给所有注册的接收器。
- 有序广播(Ordered Broadcast):
- 这种广播是同步的,广播接收器按顺序接收广播。
- 每个接收器可以决定是否继续传播该广播(通过
abortBroadcast()
)。
- 本地广播(Local Broadcast):
- 本地广播不会离开应用,适用于应用内部组件之间的通信。
- 使用
LocalBroadcastManager
类来发送和接收,效率高、不会影响系统性能。
三、短信广播(SMS Broadcast)
短信广播是 Android 系统中的一个特殊广播,它用于处理短信的接收、发送等操作。短信广播通常与系统短信应用(SMS)相关联,当一个应用需要获取或处理短信相关的事件时,使用短信广播。
常见的短信广播:
SMS_RECEIVED
:- 当设备收到短信时,系统会发送一个
SMS_RECEIVED
广播。应用可以监听这个广播来接收新短信。 - 接收者需要有权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
- 广播接收器的代码示例如下:
public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); for (Object pdu : pdus) { SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu); String sender = message.getDisplayOriginatingAddress(); String body = message.getDisplayMessageBody(); // 处理短信内容 } } } }
- 当设备收到短信时,系统会发送一个
SMS_SENT
:- 发送短信成功后,会广播一个
SMS_SENT
消息。应用可以监听该广播来确认短信是否已成功发送。 - 广播接收器的代码示例如下:
public class SmsSentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { switch (getResultCode()) { case Activity.RESULT_OK: // 短信发送成功 break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: // 发送失败 break; // 其他错误码 } } }
- 发送短信成功后,会广播一个
SMS_DELIVERED
:- 发送的短信已成功送达目标设备后,系统会广播一个
SMS_DELIVERED
消息。 - 用法类似
SMS_SENT
。
- 发送的短信已成功送达目标设备后,系统会广播一个
- 短信权限:
- 在接收短信广播时,需要在
AndroidManifest.xml
文件中声明权限:<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" />
- 对于 Android 6.0(API 23)及以上的版本,还需要请求运行时权限。
- 在接收短信广播时,需要在
四、短信广播的注册方式
广播接收器可以在应用中通过两种方式注册:
- 动态注册:
- 通过
Context.registerReceiver()
动态注册接收器,通常这种注册方式用于需要在特定时刻才监听广播的情况。 - 动态注册的广播接收器只会在应用运行时有效。
SmsReceiver receiver = new SmsReceiver(); IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(receiver, filter);
- 通过
- 静态注册:
- 在
AndroidManifest.xml
文件中静态注册接收器,适用于不需要在应用运行时动态启动的广播接收器。 - 静态注册的广播接收器在系统启动时就会自动生效。
<receiver android:name=".SmsReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
- 在
五、广播的注意事项
- 权限管理:
- 使用短信广播时,务必正确声明权限,尤其是处理接收短信、发送短信的功能。
- 性能问题:
- 使用广播时,如果广播传递内容过大或频繁发送广播,会影响系统性能。应尽量避免不必要的广播发送。
- 安全性问题:
- 需要注意广播的安全性,避免外部恶意应用通过广播滥用敏感数据。使用合适的权限来限制广播接收。
- 广播优先级:
- 有序广播可以设置优先级,优先级高的接收器会先接收到广播并有机会中止广播。
六、总结
- 普通广播 和 有序广播 是 Android 中最基本的广播类型。
- 短信广播 主要用于接收和发送短信时的事件通知。
- 在 Android 6.0 及以上版本,需要特别注意 运行时权限 的申请。
- 应根据具体需求,合理选择 静态注册 和 动态注册 的方式来注册广播接收器。
通过这些广播机制,Android 提供了一种灵活的方式,让应用和系统、其他应用之间能够高效地进行通信。
发表回复