Android广播的分类:
1、 普通广播:这种广播可以依次传递给各个处理器去处理
2、 有序广播:这种广播在处理器端的处理顺序是按照处理器的不同优先级来区分的,高优先级的处理器会优先截获这个消息,并且可以将这个消息删除
3、 粘性消息:粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到消息数据。
注意:普通广播和粘性消息不同被截获,而有序广播是可以被截获的。
在Android系统粘性广播一般用来确保重要的状态改变后的信息被持久保存,并且能随时广播给新的广播接收器,比如电源的改变,因为耗电需要一个过程,前一个过程必须提前得到,否则可能遇到下次刚好接收到的广播后系统自动关机了,随之而来的是kill行为,所以对某些未处理完的任务来说,后果很严重。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
发送粘性广播需要权限(这里的权限是保存信息的权限和由系统发送未处理的广播的权限)
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
对于粘性广播的发送,和普通广播的发送方式是一致的。为了测试粘性广播的正确使用方式,我们需要定义一个SenderActivity来发送stick Broadcast
public class SenderActivity{ @Override protected void onCreate(Bundle saveInstance) { super.onCreate(saveInstance); setContentView(R.layout.stcik_test_layout); getWindow().setBackgroundDrawableResource(R.drawable.avatar11); } @Override protected void onResume() { super.onResume(); getWindow().getDecorView().postDelayed(new Runnable() { @Override public void run() { sendStickyBroadcast(); } }, 3*1000); } private void sendStickyBroadcast() { Intent i = new Intent(); i.setAction(StickyBroadcastReceiver.Action); i.putExtra("info", "sticky broadcast has been receiver"); sendStickyBroadcast(i); Log.i("Other","sticky broadcast send ok!"); } }
需要知道的是粘性广播是普通广播的一种,因此也可以使用普通广播接收器来接收,当然粘性广播还有另一种常用的接收方式。
1.使用普通广播接收器,注意,必须在Manifiest或者发送之前接收(这和定义有点违背,因为这种方式不是正确的接收方式)
public class StickyBroadcastReceiver extends BroadcastReceiver { public static final String Action = "com.sample.test.sticky.broadcast.receiver"; 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("info"), Toast.LENGTH_SHORT).show(); } } }
Mainifest.xml
<!--自定义权限--> <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>
2.使用正确的方式接收(推荐)
正确的接收方式不应该使用BroadcastReceiver就可以接收到
只需要将SenderActivity的onResume稍作修改即可
@Override protected void onResume() { super.onResume(); //3秒后发送 getWindow().getDecorView().postDelayed(new Runnable() { @Override public void run() { sendStickyBroadcast(); } }, 3*1000); //15秒后就收 getWindow().getDecorView().postDelayed(new Runnable() { @Override public void run() { IntentFilter intentFilter = new IntentFilter(StickyBroadcastReceiver.Action); Intent data = registerReceiver(null, intentFilter); if(data!=null&&StickyBroadcastReceiver.Action.equals(data.getAction())) { Toast.makeText(this, data.getStringExtra("info"), Toast.LENGTH_SHORT).show(); } } }, 15*1000); }
在这样一个相差10秒左右的时间段 【先发送,后接收】,说明了粘性广播的已经将信息完全保存起来了,只要我们去使用如下方式,即可获取到,而且无限次获取。
Intent data = registerReceiver(null, intentFilter); //注意,不需要接收器,否则可能无法接收到
附注:这种广播也可以被移除 ,我们可以接收到 广播后调用 removeStickyBroadcast(intent);
(对网络有点失望,查出来的东西有点错误啊~~~)
try doing it!;