一、接收广播消息
1.什么是BroadcastReceiver?
BroadcastReceiver是Android系统四大组件之一,本质上就是一种全局的监听器,用于监听系统全局的广播消息。
2.怎样创建BroadcastReceiver?
1)创建一个类继承自BroadcastReceiver类;
2)在AndroidManifest.xml配置<receiver>节点信息。
3.一旦实现了BroadcastReceiver,接下来就应该制定该BroadcastReceiver能匹配的Intent,此时有两种方式。
1)在AndroidManifest.xml文件中配置,这种方式会一直监听。例如如下代码:
<receiver android:name="com.gnnuit.smsreceiver.SmsReceiver" > <intent-filter android:priority="1000" > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
2)使用代码进行指定,调用BroadcastReceiver的Context的registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法指定,这种方式可以通过unregisterReceiver(BroadcastReceiver receiver)取消监听,也叫临时监听。例如如下代码:
IntentFilter filter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(new SmsReceiver(), filter);
4.如果BroadcastReceiver的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在BroadcastReceiver的onReceive()方法里执行一些耗时的操作,否则会发生ANR异常。如果确实需要根据Broadcast来完成一些耗时的操作,则可以考虑通过Intent启动一个Service来完成该操作。不应考虑使用新线程去完成耗时操作,因为Broadcast本身的生命周期很短。
5.Broadcast被分为如下两种:
1)Normal Broadcast(普通广播):普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高。但缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止Broadcast Intent的传播。
2)Ordered Broadcast(有序广播):有序广播的接收者将按预先声明的优先级依次接收Broadcast。优先级别声明在<intent-filter/>元素的android:priority属性中,数越大优先级别越高,取值范围为-1000-1000.有序广播可以调用abortBroadcast()方法终止Broadcast Intent的传播,Broadcast Intent的传播一旦终止,后面的接收者就无法接收到Broadcast。
6.用于发送广播的两个方法:
1)sendBroadcast():发送普通广播。
2)sendOrderedBroadcast():发送有序广播。
7.短信拦截实例
SmsReceiver.java
package com.gnnuit.smsreceiver; import java.util.Date; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.SmsMessage; public class SmsReceiver extends BroadcastReceiver { // 当接收到短信时被触发 @Override public void onReceive(Context context, Intent intent) { System.out.println("接收到短信!!!"); Object[] pdus = (Object[]) intent.getExtras().get("pdus");// 通过pdus可以获得接收到的所有短信消息 for (Object pdu : pdus) { SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu); String content = message.getMessageBody();// 获得短信内容 String number = message.getOriginatingAddress();// 获得短信号码 Date date = new Date(message.getTimestampMillis());// 获得短信日期 System.out.println(number + "," + content + "," + date); if ("110".equals(number)) { abortBroadcast();// 取消广播,让系统收不到短信 } } } }
AndroidManifest.xml
<receiver android:name="com.gnnuit.smsreceiver.SmsReceiver" > <intent-filter android:priority="1000" > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>