一.两种广播类型

2.1 标准广播

  是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法截断的。

2.2 有序广播

  是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所有此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息了,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。

二.示例代码

2.1、发送标准广播

  新建一个MyBroadcastReceiver继承自BroadcastReceiver,代码如下所示:

package com.nyl.custombroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast; public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show();
}
}

  然后AndroidManifest.xml中注册下,写上Intent-filter:

  

  定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:

package com.nyl.custombroadcast;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener { private Button btnSendBroadcast; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSendBroadcast = (Button) findViewById(R.id.btnSendBroadcast);
btnSendBroadcast.setOnClickListener(this);
} @Override
public void onClick(View view) {
/**
* 构建出一个Intent对象,并把要发送的广播的值传入,然后调用了Context的sendBroadcast()方法将广播发送出去
* 这样所有监听com.nyl.custombroadcast.MyBroadcastReceiver这条广播的广播接收器就会收到消息。
*/
Intent intent = new Intent("com.nyl.custombroadcast.MyBroadcastReceiver");
sendBroadcast(intent);
}
}

  运行程序,点击一下发送广播按钮,效果如下图:

  

  这样我们就成功完成了发送自定义广播的功能了。

2.2、发送有序广播

  接收者通过Bundle bundle = new getResultExtras(true)可以获取上一个接收者存入的数据,定义了两个AnotherBroadcastReceiver类,如下所示:

package com.nyl.orderlybroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast; public class AnotherBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show();
//创建一个Bundle对象,并存入数据
Bundle bundle = new Bundle();
bundle.putString("first","有序广播");
//将bundle放入结果中
setResultExtras(bundle);
//取消Broadcast的继续发送,也就是将广播截断,不再发给下一个广播接收器
abortBroadcast();
}
}
package com.nyl.orderlybroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast; public class AnotherBroadcastReceiver1 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = getResultExtras(true);
//解析前一个BroadcastReceiver所存入的key为first的消息
String first = bundle.getString("first");
Toast.makeText(context,"第一个广播存入的消息为:" + first,Toast.LENGTH_SHORT).show();
}
}

  在AndroidManifest.xml中对该AnotherBroadcastReceiver进行注册,添加开机广播的intent-filter,然后android:priority属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。如下图所示:

  

  还是跟发送标准的一样,定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:

package com.nyl.orderlybroadcast;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener { private Button btnOrderlyBroadcast; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOrderlyBroadcast = (Button) findViewById(R.id.btnOrderlyBroadcast);
btnOrderlyBroadcast.setOnClickListener(this);
} @Override
public void onClick(View view) {
Intent intent = new Intent("com.nyl.orderlybroadcast.AnotherBroadcastReceiver");
/**
* sendOrderedBroadcast()方法接收两个参数:第一个参数是intent
* 第二个是一个与权限相关的字符串,这里传入null就行了
*/
sendOrderedBroadcast(intent,null);
}
}

  注:如果把AnotherBroadcastReceiver的abortBroadcast()这个方法注释掉,那么AnotherBroadcastReceiver1也会收到广播,按照配置的接收优先级顺序,AnotherBroadcastReceiver会先接收到,然后才到AnotherBroadcastReceiver1,效果如下图:     

       

  关于广播的内容介绍就这么多,内容有写得不对的地方,欢迎广大园友指正!

Android学习总结(六)———— 发送自定义广播的更多相关文章

  1. MIUI7,Android版本5.0.2,一个程序发送自定义广播,另一个程序没有接收到

    对照<第一行代码——Android>进行学习,第五章中说到广播包的相关知识,前面获取广播等程序例程都可以跑的通,但是在5.3.2节中,程序A发送自定义广播,并接收自定义广播,同时程序B也接 ...

  2. android 发送自定义广播以及接收自定义广播

    发送自定义广播程序: 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  3. android: 发送自定义广播

    5.3.1    发送标准广播 在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发 出去也是白发.因此新建一个 MyBroadcastReceiver 继承自 Broadca ...

  4. android#boardcast#发送自定义广播

    广播主要分为两种类型,标准广播和有序广播,通过实践的方式来看下这两种广播具体的区别. 一.发送标准广播 在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发出去也是白发.因此新 ...

  5. Android 发送自定义广播(标准和本地)

    1.首先自定义一个广播接收器:MyBroadcastReceiver package example.com.mybroadcastreceiver; import android.content.B ...

  6. 【Android】完善Android学习(六:API 4.0)

    备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...

  7. Android学习笔记--Broadcast, BroadcastReceiver(广播)

    参考资料:http://www.cnblogs.com/playing/archive/2011/03/23/1992030.html 在 Android 中使用 Activity, Service, ...

  8. Android学习笔记(十三)——广播机制

     //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容 ...

  9. android 学习随笔十八(广播与服务 )

    1.广播接收者注册 清单文件注册(Android四大组件都要在清单文件中注册) 一旦应用部署,广播接收者就生效了,直到用户手动停止应用或者应用被删除 广播接收者可以使用代码注册 需要广播接收者运行时, ...

随机推荐

  1. bzoj1195

    AC自动机+状压dp 多串匹配要想ac自动机 dp[i][S]表示在i状态选中S 转移就用bfs,每个点通过fail收集信息,不要忘记通过fail传递 昨天搞不明白为什么自动机每次只可以转移儿子,不可 ...

  2. sublime 设置像IDE一样的 ctrl+鼠标左键 跳转到定义方法

    鼠标点击菜单栏的Preferences,选择Browse Packages ,进入文件加之后,选择User 点击进入User,在User里面添加文件名为 Default (Windows).subli ...

  3. js事件触发器fireEvent和dispatchEvent

    转自:https://www.cnblogs.com/tiger95/p/6962059.html 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome, ...

  4. JAVA 反射机制 获得 private 变量

    public class Triangle { // 定义三角形的三边 protected long lborderA = 0; protected long lborderB = 0; protec ...

  5. c#中 这种构造方法Recer(…):this(…){ }

    指的是构造函数首先调用另外一个构造函数. class Program { static void Main(string[] args) { Person p2 = new Person(" ...

  6. MonogoDb的角色分类

    引用:  http://blog.csdn.net/kk185800961/article/details/45619863 https://docs.mongodb.org/manual/refer ...

  7. hdu1850(nim博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1850 题意:中文题诶- 思路:nim博弈 可以将本题抽象成一般nim博弈,那么有: 1. 对于所有元素 ...

  8. Ubuntu终端查看系统时间,以及日历

    时间:  date 日历: cal https://blog.csdn.net/zhengchaooo/article/details/79500032 修改时区以及时间 查看时区 date -R 修 ...

  9. C - Catch That Cow POJ - 3278

    //标准bfs #include <iostream> #include <cstdio> #include <algorithm> #include <cm ...

  10. shell学习(7)- linux权限管理及修改权限命令chmod

    文件系统权限基本介绍 1.文件基本权限 总共10个字符,可以分为四组, 第一组,就一个字符-,代表是文件类型,是一个常规文件,还有其他的类型如下所示 d--目录 l--符号链接,软连接 c--字符专门 ...