使用Android的广播机制,可以在应用间异步的传递消息,解耦应用间的强关联。也可以用来接收系统发出的各种事件。本文以接收短信为例,演示如何使用广播机制。
定义权限
短信属于用户隐私,在获取短信前,应用需要申请相关权限。
- 在 AndroidManifest.xml 中加入权限请求
1
| <uses-permission android:name="android.permission.RECEIVE_SMS" />
|
- 在代码中,也需要检查用户是否允许
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>
|