sendStickyBroadcast和sendStickyOrderedBroadcast

本文详细介绍了Android中sendStickyBroadcast的功能及其使用方法。sendStickyBroadcast可以将广播信息持久化,即使在没有接收者的情况下也能保留最新广播信息,一旦有接收者注册即刻接收该广播。文章通过实例代码展示了如何发送和接收此类广播。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sendStickyBroadcast和sendStickyOrderedBroadcast发出的广播会一直滞留(等待),以便有人注册这则广播消息后能尽快的收到这条广播。其他功能与sendBroadcast相同。但是使用sendStickyBroadcast 发送广播需要获得BROADCAST_STICKYpermission,如果没有这个permission则会抛出异常。

例子:

  1. packagecom.android.test;
  2. importandroid.app.Activity;
  3. importandroid.content.Context;
  4. importandroid.content.Intent;
  5. importandroid.os.Bundle;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.widget.Button;
  9. publicclassStickyBroadcastTestextendsActivity{
  10. privateButtonmSendBroadcast;
  11. privateButtonmSendStickyBroadcast;
  12. privateButtonmNextActivity;
  13. privateContextmContext;
  14. privateintmStickyBrcCount;
  15. /**Calledwhentheactivityisfirstcreated.*/
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState){
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. mContext=getApplicationContext();
  21. mSendBroadcast=(Button)findViewById(R.id.broadcast);
  22. mSendStickyBroadcast=(Button)findViewById(R.id.stickybroadcast);
  23. mNextActivity=(Button)findViewById(R.id.next_activity);
  24. mSendBroadcast.setOnClickListener(newOnClickListener(){
  25. @Override
  26. publicvoidonClick(Viewv){
  27. Intentintent=newIntent("com.android.action.broadcast");
  28. mContext.sendBroadcast(intent);
  29. }
  30. });
  31. mSendStickyBroadcast.setOnClickListener(newOnClickListener(){
  32. @Override
  33. publicvoidonClick(Viewv){
  34. mStickyBrcCount++;
  35. Intentintent=newIntent("com.android.action.sticky.broadcast");
  36. intent.putExtra("sent_count",mStickyBrcCount);
  37. mContext.sendStickyBroadcast(intent);
  38. }
  39. });
  40. mNextActivity.setOnClickListener(newOnClickListener(){
  41. @Override
  42. publicvoidonClick(Viewv){
  43. Intentintent=newIntent(StickyBroadcastTest.this,MyReceiverActivity.class);
  44. startActivity(intent);
  45. }
  46. });
  47. }
  48. @Override
  49. protectedvoidonResume(){
  50. //TODOAuto-generatedmethodstub
  51. super.onResume();
  52. mStickyBrcCount=0;
  53. }
  54. }
  55. //MyReceiverActivity
  56. packagecom.android.test;
  57. importandroid.app.Activity;
  58. importandroid.content.BroadcastReceiver;
  59. importandroid.content.Context;
  60. importandroid.content.Intent;
  61. importandroid.content.IntentFilter;
  62. importandroid.os.Bundle;
  63. importandroid.util.Log;
  64. publicclassMyReceiverActivityextendsActivity{
  65. privateIntentFiltermIntentFilter;
  66. privatefinalstaticStringTAG="MyReceiverActivity";
  67. /**Calledwhentheactivityisfirstcreated.*/
  68. @Override
  69. publicvoidonCreate(BundlesavedInstanceState){
  70. super.onCreate(savedInstanceState);
  71. setContentView(R.layout.broadcast_receiver);
  72. mIntentFilter=newIntentFilter();
  73. mIntentFilter.addAction("com.android.action.broadcast");
  74. mIntentFilter.addAction("com.android.action.sticky.broadcast");
  75. }
  76. privateBroadcastReceivermReceiver=newBroadcastReceiver(){
  77. @Override
  78. publicvoidonReceive(Contextcontext,Intentintent){
  79. finalStringaction=intent.getAction();
  80. intcount=intent.getIntExtra("sent_count",-1);
  81. Log.d(TAG,"action="+action+"andcount="+count);
  82. //context.removeStickyBroadcast(intent);
  83. }
  84. };
  85. @Override
  86. protectedvoidonPause(){
  87. //TODOAuto-generatedmethodstub
  88. super.onPause();
  89. unregisterReceiver(mReceiver);
  90. }
  91. @Override
  92. protectedvoidonResume(){
  93. //TODOAuto-generatedmethodstub
  94. super.onResume();
  95. registerReceiver(mReceiver,mIntentFilter);
  96. }
  97. }

运行结果如图:

首先点击next Activity从代码中可以看到receiver已经注册,但Log无输出,这是当然的了~~~因为没有广播发出自然就不会有人响应了。(onPause里unregisterReceiver了

按back后退到上图

下面分别点击send broadcast 和 send stickybroadcast按钮,随便点击几次,此时对应的receiver并没有注册,所以是不会有人响应这两条广播的。然后点击next activity,当打开新的activity后对应的receiver被注册,此时从日志中就能看出已经收到了send stickybroadcast发出的广播,但没有send broadcast发出的广播。这就是sendStickyBroadcast的特别之处,它将发出的广播保存起来,一旦发现有人注册这条广播,则立即能接收到。

日志打印为: action = com.android.action.sticky.broadcastand count = 4

从上面的日志信息可以看出sendStickyBroadcast只保留最后一条广播,并且一直保留下去,这样即使已经处理了这条广播但当再一次注册这条广播后依然可以收到它。

如果你只想处理一遍,removeStickyBroadcast方法可以帮你,处理完了后就将它删除吧。


sticky形式的intent,接收者可以为空,接收者为空时,通常是获取最后一个保存广播的intent,从而获取intent里的值,不如获取电池的电量:

因为BatteryManager发送的是sticky形式的intent,所以接收者可以为空
Intent batteryStatus = registerReceiver(null, ifilter);

//得到电池当前的状态(共有5种,包括unkonwn、charging、discharging、not charging、full)
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
//是否处于充电状态
boolean isCharging = BatteryManager.BATTERY_STATUS_CHARGING ;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值