从0系统学Android--52 发送广播



本系列文章目录更多精品文章分类

本系列持续更新中.... 初级阶段内容参考《第一行代码》

5.3 发送自定义广播

前面已经学习了如何接受广播了,下面来学习如何发送自定义广播,广播类型分为:标准广播和有序广播,下面分别来说一下这两种广播如何发送。

5.3.1 发送标准广播

首先我们先创建一个广播接收器,用来接收我们发送的自定义广播。

用静态广播来实现

public class MyReceiver extends BroadcastReceiver {

    @Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"接收到了",Toast.LENGTH_SHORT).show();
}
} <receiver
android:name="com.example.firstcode.fifty_chapter.norboardcast.MyReceiver"
android:enabled="true"
android:exported="true"
android:permission="no">
<intent-filter>
<action android:name="com.my_broadcast"/>
</intent-filter>
</receiver> 这里 action 里面写自己要发送的广播的名字就可以了

随便在一个页面添加发送代码:

      buttonSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.my_broadcast");
sendBroadcast(intent); }
});

需要注意一点,上面的这种做法在 Android 8.0前是好用的,在 8.0 后进行了限制,限制通过静态注册来接受隐式广播详见 其实对于部分隐式广播也是可以的比如开机广播

通过这个限制我们可以得到解决办法有两种:

1.不通过静态注册接收器,通过动态注册就可以了

2.通过静态注册接收器,但是发送的广播不要是隐式的。

第一种很简单,就是动态注册,这里不演示了,演示第二种:

 buttonSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.my_broadcast");
// 明确指明要此广播要发送给的组件
intent.setComponent(new ComponentName(NetChangeActivity.this, MyReceiver.class));
NetChangeActivity.this.sendBroadcast(intent); }
});

由于广播是通过 Intent 来进行传递的因此我们可以通过 Intent 来携带一些数据。

5.3.2 发送有序广播

广播是一种跨进程的通信,也就是说可以让不同的应用程序进行通信

如何发送有序广播呢?

 NetChangeActivity.this.sendOrderedBroadcast(intent,null);

这样就是发送有序广播了,第二个参数是与权限有关,传入 null 就可以了

那么如何设置接收器接受的顺序呢?

  <intent-filter android:priority="100">
<action android:name="com.my_broadcast.MY_BROADCAST"/>
</intent-filter>

通过 android:priority 来设置。同样接收器在接收到消息后也可以通过 abortBroadcast() 来截取广播,让后面的接收器无法再接受到这条广播。

5.4 使用本地广播

前面我们发送和接受的广播全部属于系统全局广播,也就是说这些广播可以被系统中的其他应用程序接收到,并且我们也可以接受到来自其他任何应用的广播。这样容易引起安全问题。

为了解决这个问题,Android 引入了一套本地广播机制,使用这个机制广播只能够在程序内部进行传递。其实实现很简单就是通过 LocalBroadcastManager 来对广播进行管理。

下面我们就来列几个方法就可以了

LocalBroadCastManager localBroadCastManager = LocalBroadCastManager.getInstance(this)// 获取实例
// 发送广播的时候
Intent intent = new Intent("com.broadcst.syd");
localBroadCastManager.senBroadCast(intent); // 注册广播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.broadcst.syd");
localBroadCastManager.registerReceiver(localReceiver,intentFilter); // 取消注册
localBroadCastManager.unregisterReceiver(localReceiver);

其实和之前动态注册发送都是一样的,只是换了一个类来执行而已。

本地广播是无法通过静态注册的 ,这很好理解,静态注册是为了让应用程序还没有启动就能接受广播,而发送本地广播的时候,程序肯定已经启动了,因此完全不需要静态注册了。

注意这里的本地指的是当前应用程序内

使用本地广播优势:

  • 明确的知道发送的广播不会离开我们的应用程序,不用担心泄漏信息。
  • 同样其他广播也无法发送到我们程序内部,不用担心有安全漏洞。
  • 发送本地广播比发送系统全局广播将会更加高效

