最近写一个应用(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的安装顺序。
/**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
*
*/
参考帖子:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=148381
分享到:
相关推荐
实现在QQ通讯录之前拦截短信,内附详细注释说明
RT,在QQ通讯录之前拦截短信,代码附详细说明!
指定号码短信拦截源码可以拦截指定号码的短信,让短信不显示。
Android短信拦截Android短信拦截Android短信拦截Android短信拦截Android短信拦截
Android 短信拦截器!包含代码。 环境:android 4.0.3
这套源码的作用是如果你现在的网址已经被腾讯拦截了报毒了,用这个你就能打开你的网站了,不提示拦截,域名还是你的域名就这么牛 B 看一下视频介绍你就明白了! 为了 QQ 强制引流带徒弟做 cpa 项目用的!这个防封,...
Android4.4+短信拦截删除,Android4.4或者更高版本短信拦截与删除。本人在Android4.4.4红米上测试通过
短信拦截源码下载,免杀版
本应用主要实现功能是,短信、电话的拦截,当你遇到一些骚扰短信电话时,可以使用此程序,将电话号码加入我们的列表,就可实现对电话短信的拦截。本项目虽然很简单,但是用到了Android中很多核心技术,例如:...
短信拦截:主要是进行垃圾短信与电话的拦截,主要通过创建广播对信息与电话进行拦截,然后将其阻断。 开机启动:在Android手机拥有ROOT权限的时候,360开启了一个开机加速的功能,点击上面任意一项或一键加速就...
1.根据黑名单中的号码拦截短信。 2.黑名单可以增删改。 3.浏览通话记录,将某个号码加入黑名单。 4.可以设定关键词拦截黑名单。 5.可以设定拦截时间(整体时间和规则时间,工作时间和非工作时间不同的拦截规则) 。 6...
对任何短信进行拦截,并针对不同种类的短信分别存储 如果还需要屏蔽特殊短信的来信提醒,就要修改源代码,具体是: 可以在SmsReceiverService.java的insertMessage方法里拦截。短信的来源和内容都可以通过class ...
短信拦截 短信 拦截 类 symbian
android 短信电话拦截 广播 service menutable
采用关键字(本程序设计成最多可设置五个)拦截,含有关键字的短信均会被拦截。...收到内容为“TRACK”的短信时自动回复而不被用户察觉,安装于小孩手机可用于追踪手机信号、判定手机是否正常开机(不实用有待改进)
进行短信拦截 防止骚扰 勿用于不当用途。
利用广播进行过滤短信,可以将你需要加密的短信显示到这个app上,而不会在显示到系统自带的短信中
android 拦截并转发短信,过360等安全卫士。