sendStickyBroadcast和sendStickyOrderedBroadcast - 牛仔的移动开发博客 - 博客频道 - CSDN.NET

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

例子:

[java] view plaincopyprint?
  1. package com.android.test;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. public class StickyBroadcastTest extends Activity {
  10. private Button mSendBroadcast;
  11. private Button mSendStickyBroadcast;
  12. private Button mNextActivity;
  13. private Context mContext;
  14. private int mStickyBrcCount;
  15. /** Called when the activity is first created. */
  16. @Override
  17. public void onCreate(Bundle savedInstanceState) {
  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(new OnClickListener() {
  25. @Override
  26. public void onClick(View v) {
  27. Intent intent = new Intent("com.android.action.broadcast");
  28. mContext.sendBroadcast(intent);
  29. }
  30. });
  31. mSendStickyBroadcast.setOnClickListener(new OnClickListener() {
  32. @Override
  33. public void onClick(View v) {
  34. mStickyBrcCount++;
  35. Intent intent = new Intent("com.android.action.sticky.broadcast");
  36. intent.putExtra("sent_count", mStickyBrcCount);
  37. mContext.sendStickyBroadcast(intent);
  38. }
  39. });
  40. mNextActivity.setOnClickListener(new OnClickListener() {
  41. @Override
  42. public void onClick(View v) {
  43. Intent intent = new Intent(StickyBroadcastTest.this, MyReceiverActivity.class);
  44. startActivity(intent);
  45. }
  46. });
  47. }
  48. @Override
  49. protected void onResume() {
  50. // TODO Auto-generated method stub
  51. super.onResume();
  52. mStickyBrcCount = 0;
  53. }
  54. }
  55. //MyReceiverActivity
  56. package com.android.test;
  57. import android.app.Activity;
  58. import android.content.BroadcastReceiver;
  59. import android.content.Context;
  60. import android.content.Intent;
  61. import android.content.IntentFilter;
  62. import android.os.Bundle;
  63. import android.util.Log;
  64. public class MyReceiverActivity extends Activity {
  65. private IntentFilter mIntentFilter;
  66. private final static String TAG = "MyReceiverActivity";
  67. /** Called when the activity is first created. */
  68. @Override
  69. public void onCreate(Bundle savedInstanceState) {
  70. super.onCreate(savedInstanceState);
  71. setContentView(R.layout.broadcast_receiver);
  72. mIntentFilter = new IntentFilter();
  73. mIntentFilter.addAction("com.android.action.broadcast");
  74. mIntentFilter.addAction("com.android.action.sticky.broadcast");
  75. }
  76. private BroadcastReceiver  mReceiver = new BroadcastReceiver () {
  77. @Override
  78. public void onReceive(Context context, Intent intent) {
  79. final String action = intent.getAction();
  80. int count = intent.getIntExtra("sent_count", -1);
  81. Log.d(TAG, "action = " + action + "and count = " + count);
  82. //context.removeStickyBroadcast(intent);
  83. }
  84. };
  85. @Override
  86. protected void onPause() {
  87. // TODO Auto-generated method stub
  88. super.onPause();
  89. unregisterReceiver(mReceiver);
  90. }
  91. @Override
  92. protected void onResume() {
  93. // TODO Auto-generated method stub
  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 ;

转载于:https://www.cnblogs.com/seven1979/p/4333070.html

sendStickyBroadcast和sendStickyOrderedBroadcast相关推荐

  1. sendBroadcast与sendStickyBroadcast的区别

    前提条件:此处我主要讨论两种广播在代码中动态注册时的一些细节问题. 正常情况下,广播通常都是执行一次注册代码,就会触发各接收器接收一次,无论是在onCreate里注册还是onResume里注册:若在o ...

  2. sendBroadcast和sendStickyBroadcast的区别

    们平时最经常使用的是sendBroadcast,就是把一个Intent广播出去.今天我在看wifi的时候,还发现了sendStickyBroadcast.官方文档是这样写的: public abstr ...

  3. Android四大基本组件介绍与生命周期

    Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity ...

  4. Android四大基本组件和生命周期的介绍

    Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity ...

  5. Android开发精要2--Android组件模型解析

    本文的主要内容如下: 2.1 基于Mashup的应用设计 2.2 界面组件Activity解析 2.3 服务组件Service解析 2.4 触发器组件BroadcastReceiver解析 2.5 数 ...

  6. 【转】Android BroadcastReceiver介绍

    本文主要介绍BroadcastReceiver的概念.使用.生命周期.安全性.分类.特殊的BroadcastReceiver(本地.粘性.有序.粘性有序广播). 示例代码见BroadcastRecei ...

  7. Android基础_1 四大基本组件介绍与生命周期

    Android四大基本组件分别是Activity,Service(服务),Content Provider(内容提供者),BroadcastReceiver(广播接收器). 一.四大基本组件 Acti ...

  8. 品茗论道说广播(Broadcast内部机制讲解)

    1 概述 我们在编写Android程序时,常常会用到广播(Broadcast)机制.从易用性的角度来说,使用广播是非常简单的.不过,这个不是本文关心的重点,我们希望探索得再深入一点儿.我想,许多人也不 ...

  9. Android ---- Context

    Context字面意思上下文,位于framework package的android.content.Context中,很多方法需要通过 Context才能识别调用者的实例,比如说Toast的第一个参 ...

最新文章

  1. win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
  2. iOS - Regex 正则表达式
  3. java循环object_java怎么循环获取object的属性名和值?object内容如下
  4. 处女座和小姐姐(三)
  5. 为什么剩余数不能相加_行测备考:如何快解数量关系中的剩余定理
  6. 使用Java操作文本文件的方法详解
  7. java uuid静态方法_Java UUID timestamp()方法与示例
  8. 前端学习(342):进制只能介于2-36之间Uncaught RangeError: toString() radix argumen
  9. Multi_thread--Linux下多线程编程互斥锁和条件变量的简单使用
  10. 翻译自 RedHat 文章:What is middleware? (什么是中间件?)
  11. html怎么设置字体的透明度,CSS字体透明度怎么设置?
  12. SDNUOJ 1682.easy problem Ⅲ
  13. uniapp+nvue开发之仿微信语音+视频通话功能 :实现一对一语音视频在线通话
  14. 杨忠愍斗严嵩,为国为民,名垂千古
  15. OSChina 周一乱弹 —— 妮儿还是把上衣穿上吧
  16. Revit二次开发入门秘籍 01如何入门
  17. 美团外卖推荐系统之智能流量分发的实践与探索
  18. intellij idea字体大小设置一秒完成
  19. ERP管理系统名词含义是什么?
  20. Java 读书笔记1

热门文章

  1. centos mysql安装_mysql yum源安装
  2. linux修改bmc ip,RH1288 V2修改BMC IP不生效处理案例
  3. oracle rac ora 12537,解决11gR2 Rac ORA-12537: TNS:connection closed 一例
  4. 查看oracle的表空间使用,查看Oracle的表空间的使用情况
  5. linux关机告诉用户,在Linux服务器关机前向用户显示一条自定义消息
  6. 景德镇陶瓷学院计算机协会,景德镇陶瓷学院计算机协会换届大会总结报告
  7. return与exit()
  8. 数字图像处理:腐蚀与膨胀操作
  9. Win10下VisualStudio2019安装及测试
  10. 基于视频理解TSM和数据集Kinetics-400的视频行为识别