1  Broadcast是Android中的四大组件之一,他的用途很大,比如系统的一些广播:电量低、开机、锁屏等一些操作都会发送一个广播。

2  广播被分为两种不同的类型:“普通广播(Normalbroadcasts)”和“有序广播(Ordered broadcasts)”.普通广播是完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然后有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority)属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传A,在传给B,最后传给C,A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。

Context.sendBroadcast()

发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast()

发送的是有序广播,系统会根据接收者声明的优先级按顺序逐个执行接收者,前面的接收者有权终止广播(通过调用BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果存进广播Intent,然后传给下一个接收者。

编写以下案例:

3 编写Android清单文件

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.itheima.broadcasttest"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="19" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="com.itheima.broadcasttest.MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<receiver android:name="com.itheima.broadcasttest.Level1Receiver" >

<intent-filter android:priority="1000" >

<action android:name="com.itheima.broadcasttest.songwennuan" />

</intent-filter>

</receiver>

<receiver android:name="com.itheima.broadcasttest.Level2Receiver" >

<intent-filter android:priority="500" >

<action android:name="com.itheima.broadcasttest.songwennuan" />

</intent-filter>

</receiver>

<receiver android:name="com.itheima.broadcasttest.Level3Receiver" >

<intent-filter android:priority="100" >

<action android:name="com.itheima.broadcasttest.songwennuan" />

</intent-filter>

</receiver>

<receiver android:name="com.itheima.broadcasttest.FinalReceiver" >

<intent-filter android:priority="0" >

<action android:name="com.itheima.broadcasttest.songwennuan" />

</intent-filter>

</receiver>

</application>

</manifest>

4 编写布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity" >

<Button

android:onClick="send1"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="发送无序广播" />

<Button

android:onClick="send2"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="发送有序广播" />

</LinearLayout>

5 编写一下广播接收者

Level1Receiver

package com.itheima.broadcasttest;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

public class Level1Receiver extends BroadcastReceiver {

private static final String TAG = "Broadcasttest";

@Override

public void onReceive(Context context, Intent intent) {

String message = getResultData();

Log.i(TAG,"省级部门得到中央的消息:" + message);

abortBroadcast();  //这里是终止了消息,可以关闭或者取消这里查看LogCat中打印的效果。

setResultData("给农民兄弟发5000块钱");

}

}

Level2Receiver

package com.itheima.broadcasttest;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

public class Level2Receiver extends BroadcastReceiver {

private static final String TAG = "Broadcasttest";

@Override

public void onReceive(Context context, Intent intent) {

String message = getResultData();

Log.i(TAG,"市级部门得到省级的消息"  + message);

setResultData("给农民兄弟发2000块钱");

}

}

Level3Receiver

package com.itheima.broadcasttest;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

public class Level3Receiver extends BroadcastReceiver {

private static final String TAG = "Broadcasttest";

@Override

public void onReceive(Context context, Intent intent) {

String message = getResultData();

Log.i(TAG, "乡级部门得到市的消息:" + message);

setResultData("给农民兄弟发两大大米");

}

}

FinalReceiver

package com.itheima.broadcasttest;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

public class FinalReceiver extends BroadcastReceiver {

private static final String TAG = "Broadcasttest";

@Override

public void onReceive(Context context, Intent intent) {

String message = getResultData();

Log.i(TAG, "农民兄弟得到乡的消息:" + message);

}

}

6 MainActivity的内容如下:

package com.itheima.broadcasttest;

import android.content.Intent;

import android.os.Bundle;

import android.support.v7.app.ActionBarActivity;

import android.view.View;

public class MainActivity extends ActionBarActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

/**

* 发送无序广播

* @param view

*/

public void send1(View view) {

Intent intent = new Intent();

intent.setAction("com.itheima.broadcasttest.songwennuan");

intent.putExtra("msg", "发1万块");

//无序广播,不可被拦截,不可终止

sendBroadcast(intent);

}

public void send2(View view) {

Intent intent = new Intent();

intent.setAction("com.itheima.broadcasttest.songwennuan");

//有序广播,可被拦截,可终止,可以修改数据

sendOrderedBroadcast(intent, null,new FinalReceiver(),null,0,"给农民兄弟发10000块钱",null);

}

}

运行:

点击”发送无序广播”按钮,在LogCat中打印出的内容如下:

