使用Android的广播机制,可以在应用间异步的传递消息,解耦应用间的强关联。也可以用来接收系统发出的各种事件。本文以接收短信为例,演示如何使用广播机制。

定义权限

短信属于用户隐私,在获取短信前,应用需要申请相关权限。

  1. 在 AndroidManifest.xml 中加入权限请求
1
<uses-permission android:name="android.permission.RECEIVE_SMS" />
  1. 在代码中,也需要检查用户是否允许
1
2
3
if (!checkPermission(Manifest.permission.RECEIVE_SMS)) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, 0);
}

方法 checkPermission 的代码:

1
2
3
4
private boolean checkPermission(String permission) {
int permissionCheck = ContextCompat.checkSelfPermission(this, permission);
return (permissionCheck == PackageManager.PERMISSION_GRANTED);
}

定义接收者

定义一个继承于 BroadcastReceiver 的类。 在 onReceive 方法中实现对对象的接收和解析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SMSBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
String format = bundle.getString("format");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);
} else {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
Log.d("MyTag", "Received: " + messages[0].getMessageBody());
}
}
}
}

注册接收者

在 AndroidManifest.xml 的 application中加入接收者定义

1
2
3
4
5
<receiver android:name=".SMSBroadcastReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>