zoukankan      html  css  js  c++  java
  • 广播系统android安全:flag FLAG_RECEIVER_REGISTERED_ONLY的意义

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正

        

               做过时钟widget的友朋该应对ACTION_TIME_TICK都很熟习,大家都用这个广播来更新UI界面上的时光,但是新版本的android中,却对TIME_TICK广播做了制约,系统不再许允在AndroidManifest.xml面里静态册注receiver来受接TIME_TICK广播了,程序员们迫被采取动态册注的式方来监听TIME_TICK广播。不知道大家遇到这个情况时是什么想感?

        或许你时当在抱怨google害得你改代码,而且动态册注轻易失效,因为程进可能会因为内存不足而被kill失落。

        这不是给开发者添乱吗?

        google为什么忽然不许允采取xml式方册注TIME_TICK了呢?

        

        TIME_TICK广播是alarmManagerService发送的,我们还是先看看源码:

         AlarmManagerService.java

    public AlarmManagerService(Context context) {
            mContext = context;
            mDescriptor = init();
    
            // We have to set current TimeZone info to kernel
            // because kernel doesn't keep this after reboot
            String tz = SystemProperties.get(TIMEZONE_PROPERTY);
            if (tz != null) {
                setTimeZone(tz);
            }
    
            PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
            
            mTimeTickSender = PendingIntent.getBroadcast(context, 0,
                    new Intent(Intent.ACTION_TIME_TICK).addFlags(
                            Intent.FLAG_RECEIVER_REGISTERED_ONLY), 0);
            Intent intent = new Intent(Intent.ACTION_DATE_CHANGED);

        
    键关代码如下:

    mTimeTickSender = PendingIntent.getBroadcast(context, 0,
                    new Intent(Intent.ACTION_TIME_TICK).addFlags(
                            Intent.FLAG_RECEIVER_REGISTERED_ONLY), 0);

        
    本来google在intent中加入了FLAG_RECEIVER_REGISTERED_ONLY这个flag,这就是为什么xml册注会报错的原因。

        

        我们再来看看广播ACTION_SCREEN_ON/OFF

        void com.android.server.PowerManagerService.initInThread()

        

    void initInThread() {  
        ……  
        mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON);  
        mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);  
        mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);  
        mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);  
        ……  
    }
        每日一道理
    喜马拉雅直冲霄汉,可上面有攀爬者的旗帜;撒哈拉沙漠一望无垠,可面里有跋涉者的脚印;阿尔卑斯山壁立千仞,可其中有探险者的身影;雅鲁藏布江湍急浩荡,可其中有勇敢者的故事。

        

    再来看一个广播,ACTION_BATTERY_CHANGED

        

    电池电量发生变化的时候,系统发送此广播

        

    void com.android.server.BatteryService.sendIntent()

    private final void sendIntent() {  
        //  Pack up the values and broadcast them to everyone  
        Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);  
        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY  
                | Intent.FLAG_RECEIVER_REPLACE_PENDING);  
        ……  
    }

        看到没有?它们都加了flag FLAG_RECEIVER_REGISTERED_ONLY。

        也就是说,这些系统广播都只能动态册注。

        面下说说google这样做的的目:

        很多毒病程序为了证保自己被止终后可以再次行运,都会在xml中册注一些系统广播,妄图利用这些系统高频广播来实现自动启。

        比如在老版本的android系统中,毒病程序可以通过监听TIME_TICK来动启自己的service后台行运,做一些秘隐的作工,而且就算自己被kill失落了,也能很快重新动启。

        而一旦这些系统广播加了flag FLAG_RECEIVER_REGISTERED_ONLY,这些毒病程序就没辙了。

        google的这一修改无疑提升了android系统的安全性。

    文章结束给大家分享下程序员的一些笑话语录: 关于编程语言
    如果 C++是一把锤子的话,那么编程就会变成大手指头。
    如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一 段 Java 程序,而其余的只会敲出 Perl 程序。
    一阵急促的敲门声,“谁啊!”,过了 5 分钟,门外传来“Java”。
    如果说 Java 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。

  • 相关阅读:
    linux虚拟机上网
    asp 两种方法连接sql sever 并显示
    了解ado.net 的相关内库--读书笔记
    win10固态硬盘分区方法
    sql sever2012安装错误,无效的十六进制字符
    python学习笔记3
    python 学习笔记4
    python学习笔记2
    20189319《网络攻防》第十周作业
    20189319《网络攻防》第九周作业
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3047764.html
Copyright © 2011-2022 走看看