1、关于BroadcastReceiver
广播接受器用来接收一些轻量级的消息然后进行后续的事务,这些消息可以是来自系统的也可以是来自应用的;
2、如何注册BroadcastReceiver
要接收广播就需要将BroadcastReceiver进行注册,注册分为静态和动态的,两者的区别是静态的一直在监听目标广播,而动态的会在注册BroadcastReceiver的组件生命周期结束时就失效了,并且在使用结束的时候要取消注册,不然会有异常;
2.1、静态注册
静态注册可以通过以下方式来注册,Receiver可以自己命名;
在action中可以添加自己想去监听的广播;
<receiver android:name=".ReceiverA">
<intent-filter >
<action android:name="android.intent.action.MY_RECEIVE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
可以在onReceive()中去做接收到广播之后的事;
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.i("TAG", "A中接收到的消息"+msg);
Bundle bundle=new Bundle();
bundle.putString("msg",msg+"ReceiverA");
setResultExtras(bundle);
}
2.2、动态注册
动态注册的时候自己手动重写BroadcastReceiver类,然后跟静态注册中一样重写onReceive()这个方法就行,不同之处在于不会在AndroidManifest.xml文件中进行注册,通过以下代码进行手动注册,手动取消注册;
ReceiverA myReceiver = new ReceiverA();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_sendBroadcast).setOnClickListener(this);
//初始化广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.MY_RECEIVE");
//注册广播
registerReceiver(myReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册
unregisterReceiver(myReceiver);
}
3、如何发送自定义广播
发送自定义广播很简单,只要Intent中的action跟BroadcastReceiver注册的文件中的action相同就会让BroadcastReceiver接收到广播;
case R.id.btn_sendBroadcast:
Intent intent = new Intent("android.intent.action.MY_RECEIVE");
intent.putExtra("msg", "发送给广播的消息");
sendBroadcast(intent);
break;
4、广播的分类
Receiver分为两种,一种是有序的,一种是无序的。通过priority设置优先级的是有序的,proority范围为-1000到1000,数值越大优先级越大;
4.1、有序广播
<receiver android:name=".ReceiverA">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.MY_RECEIVE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
发送有序广播需要一个权限参数
<permission
android:name="scott.permission.MY_RECEIVER_PERMISSION"
android:protectionLevel="normal" />
<uses-permission android:name="scott.permission.MY_RECEIVER_PERMISSION" />
通过以下代码发送有序广播,后面部分的参数必须和添加的权限参数的name一致;
case R.id.btn_sendBroadcast:
Intent intent = new Intent("android.intent.action.MY_RECEIVE");
intent.putExtra("msg", "发送给广播的消息");
sendOrderedBroadcast(intent,"scott.permission.MY_RECEIVER_PERMISSION");
break;
当我们获取到广播之后可以通过obortBroadcast()来对广播进行拦截,优先级低于该优先级的Receiver将接收不到发送的广播;
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.i("TAG", "A中接收到的消息"+msg);
abortBroadcast();
}
4.2、普通广播
普通广播就是我们上面创建的那种,没有设置优先级的,只要BroadcastReceiver拦截的是同一种广播,不管是有几个BroadcastReceiver,它们都会同时获取到发送的广播;
5、接收系统广播
接收系统广播就两点,一个是添加权限,一个是在广播注册中注明具体拦截的广播,然后就是在获取到广播后要做的事,以下是拦截开机广播的例子;
//获取开机广播的权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
//开机后的广播
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
@Override
public void onReceive(Context context, Intent intent) {
Log.i("TAG", "接受到开机广播后启动服务");
}