Android--拦截系统BroadcastReceiver

简介:

前言

  上一篇博客,讲了BroadcastReceiver的一些基础内容,如何注册以及发送一个广播,那是基础,不清楚的可以先看看:Android--BroadcastReceiver。但是在实际开发当中,大部分情况下是不需要自己发布一个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 
63 }
复制代码

   在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>

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

 

 

IP拨号

  再来看看IP拨号的示例,在Android中,如果触发拨打电话的Action,则会发布一个"android.intent.action.NEW_OUTGOING_CALL"的Broadcast出来,只需要针对它进行拦截即可,然后在加上IP前缀,把处理过的号码添加到数据传递给下一个Receiver。

  处理接收拨打电话的Broadcast,需要对Android增加权限: 

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

    下面直接上代码了,注释写的很清楚,这里不再累述了。

  IpCallPhone.java: 

复制代码
 1 package cn.bgxt.Broadcastdemo.IpCall;
 2 
 3 import android.content.BroadcastReceiver;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 
 7 public class IpCallPhone extends BroadcastReceiver {
 8     private final String STARTS="17951";
 9     @Override
10     public void onReceive(Context context, Intent intent) {
11         // 获取当前拨号的号码
12         String number=getResultData();
13         // 此号码没有被加IP拨号的前缀
14         if(!number.startsWith(STARTS)){
15             // 设置加了IP号码的号码
16             String newnumber=STARTS+number;
17             // 把新号码增加到返回结果数据中,用于传递给后面的Receiver
18             setResultData(newnumber);
19         }        
20     }
21 }
复制代码

   AndroidManifest.xml配置Receiver:

1         <receiver android:name="cn.bgxt.Broadcastdemo.IpCall.IpCallPhone">
2             <intent-filter android:priority="200">
3                 <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
4             </intent-filter>
5         </receiver>

  效果展示:

 

  源码下载

 

总结

  Android系统中内置了非常多的Broadcast,用于对系统事件的响应、拦截、操作,这里只是介绍了两个比较典型的例子。在实际开发中,可以根据需要,查找Android源代码中相应的应用中的代码找到需要的Broadcast,以及如何处理的例子,这里就不一一介绍了。



本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/android_SystemBroadcastReceriver.html,如需转载请自行联系原作者


相关文章
|
24天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
18 1
|
2月前
|
搜索推荐 Android开发 iOS开发
探析安卓与iOS系统的优劣
【2月更文挑战第7天】安卓与iOS是当今手机市场上最主流的两款操作系统,各有优劣。本文将从用户体验、开放程度、生态系统等方面对两者进行深入探析,以期帮助读者更好地了解它们的特点。
|
2月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
34 4
|
2月前
|
设计模式 Android开发
[Android 四大组件] --- BroadcastReceiver
[Android 四大组件] --- BroadcastReceiver
33 0
|
3月前
|
Linux 调度 Android开发
【系统启动】Kernel怎么跳转到Android:linux与安卓的交界
【系统启动】Kernel怎么跳转到Android:linux与安卓的交界
46 0
|
4月前
|
JSON 自然语言处理 Java
Android App开发语音处理之系统自带的语音引擎、文字转语音、语音识别的讲解及实战(超详细 附源码)
Android App开发语音处理之系统自带的语音引擎、文字转语音、语音识别的讲解及实战(超详细 附源码)
120 0
|
18天前
|
机器学习/深度学习 人工智能 搜索推荐
探索安卓应用中的新趋势:人工智能驱动的智能推荐系统
传统的应用推荐系统已经无法满足用户日益增长的个性化需求。本文将探讨如何通过引入人工智能技术,构建智能推荐系统,为用户提供更加精准、个性化的应用推荐体验,进而提升应用的用户满意度和留存率。
16 0
|
1月前
|
搜索推荐 测试技术 定位技术
基于Android的自助导游系统的设计与实现(论文+源码)_kaic
基于Android的自助导游系统的设计与实现(论文+源码)_kaic
|
1月前
|
搜索推荐 安全 Android开发
安卓与iOS系统的用户体验比较
【2月更文挑战第11天】 在当今移动设备市场上,安卓和iOS系统一直是两大主流操作系统。本文将从用户界面设计、应用生态、系统定制性等方面对安卓和iOS系统进行比较分析,旨在探讨两者的优势和劣势,为用户选择合适的操作系统提供参考。
|
2月前
|
人工智能 vr&ar Android开发
探索安卓与iOS系统的发展趋势
【2月更文挑战第9天】 过去,人们对于安卓和iOS系统的争论主要集中在性能、用户体验和生态系统的比较上。然而,随着移动互联网的快速发展,两大操作系统在人工智能、物联网、安全性等方面的发展趋势也备受关注。本文将探讨安卓与iOS系统在技术发展方面的差异以及未来的发展趋势。