前面我们发送和接收的广播全部都是属于系统全局广播,即发出的广播可以被其他任何 的任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容 易会引起安全性的问题,比如说我们发送的一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。

为了能够简单地解决广播的安全性问题,Android 引入了一套本地广播机制,使用这个 机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用 程序发出的广播,这样所有的安全性问题就都不存在了。

本地广播的用法并不复杂,主要就是使用了一个 LocalBroadcastManager 来对广播进行 管理,并提供了发送广播和注册广播接收器的方法。下面我们就通过具体的实例来尝试一下 它的用法,修改 MainActivity 中的代码,如下所示:

public class MainActivity extends Activity { private IntentFilter intentFilter; private LocalReceiver localReceiver;

private LocalBroadcastManager localBroadcastManager;

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

localBroadcastManager = LocalBroadcastManager.getInstance(this);

// 获取实例

Button button = (Button) findViewById(R.id.button);

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent("com.example.broadcasttest. LOCAL_BROADCAST");

localBroadcastManager.sendBroadcast(intent); // 发送本地广播

}

});

intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST"); localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter);// 注册本地广播监听器

}

@Override

protected void onDestroy() {

super.onDestroy();

localBroadcastManager.unregisterReceiver(localReceiver);

}

class LocalReceiver extends BroadcastReceiver {

@Override

public void
onReceive(Context context, Intent intent) { Toast.makeText(context,
"received local broadcast",

Toast.LENGTH_SHORT).show();

}

}

}

有没有感觉这些代码很熟悉?没错,其实这基本上就和我们前面所学的动态注册广播接 收器以及发送广播的代码是一样。只不过现在首先是通过 LocalBroadcastManager 的 getInstance() 方法得到了它的一个实例,然后在注册广播接收器的时候调用的是 LocalBroadcastManager
的 registerReceiver()方法,在发送广播的时候调用的是 LocalBroadcastManager 的 sendBroadcast() 方法,仅此而已。这里我们在按钮的点击事件里面发出了一条 com.example.broadcasttest. LOCAL_BROADCAST 广播,然后在 LocalReceiver 里去接收这条广播。重新运行程序,并 点击 Send Broadcast 按钮,效果如图 5.9 所示。

图   5.9

可以看到,LocalReceiver 成功接收到了这条本地广播,并通过 Toast
提示了出来。如果你还有兴趣进行实验,可以尝试在
BroadcastTest2 中也去接收 com.example.broadcasttest.
LOCAL_BROADCAST 这条广播,答案是显而易见的,肯定无法收到,因为这条广播只会在
BroadcastTest 程序内传播。

另外还有一点需要说明,本地广播是无法通过静态注册的方式来接收的。其实这也完全
可以理解,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地
广播时,我们的程序肯定是已经启动了,因此也完全不需要使用静态注册的功能。

最后我们再来盘点一下使用本地广播的几点优势吧。

1.    可以明确地知道正在发送的广播不会离开我们的程序,因此不需要担心机密数据泄 漏的问题。

2.    其他的程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐
患。

3.    发送本地广播比起发送系统全局广播将会更加高效。

android: 使用本地广播的更多相关文章

  1. Android中本地广播的实现

    其实Android的本地广播并没有什么好讲的,他就是用了一个localbroadcastmanager类来sendbroadcast,以及注册和注销广播,没有什么特点,其中实例该类的时候用了getin ...

  2. Android使用本地广播

    Android本地广播学习中一直被忽略,今天用到了,Mark一下 1.本地广播的定义和普通广播一样 例如 public class WakeTimesBroadcastReceiver extends ...

  3. Android学习总结——本地广播机制

    为了简单解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能在程序的内部进行传递,只能接受来自本应用程序发出的广播.否则当我们发送一些携带关键数据的广播可能被截获,一 ...

  4. android中实现本地广播

    上一篇文章实现了自定义广播: android中实现自定义广播 自定义广播允许被其他应用使用,有些情况下只允许广播在本应用范围内使用,可以用本地广播的方式实现 下面是实现的代码部分,MainActivi ...

  5. Android本地广播

    Android中使用的广播一般是系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播.这样就很容易会引起安全性的问题,比如说我们发送的一些携带关键性数 ...

  6. Android学习总结(七)———— 本地广播

    一.本地广播 2.1 基本概念 由于之前的广播都是全局的,所有应用程序都可以接收到,这样就很容易会引起安全性的问题,比如说我们发送一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不停 ...

  7. 本地广播的简单示例 --Android开发

    1.局部通知管理器LocalBroadcastManager,用于同一个应用中不同组件之间发送广播.由于是在同应用中发送广播,所以使用它安全性.效率也会提高. 2.本例实现简单的发送本地广播的案例 点 ...

  8. Android入门(八)广播

    原文链接:http://www.orlion.ga/572/ 一.广播机制 Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广 播可能是 ...

  9. Android学习笔记--广播(Broadcast)

    1.Android广播分类 android的广播类型分为两类:标准广播和有序广播. 标准广播:异步广播,广播发出后,所有注册了的广播接收器都会同时接收到该广播.打个比方:做地铁过程中的语音播报,当列车 ...

随机推荐

  1. Oracle 数据库、实例、用户、表空间、表之间的关系

    数据库: Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库. ...

  2. STM32应用实例七:与宇电设备实现AI-BUS通讯

    宇电的设备使用基于RS-485的自定义协议,协议本身比较简单,只有2条指令: 读:地址代号+52H(82) +要读的参数代号+0+0+校验码 写:地址代号+43H(67)+要写的参数代号+写入数低字节 ...

  3. hdu5358 推公式+在一个区间内的尺取+枚举法

    尺取+枚举,推出公式以后就是一个枚举加尺取 但是这题的尺取不是对一个值尺取,而是在一个区间内,所以固定左边界,尺取右边界即可 #include<bits/stdc++.h> #define ...

  4. div展开与收起(鼠标点击)

    效果图: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  5. Android使用帧动画内存溢出解决方法

    Android使用帧动画内存溢出解决方法https://blog.csdn.net/daitu_liang/article/details/52336015https://blog.csdn.net/ ...

  6. Springboot实现filter拦截token验证和跨域

    背景 web验证授权合法的一般分为下面几种 使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需 ...

  7. spring 中常用的两种事务配置方式以及事务的传播性、隔离级别

    一.注解式事务 1.注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo. 2.事务配置实例 (1).spring+mybatis 事务配置 &l ...

  8. qrcodebox 面向移动设备的二维码弹出框

    qrcodebox 面向移动设备的二维码弹出框 qrcodebox 简介 qrcode box,一个小小的二维码工具,通过调用它,可以在页面中间弹出一个二维码窗口,主要是面向移动设备的,对于PC端浏览 ...

  9. PHP 三元运算 ??与?:

    //$c = $a ?? $b; 等效 $c = isset($a) ? $a : $b; //$c = $a ?: $b; 等效 $c = $a ? $a : $b; $a = 'a'; $b = ...

  10. BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ...