BroadCastRecieve
首先介绍一下BroadCastRecieve有几种:
1.无序广播(普通广播):sendBroadcast()方式
2.有序广播:sendOrderedBroadcast()方式
3.粘性广播:sendStickyBroadcast()方式
生命周期比较简单:

下面是无序广播与有序广播的区别:




下面是普通广播(无序广播,有序广播)与粘性广播的区别:
sendBroadcast(intent); 发送之前必须注册广播,否则无法接收到广播信息。
sendStickyBroadcast(intent);发送广播后,注册也可收到广播信息。
首先看下一个无序广播,有序广播的例子:
package com.example.demo_broadcast2; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View; public class MainActivity extends Activity { @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万块");
intent.putExtra("isUnordered", true);
// 无序广播,不可被拦截,不可终止
sendBroadcast(intent);
} public void send2(View view) {
Intent intent = new Intent();
intent.setAction("com.itheima.broadcasttest.songwennuan");
// 有序广播,可被拦截,可终止,可以修改数据
sendOrderedBroadcast(intent, null, null, null, 0,
"给农民兄弟发10000块钱", null);
}
}
send1,send2分别为点击事件触发时调用的函数分别为发送无序广播按钮,发送有序广播按钮。
activity_main.xml文件
<RelativeLayout 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"
tools:context=".MainActivity" > <Button
android:onClick="send1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="发送无序广播" /> <Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="51dp"
android:onClick="send2"
android:text="发送有序广播" /> </RelativeLayout>
下面依次是多个广播的实例(为了体现有序广播)
package com.example.demo_broadcast2; 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) {
boolean isUnordered = intent.getBooleanExtra("isUnordered", false);
if (isUnordered) {
String message = intent.getStringExtra("msg");
Log.i(TAG, "省级部门得到中央的消息:" + message);
} else {
String message = getResultData();
Log.i(TAG, "省级部门得到中央的消息:" + message);
abortBroadcast(); // 这里是终止了消息,可以关闭或者取消这里查看LogCat中打印的效果。
setResultData("给农民兄弟发5000块钱"); // setResultData()方法,就是为了在有序广播中修改传到下一个广播中的值而存在的,且只能存储一个String.
} } }
package com.example.demo_broadcast2; 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) {
boolean isUnordered = intent.getBooleanExtra("isUnordered", false);
if (isUnordered) {
String message = intent.getStringExtra("msg");
Log.i(TAG, "市级部门得到省级的消息" + message);
} else {
String message = getResultData();
Log.i(TAG, "市级部门得到省级的消息" + message);
setResultData("给农民兄弟发2000块钱");
} }
}
package com.example.demo_broadcast2; 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) {
boolean isUnordered = intent.getBooleanExtra("isUnordered", false);
if (isUnordered) {
String message = intent.getStringExtra("msg");
Log.i(TAG, "乡级部门得到市的消息:" + message);
} else {
String message = getResultData();
Log.i(TAG, "乡级部门得到市的消息:" + message);
setResultData("给农民兄弟发两大大米");
}
} }
package com.example.demo_broadcast2; 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) {
boolean isUnordered = intent.getBooleanExtra("isUnordered", false);
if (isUnordered) {
String message = intent.getStringExtra("msg");
Log.i(TAG, "农民兄弟得到乡的消息:" + message);
} else {
String message = getResultData();
Log.i(TAG, "农民兄弟得到乡的消息:" + message);
} }
}
首先我么线设置一下logcat如下:

接下来我们看一下效果:
当我们点击“发送无序广播”的时候效果如下:
可见只要我们发送一个广播,注册此广播的都会搜到相同的信息。

当我们点击“发送有序广播”的时候效果如下:
我们在Level1Receiver 中调用了一下方法截断了消息传输到下一个广播接收者。
abortBroadcast(); // 这里是终止了消息

如果我们把下面函数注释掉。
//abortBroadcast();
可见效果每个接收者接收到的数据都不一样这是因为我们通过一下函数向下发送了消息:
setResultData("给农民兄弟发2000块钱");

可见这是有顺序的,顺序是由广播接收者定义时可以设置优先级。代码可参考androidManifast.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.demo_broadcast2"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.demo_broadcast2.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=".Level1Receiver" >
<intent-filter android:priority="1000" >
<action android:name="com.itheima.broadcasttest.songwennuan" />
</intent-filter>
</receiver>
<receiver android:name=".Level2Receiver" >
<intent-filter android:priority="500" >
<action android:name="com.itheima.broadcasttest.songwennuan" />
</intent-filter>
</receiver>
<receiver android:name=".Level3Receiver" >
<intent-filter android:priority="100" >
<action android:name="com.itheima.broadcasttest.songwennuan" />
</intent-filter>
</receiver>
<receiver android:name=".FinalReceiver" >
<intent-filter android:priority="-100" >
<action android:name="com.itheima.broadcasttest.songwennuan" />
</intent-filter>
</receiver>
</application> </manifest>
还有一点我们要注意的是如果通过下面方法中指定final接收者时:
sendOrderedBroadcast(intent, null, new finalReceiver(), null, 0,"给农民兄弟发10000块钱", null);
同时调用 abortBroadcast(); // 这里是终止了消息
此时的效果如下:

