四大组件之BroadcastReceiver(二)-使用权限和常用的系统广播

第4节 Broadcast的使用权限

为广播设置权限要考虑两方面的问题。

  1. 作为广播的发送者,希望限制广播的接收者,只让特定的应用组件接收到发出的广播;
  2. 作为广播的接收者,不希望任何组件都能模仿它关心的广播,因此希望在接受广播的时候能检查一下这条广播的发送者是否具有发送这条广播的资格;

无论是上面哪种情况,解决方法都试一样的:为发送者和接收者都设置一个相同的权限,只有它们的权限匹配上了,广播机制才能产生效果。

4.1 限制接收者

假设组件A要发布广播,

  1. AndroidManifest.xml文件中,与同级的位置,对外声明使用权限,表示这个应用发布了一个叫做com.anddle.receiver.receivebroadcast的权限,

    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
    
        <permission
            android:name="com.anddle.receiver.receivebroadcast"
            android:label="receiver pomission"
            android:protectionLevel="normal" />
    
        <application
            ....../>
    
    </manifest>
  2. 在组件向整个系统发布广播的时候,就采用,

    //前一个参数是广播的名称,后一个参数是广播权限的名称
    sendBroadcast("custom.action.mybroadcast","com.anddle.receiver.receivebroadcast");

    这里的广播权限com.anddle.receiver.receivebroadcast,就是AndroidManifest.xml中声明的权限。

接收者要接收这种广播的时候,

  1. 接受者需要在它的AndroidManifest.xml当中静态的定义好接收机对应的receiver,或者在代码当中动态的定义好接收机对应的receiver

  2. 在它的AndroidManifest.xml当中,声明要使用的权限,

    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <!--声明要使用的权限-->
        <users-permission android:name = "com.anddle.receiver.receivebroadcast"/>
    
        <application
            ......>
            <!--假设采用的是静态定义的接收机-->
            <receiver
               android:name=".MyReceiver"
               android:enabled="true"
               android:exported="true">
               <intent-filter>
                   <action android:name="custom.action.mybroadcast"/>
                   <category android:name="android.intent.category.DEFAULT" />
               </intent-filter>
            </receiver>
    
        </application>
    
    </manifest>

4.2 限制发送者

假设接收者1要设置权限,只接收特定发送者发来的广播,

  1. AndroidManifest.xml文件中,对要设置权限的Broadcast Receiver设置上android:permission属性,该属性值可以任意指定一个字符串。通常使用程序的包名作为其中的一部分,这样可以避免和其他应用中的权限声明冲突。例如com.anddle.receiver.sendbroadcast

    <receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="com.anddle.receiver.sendbroadcast" />
  2. AndroidManifest.xml文件中,与同级的位置,对外声明前面使用的标签,表示这个应用发布了一个叫做com.anddle.receiveraccess的权限,

    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
    
        <permission
            android:name="com.anddle.receiver.sendbroadcast"
            android:label="receiver pomission"
            android:protectionLevel="normal" />
    
        <application
            ....../>
    
    </manifest>

    其中android:name属性的值,就是<receiver/>标签中设置的android:permission的值。

发送者B要发送相应的广播,就要

  1. 在B的AndroidManifest.xml中加入权限的使用,

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.anddle.calculator">
    
        <uses-permission android:name="com.anddle.receiver.sendbroadcast"/>
    
        <application
                ....../>
    
    </manifest>

    其中,<uses-permission/>标签中设置的android:name的值,就是应用A中对外声明的那个Broadcast Receiver的权限值。

  2. 使用代码发送广播,

    Intent i = new Intent("custom.action.mybroadcast");
    sendBroadcast(i);

4.3 接收其它应用的广播

在应用的AndroidManifest.xml文件中,Broadcast Receiver具有android:exported属性,

<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true"></receiver>
  1. android:exported属性设置成true:可以接收其他应用发来的广播;
  2. android:exported属性设置成false:不能接收其他应用发来的广播;

所以当两个不同的应用之间需要发送和接收广播的时候,需要把这个属性设置成true


