发送一条广播

发送广播的方法和启动Activity的方法是非常类似的。首先新建一个Intent对象,然后使用sendBroadcast()sendOrderedBroadcast()或者sendStickyBroadcast()发送广播:

  • sendBroadcast():发送一条普通广播。这种广播接收不分先后,而且不能截断,不能被修改。
  • sendOrderedBroadcast():发送一条有序广播。这种广播按照一定的顺序被接收,接收顺序可以通过在<intent-filter>标签下设定android:priority来改变。可以使用abortBroadcast()方法终止广播的传播。
  • sendStickyBroadcast():发送一条粘滞广播。这种广播在没有被接收的时候会一直存在。所以即使在广播发送后注册的接收器也能接受到这种广播。这种广播使用的使用要添加相应的权限。由于这种广播带来了很多安全性的问题,所以在API 21 以后已经被废弃了。

接收广播

  • 首先创建一个类继承BroadcastReceiver,并重写其中的onReceive()方法;
  • 注册Receiver。可以使用静态注册或者动态注册:
    • 静态注册:在Manifest文件中的<application>标签下添加<receiver>标签。在<receiver>标签下可以添加多个<intent-filter>来指定接收广播的类型;
    • 动态注册:如果想要让BroadcastReceiver只在一段时间内有效,可以调用registerReceiver()unRegisterReceiver()方法动态注册。

一个简单的例子

程序是这样子的:通过点击三个不同的按钮,可以发送三种不同的广播:

布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.broadcastreceiverdemo.MainActivity" ><Button
        android:id="@+id/button_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="发送普通广播" /><Button
        android:id="@+id/button_2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="发送有序广播" /><Button
        android:id="@+id/button_3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="发送粘滞广播" /></LinearLayout>

在主程序中发送广播:

public class MainActivity extends Activity implements OnClickListener{Button button1;Button button2;Button button3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button1 = (Button) findViewById(R.id.button_1);button2 = (Button) findViewById(R.id.button_2);button3 = (Button) findViewById(R.id.button_3);button1.setOnClickListener(this);button2.setOnClickListener(this);button3.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.button_1:Intent intent1 = new Intent();intent1.setAction("BC_One");intent1.putExtra(Intent.EXTRA_TEXT, "这是一条普通广播");//如果明确知道广播的唯一接收者,也可以使用显式的intent//intent.setClass(MainActivity.this, MyReceiver1.class);sendBroadcast(intent1);break;case R.id.button_2:Intent intent2 = new Intent();intent2.setAction("BC_Two");intent2.putExtra(Intent.EXTRA_TEXT, "这是一条有序广播");sendOrderedBroadcast(intent2, null);break;case R.id.button_3:Intent intent3 = new Intent();intent3.setAction("BC_Three");intent3.putExtra(Intent.EXTRA_TEXT, "这是一条粘滞广播");sendStickyBroadcast(intent3);//动态注册第三个广播接收器,注意这个接收器注册在广播发送之后IntentFilter filter = new IntentFilter();filter.addAction("BC_One");filter.addAction("BC_Two");filter.addAction("BC_Three");MyReceiver3 receiver = new MyReceiver3();registerReceiver(receiver, filter);break;default:break;  }}}

三个广播接收器:

public class MyReceiver1 extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String s = intent.getStringExtra(Intent.EXTRA_TEXT);Log.d("MyReceiver1", "收到一条广播:" + s);Bundle bundle = getResultExtras(true);String extraString = bundle.getString(Intent.EXTRA_TEXT);if(extraString != null){Log.d("MyReceiver1", "收到一条广播:" + extraString);}}}
public class MyReceiver2 extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String s = intent.getStringExtra(Intent.EXTRA_TEXT);Log.d("MyReceiver2", "收到一条广播:" + s);Bundle bundle = new Bundle();bundle.putString(Intent.EXTRA_TEXT, "这是第2条广播");setResultExtras(bundle);}}
public class MyReceiver3 extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String s = intent.getStringExtra(Intent.EXTRA_TEXT);Log.d("MyReceiver3", "收到一条广播:" + s);Bundle bundle = getResultExtras(true);String extraString = bundle.getString(Intent.EXTRA_TEXT);if(extraString != null){Log.d("MyReceiver3", "收到一条广播:" + extraString);}}}

setResultExtras()可以用来更改广播中的内容;getResultExtras()可以用来得到广播中的内容。这两个方法都只对有序广播有用。

前两个广播在Manifest文件中注册,第三个广播使用动态注册的方法,在广播发送以后被注册。

        <receiver android:name="com.example.broadcastreceiverdemo.MyReceiver1" ><intent-filter><action android:name="BC_One" /></intent-filter><intent-filter android:priority="-100" ><action android:name="BC_Two" /></intent-filter><intent-filter><action android:name="BC_Three" /></intent-filter></receiver><receiver android:name="com.example.broadcastreceiverdemo.MyReceiver2" ><intent-filter><action android:name="BC_One" /></intent-filter><intent-filter android:priority="100" ><action android:name="BC_Two" /></intent-filter><intent-filter><action android:name="BC_Three" /></intent-filter></receiver>

android:priority属性可以指定广播接收的顺序,但只对有序广播有用。

最后要在Manifest文件中添加需要的权限:

    <uses-permission android:name="android.permission.BROADCAST_STICKY" />

