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

??

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中打印的内容如下:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 21:29:51

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

Android中Context详解 ---- 你所不知道的Context

转载至 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context

Android中Context详解 ---- 你所不知道的Context (转载)

Android中Context详解 ---- 你所不知道的Context (转载) http://blog.csdn.net/qinjuning 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context的原理.类结构关系.一个简单的问题是,一个应用

Android中Context详解 ---- 你所不知道的Context(转)

Android中Context详解 ---- 你所不知道的Context(转)                                              本文出处 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打

MySQL中EXPLAIN详解

MySQL中EXPLAIN详解 explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如:explain select username,first_name form hx,itlearner where a.id=b.id EXPLAIN列的解释: id:本次 select 的标识符.在查询中每个 select都有一个顺序的数值. select_type :查询类

Python中dict详解

yangyzh Python中dict详解 python3.0以上,print函数应为print(),不存在dict.iteritems()这个函数. 在python中写中文注释会报错,这时只要在头部加上# coding=gbk即可 #字典的添加.删除.修改操作dict = {"a" : "apple", "b" : "banana", "g" : "grape", "o&qu

winxp计算机管理中服务详解

winxp计算机管理中服务详解01 http://blog.sina.com.cn/s/blog_60f923b50100efy9.html http://blog.sina.com.cn/s/blog_b08c76100102vijm.html winxp计算机管理中服务详解02 http://blog.sina.com.cn/s/blog_60f923b50100efz3.html http://blog.sina.com.cn/s/blog_b08c76100102vijn.html

【转】 java中HashMap详解

原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类.虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 H

转:iOS中socket详解

一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络

Linux系统中目录详解

1.Linux文件系统的层次结构 在Linux或Unix操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构. 文件系统的最顶层是由根目录开始的,系统使用"/"来表示根目录.在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件.如此反复就可以构成一个庞大的文件系统. 在Linux文件系统中有两个特殊的目录,一个用户所在的工作目录,也叫当前目录,可以使用一个点"."来表示:另一个是当前目录的上一级目录,也叫父目录,可以使用两个