点击” 发送有序广播”按钮,在LogCat中打印出的内容如下:

之所以在Level1Receiver执行了abortBroadcast()后还显示下面一条,是因为指定了之中广播:

//有序广播,可被拦截,可终止,可以修改数据

sendOrderedBroadcast(intent, null,new FinalReceiver(),null,0,"给农民兄弟发10000块钱",null);

若把Level1Receiver改成如下时:

package com.itheima.broadcasttest;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

public class Level1Receiver extends BroadcastReceiver {

private static final String TAG = "Broadcasttest";

@Override

public void onReceive(Context context, Intent intent) {

String message = getResultData();

Log.i(TAG,"省级部门得到中央的消息:" + message);

//abortBroadcast();  //这里是终止了消息,可以关闭或者取消这里查看LogCat中打印的效果。

setResultData("给农民兄弟发5000块钱");

}

}

点击”发送有序广播”后显示的内容如下:

==========================================================================

关于有序广播的另外的一个案例:

1、编写第一个广播MyOrderBroadcastReciver

package com.demoorderbroadcast;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

public class MyOrderBroadcastReciver extends BroadcastReceiver {

private static final String TAG = "BroadCast";

@Override

public void onReceive(Context context, Intent intent) {

String strMsg = intent.getStringExtra("msg");

Log.i(TAG, "第一个:" + strMsg);

//通过Bundle传递参数

Bundle extras = new Bundle();

extras.putString("msg", "第一个界面传过来的" + strMsg);

setResultExtras(extras);//继续向下传

}

}

2 编写第二个广播MyOrderBroadcastReciverTwo

package com.demoorderbroadcast;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

public class MyOrderBroadcastReciverTwo extends BroadcastReceiver {

private static final String TAG = "BroadCast";

@Override

public void onReceive(Context context, Intent intent) {

//abortBroadcast();  //开启此处,可以截断广播,不让它传到third中

String strMsg = intent.getStringExtra("msg");   //获取广播的原始数据

Log.i(TAG, "第二个界面传过来的" + strMsg);

Bundle extras = new Bundle();

extras.putString("msg", "第二个界面传过来的" + strMsg);

setResultExtras(extras); //继续向下传

//"第二个:"+strMsg这是two中新的数据,传递到third中,

//在third中是用getResultData来获得setResultData("")中的数据

setResultData("第二个:" + strMsg);

}

}

3 编写第三个广播MyOrderBroadcastReciverThird

package com.demoorderbroadcast;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

public class MyOrderBroadcastReciverThird extends BroadcastReceiver {

private static final String TAG = "BroadCast";

@Override

public void onReceive(Context context, Intent intent) {

//获得two中setResultData中的数据

String resultData = getResultData();

//获取two中setResultExtras中的数据

Bundle bundle = getResultExtras(true);

//获取广播的原始数据

String bundleData = bundle.getString("msg");

//获取广播的原始数据

String strMsg = intent.getStringExtra("msg");

Log.i(TAG, "第三个:" + strMsg);

Log.i(TAG,"two中传递到third新的数据:" + resultData);

Log.i(TAG, "two中setResultExtras(extras)传到third新的数据:" + bundleData);

}

}

4 编写MainActivity,代码如下:

package com.demoorderbroadcast;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class MainActivity extends Activity {

private Button btnSendOrderBroadCast;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

private void initView() {

btnSendOrderBroadCast = (Button) this.findViewById(R.id.btn);

btnSendOrderBroadCast.setOnClickListener(new MyOnclickListener());

}

private class MyOnclickListener implements OnClickListener {

public void onClick(View v) {

if (btnSendOrderBroadCast==v) {

sendOrderBroadCast();

}

}

}

public void sendOrderBroadCast() {

Intent intent = new Intent("com.pzf.mybroadcast");

intent.putExtra("msg", "toto ni hao");

sendOrderedBroadcast(intent, "com.pzf.permission");

}

}

5 编写Android的清单文件AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.demoorderbroadcast"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="19" />

<permission android:name="com.pzf.permission" android:protectionLevel="normal"></permission>

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

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="com.demoorderbroadcast.MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<receiver android:name="com.demoorderbroadcast.MyOrderBroadcastReciver">

<intent-filter android:priority="1000">

<action android:name="com.pzf.mybroadcast"></action>

</intent-filter>

</receiver>

