time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > Android应用开发入门(五十三)拦截系统Broadcast并对其进行处理

Android应用开发入门(五十三)拦截系统Broadcast并对其进行处理

时间:2013-11-21 17:13 点击:1425次 字体:[ ]




前言

  上一篇,讲了BroadcastReceiver的一些基础内容,如何注册以及发送一个广播,那是基础,不清楚的可以先看看:http://www.fengfly.com/plus/view-214088-1.html。但是在实际开发当中,大部分情况下是不需要自己发布一个Broadcast或者接收自己定义的Broadcast的,一般而言,都是拦截系统在做某个操作而发布的Broadcast,对其进行相应的处理。本文就以两个示例来讲讲Android系统中,如何拦截系统Broadcast并对其进行处理。

 

系统中的广播

  在Android系统中,内置了很多Action产量,在触发这些Action的时候,均会发布相应的Broadcast。一般而言,查看Android的API文档中,关于Intent的说明即可找到对应Action的Broadcast,但是列举的还不是很全,最好还是下载Android的源代码,通过查看源代码的方式查看需要拦截的Broadcast。

  下面列举一些常用的广播:

  • 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:拨打电话。

  下面通过两个例子,来讲解如何在Android下,拦截系统Broadcast并对其进行处理。

  1. 通过关键字拦截短信。
  2. IP拨号。

 

通过关键字拦截短信

  从上面列举的一些动作会发布的Broadcast,可以找到,当系统接收到一条短信的时候,会发布一个“android.provider.Telephony.SMS_RECEIVED”的Broadcast,之前已经介绍过了,一般系统Broadcast都是有序广播,如果不被高优先级的BroadcastReceiver停止传递,会按照优先级顺序传递下去。

  而在这个示例中,通过监听接收短信的广播,当其内容有黑名单中的关键字的话,则阻止Broadcast继续传播,并使用Toast提示,否则正常提示短信信息。

  通过上一篇了解到,onReceive方法的Intent参数包含了这条广播传递的参数,对于短信信息而言,需要获取key为"pdus"的数组,取出数组中每一项,它的每一项代表了一个byte[]格式的短信,需要使用SmsMessage类解析短信内容。

  当然,拦截短信的Broadcast侵犯了隐私,需要注册接收短信的权限: 

  1. <uses-permission android:name="android.permission.RECEIVE_SMS"/> 

  下面直接展示源代码了,关键注释已经写的很清楚了,这里不再累述:

  MessageBroadcast.java: 

  1. package cn.bgxt.Broadcastdemo.MessageWarn;  
  2.  
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.os.Bundle;  
  9. import android.telephony.SmsMessage;  
  10. import android.widget.Toast;  
  11.  
  12. public class MessageBroadcast extends BroadcastReceiver {  
  13.     // 在模拟器上,通过DDMS发送短信会产生乱码,所以使用拼音代替  
  14.     //在真机上不存在乱码的问题  
  15.     private final String[] blackKeyWord = new String[] { "baoxian""chuxiao",  
  16.             "jiangjia" };  
  17.  
  18.     @Override 
  19.     public void onReceive(Context context, Intent intent) {  
  20.         // 判断当前接收到的Broadcast是否是收到短信的action  
  21.         if (intent.getAction()  
  22.                 .equals("android.provider.Telephony.SMS_RECEIVED")) {  
  23.             StringBuilder sb = new StringBuilder();  
  24.             // 获取Broadcast传递的数据  
  25.             Bundle bundle = intent.getExtras();  
  26.             if (bundle != null) {  
  27.                 Object[] pdus = (Object[]) bundle.get("pdus");  
  28.                 for (Object p : pdus) {  
  29.                     byte[] pud = (byte[]) p;  
  30.                     // 声明一个SmsMessage,用于解析短信的byte[]数组  
  31.                     SmsMessage message = SmsMessage.createFromPdu(pud);  
  32.                     boolean flag = false;  
  33.                     for (String str : blackKeyWord) {  
  34.                         if (message.getMessageBody().contains(str) ) {  
  35.                             // 发现黑名单关键字,则标记为true  
  36.                             flag = true;  
  37.                             break;  
  38.                         }  
  39.                     }  
  40.                     if (flag) {  
  41.                         sb.append("发件人:\n");  
  42.                         sb.append(message.getOriginatingAddress());  
  43.                         sb.append("\n发送时间:\n");  
  44.                         Date date = new Date(message.getTimestampMillis());  
  45.                         SimpleDateFormat format = new SimpleDateFormat(  
  46.                                 "yyyy-MM-dd HH:mm:ss");  
  47.                         sb.append(format.format(date));  
  48.                         sb.append("\n短信内容:\n");  
  49.                         sb.append(message.getMessageBody());  
  50.  
  51.                         Toast.makeText(context, sb.toString(),  
  52.                                 Toast.LENGTH_SHORT).show();  
  53.                         // 如果存在黑名单关键字内容,停止Broadcast传播  
  54.                         abortBroadcast();  
  55.                     }  
  56.                       
  57.                 }  
  58.             }  
  59.         }  
  60.  
  61.     }  
  62.  

  在AndroidManifest.xml中配置Receiver。

  1. <receiver android:name="cn.bgxt.Broadcastdemo.MessageWarn.MessageBroadcast"> 
  2.     <!-- 设置优先级,短信优先级为0,大于0即可 --> 
  3.     <intent-filter android:priority="200"> 
  4.         <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
  5.     </intent-filter>              
  6. </receiver> 

  效果展示,先发送一个包含黑名单中关键字的短信,再发送一个正常的短信。

Android应用开发入门(五十三)拦截系统Broadcast并对其进行处理_www.fengfly.comAndroid应用开发入门(五十三)拦截系统Broadcast并对其进行处理_www.fengfly.com



本文地址 : http://www.fengfly.com/plus/view-214089-1.html
标签: Android 系统 Broadcast
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: