首页 > 代码库 > Android总结六(BroadcastReceiver)

Android总结六(BroadcastReceiver)

一、接收广播消息

  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>