Android四大组件中的BroadcastReceiver用于接受程序(包括用户开发的程序和系统内建的程序)所发出的Broadcast Intent,与应用程序启动Activity,Service相同的是
程序启动BroadcastReceiver也只需要两步
一:创建需要启动的服务的意图 BroadcastReceiver 的Intent
二:调用Content的sendBroadcast()或seendOrderedBroadcast()方法来启动指定的BroadcastReceiver
当应用程序发出一个Broadcast Intent之后,所以匹配该Intent的BroadcastReceiver都有可能被启动
与Activity,Service具有完整的生命周期不同,BroadcastReceiver本质上只是一个系统级的监听——它是专门负责监听各程序发出的Broadcast 广播
下面代码
创建继承BroadcastReceiver的类
1import android.content.BroadcastReceiver;
2import android.content.Context;
3import android.content.Intent;
4import android.os.Binder;
5import android.os.Bundle;
6import android.widget.Toast;
78/**
9* Created by YacaToy on 2017/6/25.
10*/
1112public class MyBroadcastReceiver extends BroadcastReceiver {
13
14public void onReceive(Context context, Intent intent) {
15Toast.makeText(context,intent.getAction()+"/------/"+intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
16}
17}
代码注册广播监听
1
IntentFilter filter = new IntentFilter("com.yacatoy.mydata.TEST_BROAD");
2
MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
3
registerReceiver(myBroadcastReceiver,filter);
清单文件注册
1
<receiver android:name=".MyBroadcastReceiver">
2
<intent-filter android:priority="20">
3
<action android:name="com.yacatoy.mydata.TEST_BROAD"></action>
4
</intent-filter>
5
</receiver>
启动
1
bt_send.setOnClickListener(new View.OnClickListener() {
2
3
public void onClick(View v) {
4
Intent intent =new Intent();
5
intent.setAction("com.yacatoy.mydata.TEST_BROAD");
6
intent.putExtra("msg","放出的数据");
7
sendBroadcast(intent); //有序广播
8
// sendOrderedBroadcast(intent,null);
9
}
10
});
这里主要下
Bundle 广播出来的类型
上面介绍的有序广播。下面来说说无序广播
广播被分为两种不同的类型:“无序广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。
普通广播是完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高,
但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;
然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,
数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),
被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。
A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。
(从其他地方扒的
http://blog.csdn.net/jiangwei0910410003/article/details/19150705)
广播大小级别的设置
1
<receiver android:name=".MyBroadcastReceiver">
2
<intent-filter android:priority="20"> <!-- 大-->
3
<action android:name="com.yacatoy.mydata.TEST_BROAD"></action>
4
5
</intent-filter>
6
7
</receiver>
8
9
<receiver android:name=".MyBroadcastreciverTow">
10
<intent-filter android:priority="0"> <!--小-->
11
<action android:name="com.yacatoy.mydata.TEST_BROAD"></action>
12
</intent-filter>
13
</receiver>
用sendBroadcast是无序广播
用sendOrderendBroadcast是有序广播
下面代码
级别为20的广播接受者
1
import android.content.BroadcastReceiver;
2
import android.content.Context;
3
import android.content.Intent;
4
import android.os.Binder;
5
import android.os.Bundle;
6
import android.widget.Toast;
7
8
/**
9
* Created by YacaToy on 2017/6/25.
10
*/
11
12
public class MyBroadcastReceiver extends BroadcastReceiver {
13
14
public void onReceive(Context context, Intent intent) {
15
Toast.makeText(context,intent.getAction()+"/------/"+intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
16
17
Bundle bundle = new Bundle();
18
bundle.putString("first","hahahhahahhah");
19
setResultExtras(bundle);
20
}
21
}
22
级别为0的广播接受者
1
2
import android.content.BroadcastReceiver;
3
import android.content.Context;
4
import android.content.Intent;
5
import android.os.Bundle;
6
import android.widget.Button;
7
import android.widget.Toast;
8
9
/**
10
* Created by YacaToy on 2017/6/25.
11
*/
12
13
public class MyBroadcastreciverTow extends BroadcastReceiver {
14
15
public void onReceive(Context context, Intent intent) {
16
Bundle bundle = getResultExtras(true);
17
18
Toast.makeText(context,bundle.getString("first"),Toast.LENGTH_SHORT).show();
19
}
20
}
点击事件
1
bt_send.setOnClickListener(new View.OnClickListener() {
2
3
public void onClick(View v) {
4
Intent intent =new Intent();
5
intent.setAction("com.yacatoy.mydata.TEST_BROAD");
6
intent.putExtra("msg","放出的数据");
7
// sendBroadcast(intent);
8
sendOrderedBroadcast(intent,null);
9
}
10
});
级别为20的广播介绍着接受了发出来的广播,而且向处理结果中存入了key为frist的消息,可以被级别为0的广播接受者解析出来
原Intent带来的数据还在
下面我在其他博客中找到一些笔记,我又扒下来了
有序广播特点:
1.所有广播接收者的action是一致的,发送有序广播调用 sendOrderedBroadcast()方法。
2.有序广播的接收者需要调用setPriority()方法设置广播接收者的优先级。数字越大,优先接受广播。
3.有序广播如果需要终止 广播继续往下发送,可以调用 abortBroadcast()方法切断广播。
4.先接收广播者可以将自己的处理结果通过setResultExtras()方法继续传递给下一个广播接收者。
5.后接收者可以调用 getResultExtras(true)来自己决定是否接收上一个广播传递过来的数据
粘性广播
发送广播调用的方法 sendStickyBroadcast(Intent),和sendBroadcast(Intent)不同。
粘性广播会一直保留在内存当中,直到有广播接收者注册该广播,该广播才算结束。
1.权限
2.粘性广播发送除了调用方法不同sendStickyBroadcast(intent1),其他都一样。
3.一般广播都是先注册广播,才能接收到广播,而粘性广播可以做到先发送广播,哪里需要接收该广播就哪里注册,可以后注册广播拿到广播的结果。这就是 普通广播和粘性广播的区别。
在Android系统源码中监测电池电量部分使用到了。
1.所有广播接收者的action是一致的,发送有序广播调用 sendOrderedBroadcast()方法。
2.有序广播的接收者需要调用setPriority()方法设置广播接收者的优先级。数字越大,优先接受广播。
3.有序广播如果需要终止 广播继续往下发送,可以调用 abortBroadcast()方法切断广播。
4.先接收广播者可以将自己的处理结果通过setResultExtras()方法继续传递给下一个广播接收者。
5.后接收者可以调用 getResultExtras(true)来自己决定是否接收上一个广播传递过来的数据
粘性广播
发送广播调用的方法 sendStickyBroadcast(Intent),和sendBroadcast(Intent)不同。
粘性广播会一直保留在内存当中,直到有广播接收者注册该广播,该广播才算结束。
1.权限
1
|
<
uses-permission
android:name="android.permission.BROADCAST_STICKY"></
uses-permission
>
|
2.粘性广播发送除了调用方法不同sendStickyBroadcast(intent1),其他都一样。
3.一般广播都是先注册广播,才能接收到广播,而粘性广播可以做到先发送广播,哪里需要接收该广播就哪里注册,可以后注册广播拿到广播的结果。这就是 普通广播和粘性广播的区别。
在Android系统源码中监测电池电量部分使用到了。
// Register for the battery changed event
IntentFilter filter =
new
IntentFilter(Intent.ACTION_BATTERY_CHANGED);
/ Intent is sticky so using
null
as receiver works fine
// return value contains the status
Intent batteryStatus =
this
.registerReceiver(
null
, filter);
// Are we charging / charged?
int
status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -
1
);
boolean
isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING
|| status == BatteryManager.BATTERY_STATUS_FULL;
boolean
isFull = status == BatteryManager.BATTERY_STATUS_FULL;
// How are we charging?
int
chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -
1
);
boolean
usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean
acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
广播的基础就介绍在这里了。Android系统应用有很多广播,大伙初学的话,都是这写一下