也就是说发送有序广播时可以指定一个final接收者来充当无序广播,即不管是中间截断了消息传递只要定义了final接收者那么久可以收到传递下来的消息。
接下来我么看一下粘性广播与普通广播有什么区别代码如下:
package com.example.demo_stickybroadcast; import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; /*
* sendBroadcast(intent); 发送之前必须注册广播,否则无法接收到广播信息。
* sendStickyBroadcast(intent);发送广播后,注册也可收到广播信息。
*/
public class MainActivity extends Activity {
Button btnSendi;
Button btnSends;
Button btnStart;
Context mContext; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSendi = (Button) findViewById(R.id.broadcast);
btnSends = (Button) findViewById(R.id.stickybroadcast);
btnStart = (Button) findViewById(R.id.next_activity);
mContext = getApplicationContext();
btnSendi.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(); intent.setAction("com.android.my.action"); //指定意图Action
mContext.sendBroadcast(intent); //普通广播发送
} }); btnStart.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this,
ReceiverActivity.class);
startActivity(intent); //跳转到ReceiverActivity
} }); btnSends.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction("com.android.my.action.sticky");//指定意图Action
mContext.sendStickyBroadcast(intent);//sticky广播发送
} });
}
}
package com.example.demo_stickybroadcast; import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.TextView; public class ReceiverActivity extends Activity {
private IntentFilter mIntentFilter;
private TextView text; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
text = (TextView) findViewById(R.id.context);
mIntentFilter = new IntentFilter(); //初始化intent过滤器
//添加action
mIntentFilter.addAction("com.android.my.action");
mIntentFilter.addAction("com.android.my.action.sticky"); } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
text.setText("action: " + action); }
}; @Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
registerReceiver(mReceiver, mIntentFilter); //註冊廣播
} @Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
unregisterReceiver(mReceiver); //註銷廣播
} }
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.demo_stickybroadcast"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.demo_stickybroadcast.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>
<activity android:name="com.example.demo_stickybroadcast.ReceiverActivity" >
</activity>
</application> </manifest>
运行应用后可以操作一下步骤:
1.点击“sendbroadcast”
2.点击进入“StartAcitivity”
此时你会发现没有显示任何信息这说明,在ReceiverActivity中注册的广播没有收到任何信息。
这是因为普通广播发送以后即通过sendbroadcast() 或 sendOrderedbroadcast(),只有已经注册相应的广播的接受者可以接到信息,而后注册此广播的广播接收者是无法接受到的。
也就是说要接收普通广播发出的广播时,需发送广播之前先注册相应的广播。
而当你操作一下步骤时:
1.点击“sendStickybroadcast”
2.点击进入“StartAcitivity”
你会发现广播发送出去以后注册此广播的广播接收者是可以收到此消息的。
BroadCastRecieve的更多相关文章
随机推荐
- Django笔记 —— 模板高级进阶
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- React获取数据,假如为数组,使用map出现的问题
在平时做项目的时候,使用到了redux, 如果获取服务器端的数据,例如返回一个 data = [1,2,3,4]data.map(item => item*2) , 这样使用的话如果数据正常获 ...
- P2384洛谷 最短路
题目描述 给定n个点的带权有向图,求从1到n的路径中边权之积最小的简单路径. 输入输出格式 输入格式: 第一行读入两个整数n,m,表示共n个点m条边. 接下来m行,每行三个正整数x,y,z,表示点x到 ...
- 关于缺失值(missing value)的处理---机器学习 Imputer
关于缺失值(missing value)的处理 在sklearn的preprocessing包中包含了对数据集中缺失值的处理,主要是应用Imputer类进行处理. 首先需要说明的是,numpy的数组中 ...
- cartographer 安装修改
装置:VLP16+IMU+单板机 目的:利用传感器数据,实现real time 的建模 结果:失败,但之前的步骤都正常,出问题的地方可能是imu出错. 稍后附上 launch文件,lua文件,urdf ...
- 预研报告——MyBatis持久层的demo
一.预研任务介绍和预研目标 任务介绍: 与 Hibernate 相比, MyBatis 是一个半自动化的持久层框架,以轻量级.效率高.原生代而好评如潮.虽然有在分享会上大致讲解,但是还是重新梳理成文字 ...
- HDU 4782 Beautiful Soup (模拟+注意细节)
思路就是用栈模拟,不用开实体的栈,直接记一个top指针就行. 说说这题的细节: 1.tag标签里的内容不要动,原样输出.比如<p aa bb cc>,就这样输出就行,不要删空格.题目中说了 ...
- [转]Linux UDP严重丢包问题的解决
测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈B ...
- POI 导入 一直报400问题
排查过程:1.400一般都是参数或者请求不对,但是我这个情况是本地好用,只是服务器有问题,所以排除了传值的格式等问题. 2.服务器和本地网络隔离,所以没办法比较代码,分两次全量覆盖了html和js部分 ...
- gdb调试行号错位
http://blog.csdn.net/wangxmin2005/article/details/8128192 gdb调试过程中出现行号错位的情况,原因一般有两个: 1. 编译器的优化可能把某些语 ...