/*******************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/


第5节 系统的广播

系统提供了很多现成的广播,开发者可以根据自己应用的需要,关注某些特定的广播。这里介绍几种使用频率最高的广播。

5.1 开机完成

有的时候,应用希望在开机完成之后,启动一个在后台运行的Service。例如我们常用的微信应用,开机后会启动一个Service和网络相连,如果有消息来,就通知我们有朋友发消息来了。

但是系统刚启动,用户没有主动打开微信,那么这个微信的Service是不会运行起来的。这时候,就可以使用Broadcast Receiver了,让它关注一个叫做android.intent.action.BOOT_COMPLETED的广播,

<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true"
    android:permission="android.intent.action.BOOT_COMPLETED" />

这样,等开机完成后,系统发出android.intent.action.BOOT_COMPLETED广播后,MyReceiver就可以收到这条广播,进行自己的处理-例如运行一个Service了。

使用这条广播有个很重要的地方需要注意,在Android 4.0以上的系统当中,安装了这个应用以后,用户必须手动启动一次该应用(运行该应用的Activity),这样重启设备之后,就能收到android.intent.action.BOOT_COMPLETED广播了。

5.2 时间变化

如果我们很关心时间的变化,例如要实现一个时钟,每一秒的变化,时间设置改变,时区变化都将是关心的内容。

所以,可以创建动态的接收机监听3种广播,

  1. Intent.ACTION_TIME_TICK
  2. Intent.ACTION_TIME_CHANGED
  3. Intent.ACTION_TIMEZONE_CHANGED
final IntentFilter filter = new IntentFilter();

//监听每一秒的变化
filter.addAction(Intent.ACTION_TIME_TICK);
//监听时间设置的改变
filter.addAction(Intent.ACTION_TIME_CHANGED);
//监听时区的改变
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);

registerReceiver(receiver, filter);

同时将接收机定义成,

private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
       if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) {
          //每一秒发生变化
       }
       else if (Intent.ACTION_TIME_CHANGED.equals(intent.getAction())) {
          //时间发生变化
       }
       else if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) {
         //时区发生变化 
       }
   }
};

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
谷歌官方推出Material Design 设计理念已经有段时间了,为支持更方便的实现 Material Design设计效果,官方给出了Android support design library 支持库,让开发者更容易的实现材料设计的效果。顺便推荐官方的一个图标库: Material Icons 控件名称 NavigationView FloatingActionButton TextInputLayout Snackbar TabLayout AppBarLayout CoordinatorLayo

MVC与MVVM设计模式理解 - 2016-06-25 14:06:05

MVC与MVVM设计模式理解 MVC设计模式 MVC是一种架构模式,M表示Model,V表示视图View,C表示控制器Controller: Model负责存储、定义、操作数据; View用来展示给用户,并且和用户进行交互; Controller是Model和View的协调者,Controller把Model中的数据拿过来给View使用。Controller可以直接与Model和View进行通信,而View不能与Controller直接通信。,当有数据更新时,Model也要与Controller进行通信,
Volley的简单介绍 http://blog.csdn.net/chengshuyuan_uestc/article/details/51755189 Volley源码解析(一)Volley中乱码问题及解决方案 http://blog.csdn.net/chengshuyuan_uestc/article/details/51755191 Volley源码分析(二)-Volley中的Request类 http://blog.csdn.net/chengshuyuan_uestc/article/deta
一、 方案议题综述 移动互联网的普及以及智能家居的发展,物联网的发展,越来越多的小设备,脱机设备亟待接入互联网形成互联互通,与服务提供商连接,提供更新更强服务。但是普通小设备都是低成本非常简单的单片机为主控芯片的,不具备上网功能,更不可能在单片机里面跑TCP/IP协议栈,由此,3G模块具备嵌入式TCP/IP协议栈并提供串口供单片机收发数据,单片机只需提供一路串口,并且把要发送的数据通过串口发送出去,3G模块负责把数据传输到公网的指定主机上,这样单片机就接入互联网了。 今天的课题,我们选用IM506P作为核
毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,所以就聊下

手把手教你解析Resources.arsc - 2016-06-24 18:06:23

一、前言 对于APK里面的Resources.arsc文件大家应该都知道是干什么的(不知道的请看我的另一篇文章 Android应用程序资源文件的编译和打包原理 ),它实际上就是App的资源索引表。下面我会结合实例对它的格式做一下剖析,读完这篇文章应该能够知道Resources.arsc的格式,并可以从二进制的文件中查找到资源的相关信息,或者根据资源的id可以定位到二进制文件中的位置。不过本人对Android资源文件的有一些相关概念并不是特别熟悉,所以文章中有很多地方也并不明白,如有错误欢迎指正! 二、R.
一、IMS开机初始化 (如果图片看不清的话,可以右键选择在查看图片,或者把图片另存到自己电脑再查看。) 本 文 来 自 http://blog.csdn.net/linyongan , 转 载 请 务 必 注 明 出 处 。 1.1 监控IMS Service PhoneApp进程是在系统开机时启动的,Phone进程初始化的时候(步骤1~6),在创建GSMPhone或者CDMAPhone之后,会执行监控IMS Service的流程,也就是流程图上的 步骤7 ,在PhoneFactory. Java 的ma
怎样防止App在后台运行,点击App桌面的图标重新启动?            在项目中,遇到一个问题百思不得其解,那就是:我在app使用过程中,点击了home键,然后去看看微信之类的其他应用,这个时候再点击app桌面的图标,这个时候app是重新启动的,而不是从上次停止的界面开始的。            对于上面的情况,我觉得既然我的app已经在后台还运行着,为什么就不能继续重上一个界面继续运行,非得从新运行呢。然后我就去查资料解决了这个问题。首先讲讲这个现象的本质。            原因:当点击
1、ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件。如果被覆盖掉的文件是动态链接so、dex或者odex文件,轻则产生本地拒绝服务漏洞,影响应用的可用性,重则可能造成任意代码执行漏洞,危害用户的设备安全和信息安全。比如近段时间发现的“寄生兽”漏洞、海豚浏览器远程命令执行漏洞、三星默认输入法远程代码执行漏洞等都与ZIP文件目录遍历有关。 阿里聚安全的应用漏洞扫描服务,可以检测出应用的ZIP文

浅谈Android中的MVP - 2016-06-24 17:06:24

转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51745798 本文出自: 【顾林海的博客】 前言 为什么使用MVP,网上有很多说法,最主要就是减轻了Activity的责任,相比于MVC中的Activity承担的责任太多,因此有必要讲讲MVP。 MVP入门 在MVC框架中,View是可以直接读取Model模型中的数据的,Model模型数据发生改变是会通知View数据显示发生相应的改变。而在MVP中Model和View之间的没有