运行结果如下:

  • 点击发送普通广播时:

    发现静态注册的两个接收器都接收到了广播,且这两条广播没有先后顺序。报错的原因是在接收器中修改了广播的内容。

  • 点击发送有序广播时:

    发现两个静态注册的接收器都接收到了广播,且第二个接收器先于第一个接收器接收到了广播。且第一个接收器接收到了第二个接收器修改过的广播内容。说明有序广播发送顺序有先后,且内容可以被修改。

  • 点击发送粘滞广播

    可以发现三个接收器都接收到了广播,且顺序没有先后。出现错误还是因为试图在接收器中修改广播的内容。

广播(Broadcast)的简单用法相关推荐

  1. 品茗论道说广播(Broadcast内部机制讲解)

    1 概述 我们在编写Android程序时,常常会用到广播(Broadcast)机制.从易用性的角度来说,使用广播是非常简单的.不过,这个不是本文关心的重点,我们希望探索得再深入一点儿.我想,许多人也不 ...

  2. B08_NumPy 广播(Broadcast)

    NumPy 广播(Broadcast) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b ...

  3. Android中的广播Broadcast详解

    今天来看一下Android中的广播机制,我们知道广播Broadcast是Android中的四大组件之一,可见他的重要性了,当然它的用途也很大的,比如一些系统的广播:电量低.开机.锁屏等一些操作都会发送 ...

  4. Android 广播(Broadcast)

    Android 广播Broadcast 1.小声嘀咕 2.广播机制简介 3.接收系统广播 3.1动态注册 3.2静态注册 4.发送自定义广播 4.1标准广播 4.2有序广播 5.使用本地广播 1.小声 ...

  5. 无线广播(Broadcast)

    无线广播(Broadcast) Description A broadcaster wants to set up a radio broadcast transmitter in an area. ...

  6. 网络层:单播unicast 组播multicast 广播broadcast

    当前的网络中有三种通讯模式:单播.广播.组播(多播),其中的组播出现时间最晚但同时具备单播和广播的优点,最具有发展前景. 一.单播unicast: 主机之间"一对一"的通讯模式,网 ...

  7. NumPy 广播(Broadcast)与pandas基础知识

    文章目录 NumPy 广播(Broadcast) 控制遍历顺序 修改数组中元素的值 使用外部循环 广播迭代 Numpy 数组操作 修改数组形状 umpy.ndarray.flat umpy.ndarr ...

  8. (链接)品茗论道说广播(Broadcast内部机制讲解)

    我们在编写Android程序时,常常会用到广播(Broadcast)机制.从易用性的角度来说,使用广播是非常简单的.不过,这个不是本文关心的重点,我们希望探索得再深入一点儿.我想,许多人也不想仅仅停留 ...

  9. 品茗论道说广播(Broadcast内部机制讲解)(上)

    品茗论道说广播(Broadcast内部机制讲解)(上) 侯 亮 1 概述 我们在编写Android程序时,常常会用到广播(Broadcast)机制.从易用性的角度来说,使用广播是非常简单的.不过,这个 ...

  10. 反编译工具jad简单用法

    反编译工具jad简单用法 下载地址: [url]http://58.251.57.206/down1?cid=B99584EFA6154A13E5C0B273C3876BD4CC8CE672& ...

最新文章

  1. Linux下防御arp***的方法
  2. Linux基本命令之vi
  3. 信号与系统:快速傅里叶变换FFT中的实际频率(奈奎斯特频率解析)
  4. 慢动作输出 Linux 命令结果并用彩色显示
  5. laravel excel迁移到lumen
  6. Makefile初步理解
  7. P2617 Dynamic Rankings
  8. PHP下获取上个月、下个月、本月的日期(strtotime,date)
  9. Javascript + Servlet的鸿沟如何抹平以构建富客户端应用?[SOS]
  10. Virtuabox 虚拟机克隆方法
  11. 论文写作过程中用到的软件、网站分享
  12. 服务器带的虚拟软驱有什么用,云服务器是干什么用的?摩杜云带你去了解!
  13. 从 flask 服务端代码自动生成客户端代码 -- flask-native-stubs 库介绍
  14. springboot 指定配置文件
  15. 【day4】【洛谷算法题】-P5708三角形面积-刷题反思集[入门1顺序结构]
  16. 浪潮HF系列闪存存储:不仅看性能,更看整体表现
  17. ubuntu桌面被删除或home文件跑到桌面问题
  18. 大数据学习之javaAPI远程操作hadoop
  19. 安装openKylin 开源操作系统 (ubuntukylin-22.04-pro-amd64.isowindows版)
  20. java video明星分类_分类: java基础 - 程序员老猫

热门文章

  1. 基于mongodb的标签系统设计
  2. 孙其功陪你学之——OJB文件介绍
  3. Pytorch版YOLOv4训练步骤(二)
  4. linux服务器 增量,CentOS 自动备份增量文件
  5. 将下列计算机中文翻译成英文,急...将计算机类英文翻译成中文
  6. 15天精读掌握《高德纳:具体数学》 第4天 2019.5.30
  7. java基础知识(day03)
  8. (英语)热门话题词汇整理 (更完)
  9. 规范互联网信息环境《互联网宗教信息服务管理办法》发布
  10. 温酒读Qt:QObject中篇1—— Q_OBJECT的隐秘角落