粘性广播介绍
粘性广播所发送的广播会在系统中滞留一段时间,当注册了符合的广播接收器的时候,广播接收器会自动接收广播消息。
粘性广播的发送
/**
* 发送粘性广播
* */
Intent i = new Intent();
i.setAction("StickyBroadcast");
i.putExtra("message", summary);
context.sendStickyBroadcast(i);
StickyBroadcast为注册器需要匹配的参数,summary为发送的数据
粘性广播的接收
接收器有三种接收方式,推荐第一种
第一种
//注册广播接收者
private void registBroadcastReceiver(){
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String data=intent.getStringExtra("message");
}
};
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("StickyBroadcast");
registerReceiver(mBroadcastReceiver, intentFilter);
}
@Override
protected void onResume() {
super.onResume();
registBroadcastReceiver();
}
data为接收到的数据
第二种:使用普通广播接收器,注意,必须在Manifiest或者发送之前接收(这和定义有点违背,因为这种方式不是正确的接收方式)
public class StickyBroadcastReceiver extends BroadcastReceiver {
public static final String Action = "StickyBroadcast";
public static final String PERMISSION = "com.sample.test.permission.sticky.receiver";
@Override
public void onReceive(Context context, Intent intent)
{
int checkCallingOrSelfPermission = context.checkCallingOrSelfPermission(PERMISSION);
if(PackageManager.PERMISSION_GRANTED == checkCallingOrSelfPermission) //权限判断
{
Toast.makeText(context, "授权成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "授权失败", Toast.LENGTH_SHORT).show();
throw new RuntimeException("permission denied");
}
if(intent!=null&&Action.equals(intent.getAction()))
{
Toast.makeText(context, intent.getStringExtra("message"), Toast.LENGTH_SHORT).show();
}
}
}
AndroidManifest
<!--自定义权限-->
<permission android:name="com.sample.test.permission.sticky.receiver" android:protectionLevel="normal" />
<!--使用自定义权限-->
<uses-permission android:name="com.sample.test.permission.sticky.receiver"/>
<!--使用粘性广播发送权限-->
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<!--省略一部分-->
<receiver android:name="test.view.weitop.home.StickyBroadcastReceiver"
android:permission="com.sample.test.permission.sticky.receiver" >
<!--android:permission 其他应用使用时,需要检测的权限-->
<intent-filter >
<action android:name="com.sample.test.sticky.broadcast.receiver"/>
</intent-filter>
</receiver>
第三种:这种是很多文章中比较推荐的写法,但是我在实现的过程中发现只能接收一次广播,再次发送广播后,接收器并不会接收
IntentFilter intentFilter = new IntentFilter(“StickyBroadcast”);
Intent data = registerReceiver(null, intentFilter); //接收、注意第一个参数
if(data != null && data.getAction().equals("StickyBroadcast"))
{
Toast.makeText(this, data.getStringExtra("mesage"), Toast.LENGTH_SHORT).show();
}
广播注销
一般会在Activity的onDestroy方法中进行注销
@Override
protected void onDestroy() {
super.onDestroy();
if (mBroadcastReceiver != null){
unregisterReceiver(mBroadcastReceiver);
mBroadcastReceiver = null;
}
}