<receiver android:name="com.demoorderbroadcast.MyOrderBroadcastReciverTwo">

<intent-filter android:priority="900">

<action android:name="com.pzf.mybroadcast"></action>

</intent-filter>

</receiver>

<receiver android:name="com.demoorderbroadcast.MyOrderBroadcastReciverThird">

<intent-filter android:priority="800">

<action android:name="com.pzf.mybroadcast"></action>

</intent-filter>

</receiver>

</application>

</manifest>

当点击“发送有序广播”时,LogCat中打印的内容如下:

17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限相关推荐

  1. Vue中的情侣属性$dispatch和$broadcast详解

    $dispatch 和 $broadcast 作为一对情侣 ?属性,在 Vue 1.0 中主要用来实现基于组件树结构的事件流通信 -- 通过向上或向下以冒泡的形式传递事件流,以实现嵌套父子组件的通信. ...

  2. Oracle中CONCAT详解

    Oracle中CONCAT详解 1.什么是CONCAT 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写 ...

  3. 函数中{}输出格式详解(C#)

    Console.WriteLine()函数中{}输出格式详解(C#) Console.WriteLine()函数的格式一直没怎么注意.今天同事问起Console.WriteLine({0:D3},a) ...

  4. Java中CAS详解

    转载自  Java中CAS详解 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换 ...

  5. 【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵

    转自:图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵_sherlockreal的博客-CSDN博客_视角矩阵 图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵 图形流水线中坐标变换过程 ...

  6. oracle itl解析,oracle数据块dump文件中ITL详解

    oracle数据块dump文件中ITL详解 dump出Oracle block后,可以看到事物槽,包含有事物槽号(ITL),XID,UBA,FLAG,LCK,SCN. 本文主要讨论FLAG标记的规则, ...

  7. android中getSystemService详解

    原文地址:android中getSystemService详解作者:邹斌 http://blog.sina.com.cn/s/blog_71d1e4fc0100o8qr.html http://blo ...

  8. Java中LinkedList详解

    Java中LinkedList详解 LinkedList底层是双向链表 单向链表 双向链表 LinkedList新增的方法 主要增加了针对头结点与尾结点进行操作的方法, 即针对第一个元素和最后一个元素 ...

  9. vue 生命周期的11中方法详解

    vue 生命周期的十一中方法详解 vue 生命周期的定义 vue实例 从创建到销毁,也就是说从创建 -> 初始化 数据-> 编译模版 -> 挂载Dom -> 渲染 更新 -&g ...

最新文章

  1. illustrator下载_平面设计:16个Illustrator快捷方式可加快工作流程
  2. Java Finalizer和Java文件输入/输出流
  3. 熟悉c语言运行环境实验原理,c语言实验报告1
  4. MyEclipse中的ant初识
  5. android向web提交数据,中文乱码
  6. 你不知道的JS(原型)
  7. 青春是一场永志的劫数
  8. named-config with name ‘c3p0-config.xml‘ does not exist. Using default-config
  9. 计算机u启动无法识别,电脑不识别u盘启动盘
  10. 分享我是如何找房东直租省中介费 租房 找房 直租 经验
  11. linux查看主机配置命令,如何查看Linux 硬件配置信息
  12. java做的桌面应用_把一个java web应用包装成桌面应用的简单做法
  13. 安装SSL证书可以解决浏览器提示的不安全警告
  14. 好多粉数据上报之卧龙搜索ocpc API上报数据
  15. Python 3 条件判断和循环语句,list、tuple、dict、set容器,部分函数
  16. 笔记本电脑外接屏幕步骤
  17. lambda表达式和Stream
  18. Mas短信开发增值服务平台建设
  19. 一加3t刷机后还卡_一加3T变砖之后如何自救?一加3T线刷救砖教程详解
  20. JAVA基础之移位操作

热门文章

  1. Comparator 与 Comparable
  2. boost::qvm::deduce_scalar相关的测试程序
  3. boost::mp11::mp_transform_front相关用法的测试程序
  4. boost::fusion::vector用法的测试程序
  5. boost::sloan_ordering用法的测试程序
  6. boost::graph模块实现读写graphviz的测试程序
  7. boost::geometry::model::multi_polygon用法的测试程序
  8. boost::fusion::filter_if用法的测试程序
  9. GDCM:gdcm::Version的测试程序
  10. boost::callable_traits的remove_member_cv_t的测试程序