一、BroadcastReceiver的概述
BroadcastReceiver是Android的四大组件之一。
那么有什么作用呢。广播接收器是一个用于接收广播通知信息,并做出对应处理的组件。比如我们常见的系统广播──通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。在实际开发中我们可以拥通过集成自BroadcastReceiver基类来进行自定义广播,实现我们的业务需求的消息通讯。广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户,以此来达到一种通讯。
1、广播的类别
* 有序广播(普通广播):对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。这个也是我们使用较多的一种广播类型。
* 无序广播:它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播
2、广播的使用流程
1. 继承BroadcastReceiver实现自定义广播类:这里有两种形式的广播创建:单独类文件、内部类形式。重写onReceive方法进行消息的处理。2. 注册广播:俗称有静态注册和动态注册。静态注册指在manifest文件中注册的广播,这种注册的广播具有应用程序级别的效果。动态注册就是通过代码进行注册,比如我们在Activity中通过Context.registerReceiver进行注册,这种广播具有组件级别的效果,即当我们调用unregisterReceiver()方法或组件销毁广播就无法被接收处理了。
3. 发送广播:这里发送广播通过Context的sendBroadcast()方法或sendOrderedBroadcast()方法进行发送普通广播或有序广播。
好了,类别和使用流程摘抄自网上。
二、BroadcastReceiver的使用
需要使用的类必须继承BroadcastReceiver并且必须重写
onReceive()
方法
- 广播接收器接收到相应广播后,会自动回调
onReceive()
方法- 一般情况下,
onReceive
方法会涉及 与 其他组件之间的交互,如发送Notification
、启动Service
等- 默认情况下,广播接收器运行在
UI
线程,因此,onReceive()
方法不能执行耗时操作,否则将导致ANR
下面列举监听开机自启和蓝牙的启动和关闭
@Override
public void onReceive(Context context, Intent intent) {
// 在这里干你想干的事(启动一个Service,Activity等)
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
{
// Intent i = new Intent(context, MainActivity.class);
// context.startActivity(i);
Log.w("开机自启","");
}
switch (intent.getAction()) {
case BluetoothAdapter.ACTION_STATE_CHANGED:
int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
switch (blueState) {
case BluetoothAdapter.STATE_TURNING_ON:
Log.e("TAG", "TURNING_ON");
break;
case BluetoothAdapter.STATE_ON:
Log.e("TAG", "STATE_ON");
break;
case BluetoothAdapter.STATE_TURNING_OFF:
Log.e("TAG", "STATE_TURNING_OFF");
break;
case BluetoothAdapter.STATE_OFF:
Log.e("TAG", "STATE_OFF");
break;
}
break;
}
}
三、BroadcastReceiver的注册
注册的方式分为两种:静态注册、动态注册1.静态注册
过滤器里面过滤了开机自启和蓝牙状态的广播
<receiver
android:name=".BootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
</intent-filter>
</receiver>
2.动态注册
动态广播,有注册就必然得有注销,否则会导致内存泄露
/ 选择在Activity生命周期方法中的onResume()中注册
@Override
protected void onResume(){
super.onResume();
// 1. 实例化BroadcastReceiver子类 & IntentFilter
mBroadcastReceiver mBroadcastReceiver = new BroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
// 2. 设置接收广播的类型
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
// 3. 动态注册:调用Context的registerReceiver()方法
registerReceiver(mBroadcastReceiver, intentFilter);
}
// 注册广播后,要在相应位置记得销毁广播
// 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
// 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中
// 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。
@Override
protected void onPause() {
super.onPause();
//销毁在onResume()方法中的广播
unregisterReceiver(mBroadcastReceiver);
}
}
源码 下载