Broadcast 是 Android 四大组件之一,是一种广泛运用在应用程序之间异步传输信息的机制。Broadcast 本质上是一个Intent 对象,差别在于 Broadcast 可以被多个 BroadcastReceiver 处理。BroadcastReceiver 是一个全局监听器,通过它的 onReceive() 可以过滤用户想要的广播,进而进行其它操作。通过本章学习可以掌握Broadcast 以下知识点。
欢迎关注微信公众号:程序员Android
公众号ID:ProgramAndroid
获取更多信息
微信公众号:ProgramAndroid
我们不是牛逼的程序员,我们只是程序开发中的垫脚石。
我们不发送红包,我们只是红包的搬运工。
1.广播的生命周期
2.四大组件之一,必须在Androidmainfest.xml中注册
3.广播的注册(静态广播、动态广播)
4.广播的发送(正常、有序、持续)
5.广播接收(系统广播、自定义广播)
Broadcast 继承关系如下:
java.lang.Object
↳ android.content.BroadcastReceiver
1. 广播的生命周期
BroadcastReceiver 的主要声明周期方法onReceiver(),此方法执行完之后,BroadcastReceiver 实例将被销毁。广播默认是在主线程中执行,如果onReceiver() 方法处理事件超过10s,则应用将会发生ANR(Application Not Responding),此时,如果建立工作线程并不能解决此问题,因此建议:如处理耗时操作,请用 Service 代替。
2.四大组件之一,必须在Androidmainfest.xml中注册
<receiver
android:name="ReceiverMethod"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="String....." />
</intent-filter>
</receiver>
如不注册,将导致无法接收处理广播消息
3.广播的注册(静态注册、动态注册)
1.静态注册
<receiver>...</receiver>
一些系统发送的广播需要在Androidmainfest.xml 中静态注册,例如 开机广播,apk状态改变广播,电量状态改变广播等
// 1.开机广播为例 ,此广播特殊,需要添加权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
//静态注册广播的方法
<receiver
android:name=".component.BroadcastReceiver.BootReceiverMethod"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
2.动态注册广播
registerReceiver(mBroadcastReceiver, mIntentFilter);
例如:动态注册 监听灭屏、点亮屏幕的广播
public class ScreenOnOffReceiver {
public static void ReceiverScreenOnOff(Context context) {
IntentFilter screenOffFilter = new IntentFilter();
screenOffFilter.addAction(Intent.ACTION_SCREEN_OFF);
screenOffFilter.addAction(Intent.ACTION_SCREEN_ON);
BroadcastReceiver mScreenOnOffReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
Toast.makeText(context, "接收屏幕熄灭广播", Toast.LENGTH_SHORT).show();
}
if (action.equals(Intent.ACTION_SCREEN_ON)) {
Toast.makeText(context, "接收屏幕点亮广播", Toast.LENGTH_SHORT).show();
}
}
};
/**
* context.getApplicationContext()
* 在广播中注册广播时候需要注意,防止context 为空 ,引起空指针异常
* **/
// 2.动态注册广播的方法
context.registerReceiver(mScreenOnOffReceiver, screenOffFilter);
}
}
4.广播的发送(无序、有序、持续)
1.发送无序广播的方法
sendBroadcast(intent);
- 例如:发送自定义广播
Intent customIntent=new Intent();
customIntent.setAction("SendCustomBroadcast");
sendBroadcast(customIntent);
- 接收自定义广播的方法
public class CustomBroadcast extends BroadcastReceiver {
public CustomBroadcast() {
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("SendCustomBroadcast")){
Toast.makeText(context,"自定义广播接收成功:Action:SendCustomBroadcast",Toast.LENGTH_SHORT).show();
}
}
}
注意自定义广播是在Androidmanfest.xml 中静态注册的。
2.发送有序广播
sendOrderedBroadcast(intent,"str_receiver_permission");
- 例如:发送自定义有序广播
Intent customOrderIntent=new Intent();
customOrderIntent.setAction("SendCustomOrderBroadcast");
customOrderIntent.putExtra("str_order_broadcast","老板说:公司每人发 10 个 月饼");
sendOrderedBroadcast(customOrderIntent,"android.permission.ORDERBROADCAST");
- 有序广播静态注册
<receiver
android:name=".component.BroadcastReceiver.CustomHightBrodcast"
android:enabled="true"
android:exported="true"
>
<intent-filter android:priority="1000">
<action android:name="SendCustomOrderBroadcast" />
</intent-filter>
</receiver>
<receiver
android:name=".component.BroadcastReceiver.CustomMiddleBroadcast"
android:enabled="true"
android:exported="true"
>
<intent-filter android:priority="500">
<action android:name="SendCustomOrderBroadcast" />
</intent-filter>
</receiver>
<receiver
android:name=".component.BroadcastReceiver.CustomLowerBroadcast"
android:enabled="true"
android:exported="true"
>
<intent-filter android:priority="100">
<action android:name="SendCustomOrderBroadcast" />
</intent-filter>
</receiver>
- 高优先级广播优先处理
public class CustomHightBrodcast extends BroadcastReceiver {
public CustomHightBrodcast() {
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("SendCustomOrderBroadcast")) {
Toast.makeText(context, intent.getStringExtra("str_order_broadcast"), Toast.LENGTH_SHORT).show();
Bundle bundle=new Bundle();
bundle.putString("str_order_broadcast","经理说:公司每人发 5 个 月饼");
// 修改广播传输数据
setResultExtras(bundle);
}
}
}
- 中优先级的广播处理方法
public class CustomMiddleBroadcast extends BroadcastReceiver {
public CustomMiddleBroadcast() {
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("SendCustomOrderBroadcast")) {
Toast.makeText(context, getResultExtras(true).getString("str_order_broadcast"), Toast.LENGTH_SHORT).show();
Bundle bundle=new Bundle();
bundle.putString("str_order_broadcast","主管说:公司每人发 2 个 月饼");
setResultExtras(bundle);
}
}
}
- 低优先级广播处理方法
public class CustomLowerBroadcast extends BroadcastReceiver {
public CustomLowerBroadcast() {
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("SendCustomOrderBroadcast")) {
String notice= getResultExtras(true).getString("str_order_broadcast");
Toast.makeText(context,notice, Toast.LENGTH_SHORT).show();
// 终止广播继续传播下去
abortBroadcast();
}
}
}
注意 :
有序广播需要声明并使用权限
1.声明使用权限
<uses-permission > android:name="android.permission.ORDERBROADCAST" />
2.声明权限
<permission>
android:name="android.permission.ORDERBROADCAST"/>
在有序广播中高优先级的广播接收广播,可以修改数据,然后传给低优先级的广播。
3.发送持续广播(已经被弃用)
sendStickyBroadcast(intent);
5.广播接收(系统广播、自定义广播)
注意 :接收广播的方法
1.继承 BroadcastReceiver
2.实现onReceive方法,过滤Intent
- 例如:接收开机广播的方法
- 实现BootReceiverMethod 继承 BroadcastReceiver
ublic class BootReceiverMethod extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 接收开机广播处理事情,比如启动服务
Intent mStartIntent = new Intent(context, StartServiceMethods.class);
context.startService(mStartIntent);
}
}
2.在Androidmainfest.xml 声明组件信息,并过滤开机完成Action
<receiver
android:name=".component.BroadcastReceiver.BootReceiverMethod"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
3.声明接收开机广播完成的权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。
既然都看到这里,领两个红包在走吧!
以下两个红包每天都可以领取
1.支付宝搜索 522398497,或扫码支付宝红包海报。
支付宝扫一扫,每天领取大红包
2.微信红包,微信扫一扫即可领取红包
微信扫一扫,每天领取微信红包
小礼物走一走,来简书关注我