最近写一个应用(A),需要拦截短信分析。一般是这样实现的:注册一个接受短信Intent-Filter,获取短信广播,分析短信内容然后相应处理。对特定短信终止广播继续(abort方法),阻止其进入收件箱。大致就是这么一个过程。
但上述方式,在QQ通讯录/360/飞信存在的情况下,拦截短信失败~也就是说它们抢先拿到了收短信的广播,并将其中断了。那么如何解决这个问题呢~
本来以为腾讯是拦截ril层的消息,然后阻止广播继续,但是这种方式要修改framework才能实现。
后来发现存在广播接收器(Receiver)的Intent-Filter的优先级(priority),SDK里说Prioruty的范围是-1000~1000,若设为一千以上好像跟1000的效果一样。然后我在A应用中的Manifest里将Receiver的Intent-Filter优先级设为1000,但测试结果还是被QQ通讯录抢先。
进一步Google后,得到下面的结论:
反编译QQ通讯录/360手机卫士,发现些许奥秘。貌似这个涉及到Broadcast的分发机制,参考底层代码应该比较好解释~
广播分为2中,无序和有序。可以理解为散列和队列。
首先无序广播,不能中断,所有注册相应Intent-Filter的Reciver都可以接收到~
其次是有序广播,可以中断。它的消息是按优先级传送的,任何一个Receiver在接收后,可以使用abort将其停止,这样就导致了后续的Receiver不能收到广播。
下面是一个猜想,做了些测试,也基本符合~
假设广播接收器的优先级都设为最大整型2147483647,首先动态注册优先级最高,其次是静态注册。在动态注册中,最早注册的优先级最高。在静态注册中,最早安装的程序,优先级最高(注:安装apk会解析af.xml,把其加入队列)
在反编译360后,发现其静态注册的广播接收器里设置的优先级数值为2147483647,然后再广播中启动一个service,在service中注册一个优先级为2147483647的同样地广播接收器。也就是说,假设现在进程全杀,那么短信来了,360和QQ通讯录,谁先安装,谁的静态注册广播接收器就会先启动,然后把广播中断,而且它还启动了一个service又动态注册一个Receiver。这样,它的优先级就排在了所有静态接收器之前了。
所以,我们做个试验,以同样的方式:
首先写一个应用,注册一个开机完成的Receiver
<receiver android:name=".MyBrocast" android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
然后再这个Receiver接收到开机广播后,立即启动一个service
public void onReceive(Context context, Intent intent) {
Log.v("MyBrocast.onReceive", "testtttttttttttt");
if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
Intent service=new Intent(context, MyService.class);
context.startService(service);
}
}
然后在service中重新动态注册一个Receiver,优先级为2147483647
IntentFilter localIntentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
localIntentFilter.setPriority(2147483647);
MyBrocast localMessageReceiver =new MyBrocast();
Log.v("MyBrocast.onReceive", "onCreate");
Intent localIntent = registerReceiver(localMessageReceiver,localIntentFilter);
重启手机就OK了,抢先360、QQ拦截短信~因为360/QQ并没有在接受开机广播后,动态注册短信广播的接收器。这样重启后A应用就可以在它们之前拦截到短信了~
但上述抢先方式,付出的代价是,A应用需要一直有这么一个service后台运行。一旦被杀,优先权又回被360/QQ抢占,只有等到下次重启。除非A应用在QQ/360之前安装到手机上~
总结一下:
具体的顺~ 代码动态注册的Intent-Filter高于manifest静态注册的Intent-Filter。动态注册中的Intent-Filter在相同优先级下(如整型的最大值),接受顺序是按照动态注册的时间顺序。静态注册中Intent-Filter在相同优先级下,接受顺序是apk的安装顺序。
参考帖子:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=148381
分享到:
相关推荐
在Android系统中,实现短信拦截功能主要涉及到两个关键知识点:BroadcastReceiver(广播接收者)和ContentProvider。在Java编程环境下,我们可以通过这两种组件来监听并处理短信消息。 首先,我们需要创建一个...
在Android系统中,短信拦截是一项重要的功能,它允许开发者创建应用程序来过滤或处理特定类型的短信。这个"Android短信拦截源码"可能包含了实现这一功能的完整代码库,可以帮助我们理解如何在Android应用中实现短信...
【iOS5短信拦截小demo】是一个面向iOS平台的示例项目,主要展示了如何在iOS系统中实现短信的拦截功能。这个项目可能适用于开发者或者对iOS系统底层操作感兴趣的用户,特别是那些想要了解或开发类似功能的人。 在iOS...
在Android系统中,短信拦截器是一种机制,允许开发者在短信到达设备时进行处理,比如过滤、存储或响应特定类型的短信。这个"Android 短信拦截器"可能是一个示例项目,展示了如何在Android 4.0.3(Ice Cream Sandwich)...
【短信拦截源码详解】 短信拦截技术在移动设备安全领域占据着重要的位置,尤其是在Android系统中,由于其开放性,开发者可以通过编写特定的代码来实现对短信的接收、处理和控制。在这里,我们主要探讨的是Android...
《中国电信垃圾短信拦截系统技术规范推荐》是中国电信集团公司在2012年发布的一份指导性文档,旨在规范和提升其垃圾短信治理能力。本文档主要涵盖了垃圾短信拦截系统的功能需求和技术实现建议,以保障网络资源的有效...
本文将深入探讨Android 4.4+短信拦截删除的相关知识点。 首先,我们要了解的是`BroadcastReceiver`,这是Android系统中用于监听特定事件(如接收到短信)的重要组件。开发者可以创建一个自定义的`BroadcastReceiver...
"MTK功能机短信拦截方法"是指在搭载MediaTek芯片的功能手机上实现对短信的拦截和处理的一种技术手段。这个技术对于开发远程控制手机的应用尤其关键,因为它允许程序在用户不知情的情况下接收和响应特定的短信指令。 ...
【短信拦截与黑名单功能】 在现代智能手机中,短信拦截与黑名单功能是用户管理通信、防止垃圾短信和骚扰信息的重要工具。这些功能允许用户定制规则,筛选出不希望接收的短信,提升个人信息安全和隐私保护。 1. **...
在Symbian操作系统中,短信拦截功能是一种重要的安全特性,它允许用户阻止不必要的或潜在的恶意短信。"短信拦截类"通常是指一个编程类,开发者可以利用这个类来实现短信的过滤和管理。下面我们将详细探讨Symbian系统...
【短信拦截与开机自启】 在移动设备领域,短信拦截是一项重要的安全功能,它允许用户阻止不必要的、垃圾的或者潜在有害的短信。短信拦截器通常作为手机安全应用的一部分,能够帮助用户过滤掉广告、诈骗信息甚至恶意...
在本文中,我们将深入探讨Symbian系统的手机短信拦截源代码。Symbian是一个历史悠久的智能手机操作系统,曾经广泛应用于诺基亚等品牌手机。短信拦截功能对于用户来说非常重要,它可以帮助用户过滤垃圾短信,保护隐私...
2. **短信拦截**:要实现短信拦截,我们需要创建一个BroadcastReceiver,并在它的onReceive()方法中处理接收到的短信。首先,我们需要在AndroidManifest.xml文件中注册BroadcastReceiver,并声明SMS_RECEIVED权限: ...
本文将深入探讨Android平台上的短信功能,特别是如何在Android应用中实现短信拦截,以及有序广播的概念。 一、Android SMS服务基础 Android系统提供了SmsManager类,它是处理短信操作的主要接口。通过这个类,...
在Android平台上,短信拦截和定位是两个不同的但相关的功能,它们在移动应用开发中具有一定的实用价值。本文将深入探讨这两个主题,以便更好地理解它们的工作原理、实现方式以及相关注意事项。 首先,我们来讨论...
本文将深入探讨基于安卓平台的短信拦截应用程序的开发与实现,主要通过分析给出的源码进行学习和研究。短信拦截应用程序是一种能够控制和管理手机接收到的短信的应用,它可以阻止特定号码或所有号码的短信在用户手机...
在Android系统中,短信拦截是一项重要的功能,它允许应用程序在接收到短信时进行处理,比如阻止垃圾短信或者自动执行特定操作。本项目“android 短信拦截源码”提供了实现这一功能的代码示例,我们可以从中学到如何...