zoukankan      html  css  js  c++  java
  • android短信拦截

    广播分2种,无序广播和有序广播。可以理解为散列和队列广播。

    首先无序广播,不能中断,分发机制有点类似散列发送。这种广播的的发送为:context.sendBroadcast
    这种广播是不能中断的,请看API说明。
    其次为有序广播,可以中断。
    这种广播,以我的理解可能存在很大的BUG,短信这块广播的发送BUG现在被QQ和360利用,可能在以后的版本中会修订。
    它是一个按一种优先级顺序发送,即按某种messagequere队列发送,其中队列中的任何广播接收者都可以终端该广播,导致它之后的成员不能接收到广播。
    我们首先看这个队列是怎么形成的:(以下是假想+测试验证,有待代码验证)
    假设我们广播优先级别都设成:2147483647(注:最大int形整数)

    首先动态注册优先级别最高
    其次静态注册

    在动态注册中
    最早动态注册优先级别最高

    在静态注册中
    最早安装的程序,静态注册优先级别最高(注:安装APK会解析af.xml,把其加入队列)
    注意这里安装 是指adb install xxx.apk或者手机上安装应用。
    然后才是adb push到其他目录的应用
    可能的原因是手机查询应用的时候会先去特定目录解析应用,所以广播注册会出现这种差别。adb push 到system/app下会比安装的优先级高吗?这有待你的验证,我还没验证。

    然后都是安装的应用中
    首先安装的优先等级最高

    OK 以上就是我分析的有序广播的优先级别问题。

    反编译360源码会发现,他首先静态注册的广播接收器里面设置的优先数量级为2147483647,然后在广播中启动一个service,在service中注册了一个优先数量级为2147483647的同样的广播接收器。
    就这么简单就实现了没有同种实现的应用的情况下拦截短信。

    OK,我们现在以同样的方式来做一个实验:
    首先写一个应用,注册一个开机完成广播接收者。

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

    然后在这个广播接收者接收到信息之后马上启动一个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重新注册一个接收短信的广播接收者,优先级2147483647

    IntentFilter localIntentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
                 localIntentFilter.setPriority(2147483647);
                 myService = new MyBrocast();
                 MyBrocast localMessageReceiver = myService;
                 Log.v("MyBrocast.onReceive", "onCreate");
                 Intent localIntent = registerReceiver(localMessageReceiver, localIntentFilter);

    这种重启手机就OK了,你也可以让360,QQ郁闷的。

  • 相关阅读:
    Java中时间方法大全(持续更新)
    Set集合转换为List集合
    Maven配置【详细】
    maven配置环境变量
    idea中创建Java类时,自动在文件头中添加作者和创建时间
    linux下怎样在某个文件里面查找一个字符串?
    执行docker一系列命令失败
    如何在服务器上搭建SVN
    本地拉取服务器上的项目,SVN 由于目标计算机积极拒绝 无法连接失败
    [节选] web项目中使用freemarker [Translated By Nan Lei]
  • 原文地址:https://www.cnblogs.com/code4app/p/3731930.html
Copyright © 2011-2022 走看看