从0系统学Android--5.2 发送广播的更多相关文章

  1. 从0系统学Android--3.7 聊天界面编写

    从0系统学Android--3.7 聊天界面编写 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.7 编写界面的最佳实践 前面学习了那么多 UI 开发的知识,下面来进行实践,做一个美观 ...

  2. 从0系统学Android-2.5更多隐式Intent用法

    本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 从0系统学Android-2.5更多隐式Intent用法 上一节中我们学习了通过隐式 Intent 来启动 Act ...

  3. 从0系统学Android--4.1探究碎片

    从0系统学Android--4.1探究碎片 本系列文章目录:更多精品文章分类 本系列持续更新中.... 初级阶段内容参考<第一行代码> 第四章:手机平板要兼顾--探究碎片 平板电脑和手机最 ...

  4. 从0系统学Android--3.6 RecyclerView

    从0系统学Android--更强大的滚动控件---RecyclerView 本系列文章目录:更多精品文章分类 本系列持续更新中.... 参考<第一行代码> 首先说明一点昨天发了一篇关于 L ...

  5. 从0系统学Android--3.5 最常用和最难用的控件---ListView

    从0系统学Android-- 3.5 最常用和最难用的控件---ListView 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.5 最常用和最难用的控件---ListView Lis ...

  6. 从0系统学Android--3.2四种基本布局

    从0系统学Android--3.2四种基本布局 本系列文章目录:更多精品文章分类 本系列持续更新中.... 3.3 系统控件不够用?创建自定义控件 上一节我们学习了 Android 中的一些常用的控件 ...

  7. 从0系统学Android--3.1编写UI界面

    从0系统学Android--3.1编写UI界面 本系列文章目录:更多精品文章分类 本系列持续更新中.... 界面设计和功能开发同样重要,界面美观的应用程序不仅可以大大增加用户粘性,还能帮我们吸引到更多 ...

  8. 从0系统学Android--2.6 Activity 的最佳实践

    从0系统学Android--2.6 Activity 的最佳实践 本系列文章目录:更多精品文章分类 本系列持续更新中.... 实践中的技巧 2.6.1 知晓当前是在哪个 Activity 这个其实很简 ...

  9. Android应用程序发送广播(sendBroadcast)的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6744448 前面我们分析了Android应用程 ...

随机推荐

  1. vue表格业务

    https://www.jianshu.com/p/79f39f2c1382 https://blog.csdn.net/zhongshijun521/article/details/78390614 ...

  2. 7)加了基础控制器Controller.php

    文件目录展示: 改动代码展示: Controller.php <?php /** * Created by PhpStorm. * User: Interact * Date: 2017/8/2 ...

  3. 吴裕雄--天生自然Android开发学习:Android studio 3.5安装详解

    3. 建立AVD(安卓虚拟设备) 点击右上角AVD Manager图标,单击按钮Create Virtual Device,选择Nexus 5X,下一步,选择版本9.0,Download,然后Next ...

  4. WordPress快速打造个人博客

    前些天用wordpress搭建了现在这个博客,所以总结了一篇文章,讲讲怎么样简单的创建一个博客.开始前这里有篇我搭建时所遇到的问题可以作为参考<WordPress建站注意事项>,首先我们要 ...

  5. 默认的Settings.xml文件(无修改过)-Maven

    Tip: 当什么都不作修改时,默认是从Maven中央仓库进行下载,https://repo.maven.apache.org/maven2. 打开maven源码下的lib文件夹,找到maven-mod ...

  6. scrollIntoView 前的元素滚动到浏览器窗口的可视区域内 不止垂直滚动,还有水平滚动

    Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内 element.scrollIntoView(); // 等同于element.scrollIntoVi ...

  7. css 控制li点与文字的距离

    ul>li 默认的样式如下 前面的点与文字是有间距的 可见,通过设置 text-indent 属性可以调整li点与文字的距离

  8. Ness

    三年前与三年后. 今年五月到六月,因为某个原因和蒋哥一起开发了个小游戏.虽然比较粗糙,也没有取得什么,但不管怎么说也是心头肉呀--我比较没用,前期因为ACTF在划水,后期因为ICPC在划水,中间信心满 ...

  9. 面试的绝招(V1.0)

    <软件自动化测试开发>出版了 测试开发公开课培训大讲堂 微信公众号:测试开发社区 测试开发QQ群:173172133 咨询QQ:7980068 咨询微信:zouhui1003it

  10. k8s集群搭建(三)

    Dashboard安装 Kubernetes Dashboard是k8s提供基于Web的监控和操作界面,可以通过UI来显示集群的所有工作负载,除了查看资源,还是创建.编辑.更新.删除资源. 根据Kub ...