应用程序组件------BroadcastReceiver

BroadcastReceiver(广播接收器)是Android中的四大组件之一。BroadcastReceiver,广播接收者,它是一个系统全局的监听器,用于监听系统全局的Broadcast消息,所以它可以很方便的进行系统组件之间的通信。
BroadcastReceiver也有自己独立的声明周期,但是和Activity、Service又不同。当在系统注册一个广播之后,每次系统以一个Intent的形式发布的时候,系统都会创建与之对应的广播接收者实例,并自动触发它的onReceive()方法,当onReceive()方法被执行完成之后,BroadcastReceiver的实例就会被销毁。虽然它独自享用一个单独的进程,但也不是没有限制的,如果BroadcastReceiver.onReceive()方法不能在5秒内执行完成,Android系统就会认为该BroadcastReceiver对象无响应,然后弹出ANR(Application No Response)对话框,所以不要在BroadcastReceiver.onReceive()方法内执行一些耗时的操作。
 上面提到,当系统以一个Intent的形式发送一个Broadcast出去之后,所有与之匹配的广播都会被实例化,但是这里是有区别的,根据Broadcast的传播方式区别,在系统中有如下两种Broadcast:
● 普通广播:Normal Broadcase,它是完全异步的,也就是说,在逻辑上,当一个Broadcast被发出之后,所有的与之匹配的BroadcastReceiver都同时接收到Broadcast。优点是传递效率比较高,但是也有缺点,就是一个BroadcastReceiver不能影响其他响应这条Broadcast的BroadcastReceiver。
● 有序广播:Ordered Broadcast,它是同步执行的,也就是说有序广播的接收器将会按照预先声明的优先级依次接受Broadcast,是链式结构,优先级越高(-1000~1000),越先被执行。因为是顺序执行,所有优先级高的接收器,可以把执行结果传入下一个接收器中,也可以终止Broadcast的传播(通过abortBroadcast()方法),一旦Broadcast的传播被终止,优先级低于它的接收器就不会再接收到这条Broadcast了。
  虽然系统存在两种类型的Broadcast,但是一般系统发送出来的Broadcast均是有序广播,所以可以通过优先级的控制,在系统内置的程序响应前,对Broadcast提前进行响应。这就是市场上一些拦截器类(如:短信拦截器、电话拦截器)的软件的原理。 
广播事件的流程
①注册广播事件:注册方式有两种,
一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;
另一种是动态注册,是在程序中使用Context.registerReceiver注册,注册的广播接收器相当于一个匿名类。两种方式都需要IntentFIlter。
②发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。
● sendBroadcast():发送普通广播。
● sendOrderedBroadcast():发送有序广播。
③接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。

Android中的广播事件有两种,
一种就是系统广播事件,
下面列举一些常用的广播:
● android.intent.action.TIME_SET:系统时间被修改。
● android.intent.action.DATE_CHANGED:系统日期被修改。
● android.intent.action.BOOT_COMPLETED:系统启动完成。
● android.intent.action.BATTERY_CHANGED:设备电量改变。
● android.intent.action.BATTERY_LOW:设备电量低。
● android.intent.action.ACTION_POWER_CONNECTED:设备连接电源。
● android.intent.action.ACTION_POWER_DISCONNECTED:设备断开电源。
● android.provider.Telephony.SMS_RECEIVED:系统收到短信。
● android.intent.action.NEW_OUTGOING_CALL:拨打电话。
Intent.ACTION_REBOOT;//重启设备时的广播
Intent.ACTION_SCREEN_OFF;//屏幕被关闭之后的广播
Intent.ACTION_SCREEN_ON;//屏幕被打开之后的广播
Intent.ACTION_PACKAGE_REPLACED;
//替换一个现有的安装包时发出的广播(不管现在安装的APP比之前的新还是旧,都会发出此广播?)
Intent.ACTION_PACKAGE_RESTARTED;
//用户重新开始一个包,包的所有进程将被杀死,所有与其联系的运行时间状态应该被移除,包括包名(重新开始包程序不能接收到这个广播)
Intent.ACTION_PACKAGE_REMOVED;
//成功的删除某个APK之后发出的广播
Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
//当屏幕超时进行锁屏时,当用户按下电源按钮,长按或短按(不管有没跳出话框),进行锁屏时,android系统都会广播此Action消息

另外一种是我们自定义的广播事件。

  1. 通过关键字拦截短信。
    截短信的Broadcast侵犯了隐私,需要注册接收短信的权限

public class MessageBroadcast extends BroadcastReceiver {
// 在模拟器上,通过DDMS发送短信会产生乱码,所以使用拼音代替
//在真机上不存在乱码的问题
private final String[] blackKeyWord = new String[] { “baoxian”, “chuxiao”,
“jiangjia” };

 @Override
 public void onReceive(Context context, Intent intent) {
     // 判断当前接收到的Broadcast是否是收到短信的action
     if (intent.getAction()
             .equals("android.provider.Telephony.SMS_RECEIVED")) {
         StringBuilder sb = new StringBuilder();
         // 获取Broadcast传递的数据
         Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdus = (Object[]) bundle.get("pdus");
            for (Object p : pdus) {
                byte[] pud = (byte[]) p;
                // 声明一个SmsMessage,用于解析短信的byte[]数组
                 SmsMessage message = SmsMessage.createFromPdu(pud);
                boolean flag = false;
                 for (String str : blackKeyWord) {                         

if (message.getMessageBody().contains(str) ) { // 发现黑名单关键字,则标记为true flag = true;
break;
}
}
if (flag) {
sb.append(“发件人:\n”);
sb.append(message.getOriginatingAddress());
sb.append(“\n发送时间:\n”);
Date date = new Date(message.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat(
“yyyy-MM-dd HH:mm:ss”);
sb.append(format.format(date));
sb.append(“\n短信内容:\n”);
sb.append(message.getMessageBody());

                      Toast.makeText(context, sb.toString(),
                              Toast.LENGTH_SHORT).show();
                     // 如果存在黑名单关键字内容,停止Broadcast传播
                     abortBroadcast();
                  }

             }
         }
     }

 }

}
  在AndroidManifest.xml中配置Receiver。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值