Android 广播和短信广播详解

在 Android 中,广播(Broadcast) 是一种用于应用之间、应用与系统之间通信的机制。通过广播,应用可以发送一些全局通知,其他应用可以接收并响应这些通知。Android 广播机制分为两类:常规广播 和 短信广播

一、Android 广播概述

广播是一种消息传递机制,类似于传统的广播电台的广播方式。它允许在 Android 系统中不同的组件(如活动、服务等)之间进行通信。广播的关键组成部分包括:

  • 发送者(Sender):发送广播的应用或组件。
  • 接收者(Receiver):接收并处理广播的应用或组件。通常是广播接收器(BroadcastReceiver)。
  • 广播消息(Intent):用于传递广播消息的对象。广播消息通过 Intent 进行传递。
广播的工作流程:
  1. 发送广播:应用通过 sendBroadcast(Intent) 方法发送广播。
  2. 接收广播:广播接收器 (BroadcastReceiver) 监听特定的广播,通过注册接收器来接收并处理广播。

二、广播类型

Android 中的广播大体可以分为以下几种类型:

  1. 普通广播(Normal Broadcast)
    • 这种广播是异步的,不保证接收者接收到广播的顺序。
    • 广播发送后,系统会尽快将消息发送给所有注册的接收器。
  2. 有序广播(Ordered Broadcast)
    • 这种广播是同步的,广播接收器按顺序接收广播。
    • 每个接收器可以决定是否继续传播该广播(通过 abortBroadcast())。
  3. 本地广播(Local Broadcast)
    • 本地广播不会离开应用,适用于应用内部组件之间的通信。
    • 使用 LocalBroadcastManager 类来发送和接收,效率高、不会影响系统性能。

三、短信广播(SMS Broadcast)

短信广播是 Android 系统中的一个特殊广播,它用于处理短信的接收、发送等操作。短信广播通常与系统短信应用(SMS)相关联,当一个应用需要获取或处理短信相关的事件时,使用短信广播。

常见的短信广播:
  1. 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(); // 处理短信内容 } } } }
  2. 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; // 其他错误码 } } }
  3. SMS_DELIVERED
    • 发送的短信已成功送达目标设备后,系统会广播一个 SMS_DELIVERED 消息。
    • 用法类似 SMS_SENT
  4. 短信权限
    • 在接收短信广播时,需要在 AndroidManifest.xml 文件中声明权限:<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" />
    • 对于 Android 6.0(API 23)及以上的版本,还需要请求运行时权限。

四、短信广播的注册方式

广播接收器可以在应用中通过两种方式注册:

  1. 动态注册
    • 通过 Context.registerReceiver() 动态注册接收器,通常这种注册方式用于需要在特定时刻才监听广播的情况。
    • 动态注册的广播接收器只会在应用运行时有效。
    SmsReceiver receiver = new SmsReceiver(); IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(receiver, filter);
  2. 静态注册
    • 在 AndroidManifest.xml 文件中静态注册接收器,适用于不需要在应用运行时动态启动的广播接收器。
    • 静态注册的广播接收器在系统启动时就会自动生效。
    <receiver android:name=".SmsReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>

五、广播的注意事项

  1. 权限管理
    • 使用短信广播时,务必正确声明权限,尤其是处理接收短信、发送短信的功能。
  2. 性能问题
    • 使用广播时,如果广播传递内容过大或频繁发送广播,会影响系统性能。应尽量避免不必要的广播发送。
  3. 安全性问题
    • 需要注意广播的安全性,避免外部恶意应用通过广播滥用敏感数据。使用合适的权限来限制广播接收。
  4. 广播优先级
    • 有序广播可以设置优先级,优先级高的接收器会先接收到广播并有机会中止广播。

六、总结

  • 普通广播 和 有序广播 是 Android 中最基本的广播类型。
  • 短信广播 主要用于接收和发送短信时的事件通知。
  • 在 Android 6.0 及以上版本,需要特别注意 运行时权限 的申请。
  • 应根据具体需求,合理选择 静态注册 和 动态注册 的方式来注册广播接收器。

通过这些广播机制,Android 提供了一种灵活的方式,让应用和系统、其他应用之间能够高效地进行通信。