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,然后传给下一个接收者。

编写以下案例:

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

3 编写Android清单文件

<?xml 块钱");

}

}

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);

}

}

运行:

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

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

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

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

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

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

//块钱");

}

}

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

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

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

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

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

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传递参数,传递参数的时候指定权限

上一篇:hadoop HA分布式集群搭建


下一篇:Appium-001-测试开发环境搭建(Android - Win7)