android广播接收器的无序广播和有序广播

快来打我* 2024-04-01 12:07 222阅读 0赞

1.无序广播,就普通广播,没有先后顺序,几乎同时收到消息

2.有序广播,可以设置接收器的顺序优先级,还可以对广播设置设置截断,修改
通过设置abortBroadcast()进行截断,通过setResultExtras(bundle)向下游广播接收器传递额外的键值对信息或者setResultData(“”)直接传送字符串,下游广播通过getResultExtras方法接收信息,getResultData()方法接收字符串信息

示例有序广播
清单文件:
有序广播的顺序通过清单文件里的android:priority属性的数字大小进行优先级设置:范围为(-1000到1000)数字越大,优先级越高,

  1. <intent-filter android:priority="003">

可参考下图:
在这里插入图片描述

  1. <!--有序广播-->
  2. <receiver
  3. android:name=".broadcast.MyHaveBroadcastReceiver01"
  4. android:exported="true">
  5. <intent-filter>
  6. <action android:name="my_have_broadcast_receiver"></action>
  7. </intent-filter>
  8. </receiver>
  9. <receiver
  10. android:name=".broadcast.MyHaveBroadcastReceiver02"
  11. android:exported="true">
  12. <intent-filter android:priority="003">
  13. <action android:name="my_have_broadcast_receiver"></action>
  14. </intent-filter>
  15. </receiver>
  16. <receiver
  17. android:name=".broadcast.MyHaveBroadcastReceiver03"
  18. android:exported="true">
  19. <intent-filter android:priority="002">
  20. <action android:name="my_have_broadcast_receiver"></action>
  21. </intent-filter>
  22. </receiver>
  23. /**
  24. * 有序广播01
  25. */
  26. public class MyHaveBroadcastReceiver01 extends BroadcastReceiver {
  27. private static final String TAG = "MyHaveBroadcastReceiver01";
  28. @Override
  29. public void onReceive(Context context, Intent intent) {
  30. if (intent != null) {
  31. Bundle extras = intent.getExtras();
  32. String data = "";
  33. if (extras != null) {
  34. data = extras.getString("name");
  35. }
  36. Log.d(TAG, "MyHaveBroadcastReceiver01 onReceive"+data);
  37. }
  38. }
  39. }
  40. /**
  41. * 有序广播02
  42. */
  43. public class MyHaveBroadcastReceiver02 extends BroadcastReceiver {
  44. private static final String TAG = "MyHaveBroadcastReceiver02";
  45. @Override
  46. public void onReceive(Context context, Intent intent) {
  47. if (intent != null) {
  48. Bundle extras = intent.getExtras();
  49. String data = "";
  50. if (extras != null) {
  51. data = extras.getString("name3");
  52. /**
  53. * 2.1有序广播可以通过setResultExtras向下游广播接收器传递数据
  54. */
  55. extras.putString("name2", "喊你速速到龙阳路集合");
  56. setResultExtras(extras);
  57. /**
  58. * 2.2有序广播可以通过setResultData向下游广播接收器传递字符串
  59. */
  60. setResultData("2号口的信息");
  61. }
  62. Log.d(TAG, "MyHaveBroadcastReceiver02 onReceive" + data);
  63. /**
  64. * 1.有序广播可以通过abortBroadcast();方法对广播进行截断
  65. */
  66. // abortBroadcast();
  67. }
  68. }
  69. }
  70. /**
  71. * 有序广播03
  72. */
  73. public class MyHaveBroadcastReceiver03 extends BroadcastReceiver {
  74. private static final String TAG = "MyHaveBroadcastReceiver03";
  75. @Override
  76. public void onReceive(Context context, Intent intent) {
  77. if (intent != null) {
  78. Bundle extras = intent.getExtras();
  79. String data = "";
  80. if (extras != null) {
  81. data = extras.getString("name");
  82. }
  83. Log.d(TAG, "MyHaveBroadcastReceiver03 onReceive" + data);
  84. /**
  85. * 获取上游广播传递过来的数据
  86. */
  87. //方法1
  88. Bundle bundle = getResultExtras(true);
  89. String strData = bundle.getString("name2");
  90. String resultData = getResultData();
  91. //方法2,直接获取字符串
  92. if (strData != null) {
  93. Log.d(TAG, "上游广播传递来的信息 onReceive" + strData +"\t\t\t"+ resultData);
  94. }
  95. }
  96. }
  97. }

Activity页面:StaticDynamicTestActivity.java

  1. /**
  2. * 静态广播和动态广播的测试
  3. * 默认情况下,静态注册的广播隐式的收不到
  4. * 有序广播和无序广播的测试
  5. */
  6. public class StaticDynamicTestActivity extends AppCompatActivity {
  7. Button btnHaveOrder;
  8. Button btnNoHaveOrder;
  9. private MyDyBroadcastReceiver myDyBroadcastReceiver = new MyDyBroadcastReceiver();
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_static_dynamic_test);
  14. //注册动态广播接收器
  15. IntentFilter filter = new IntentFilter();
  16. filter.addAction("my_dy_broadcast_receiver");
  17. //注册
  18. registerReceiver(myDyBroadcastReceiver, filter);
  19. registerReceiver(mBatteryBroadcast, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
  20. btnHaveOrder = findViewById(R.id.btn_haveOrder);
  21. btnNoHaveOrder = findViewById(R.id.btn_noOrder);
  22. haveOrder();
  23. noOrder();
  24. }
  25. //发送静态广播
  26. @SuppressWarnings("wrongConstant")
  27. public void sendStaticBroadcast(View view) {
  28. Intent intent = new Intent();
  29. intent.setAction("my_broadcast_receiver");
  30. //安卓8.0以及以后做了禁止后台运行,不加setPackage无法收到隐式广播或者以下
  31. //intent.addFlags(0x01000000);//不推荐
  32. intent.setPackage(getPackageName());
  33. sendBroadcast(intent);
  34. }
  35. //发送动态广播
  36. @SuppressWarnings("wrongConstant")
  37. public void sendDyBroadcast(View view) {
  38. Intent intent = new Intent();
  39. intent.setAction("my_dy_broadcast_receiver");
  40. // //安卓8.0以及以后做了禁止后台运行,不加setPackage无法收到隐式广播或者以下
  41. // //intent.addFlags(0x01000000);//不推荐
  42. // intent.setPackage(getPackageName());
  43. sendBroadcast(intent);
  44. }
  45. BroadcastReceiver mBatteryBroadcast = new BroadcastReceiver() {
  46. @Override
  47. public void onReceive(Context context, Intent intent) {
  48. int level = intent.getIntExtra("level", 0);
  49. Toast.makeText(context, "电池电量还有百分之" + level, Toast.LENGTH_LONG).show();
  50. }
  51. };
  52. /**
  53. * 有序广播
  54. */
  55. void haveOrder() {
  56. btnHaveOrder.setOnClickListener(new View.OnClickListener() {
  57. @Override
  58. public void onClick(View view) {
  59. Intent intent = new Intent();
  60. intent.setAction("my_have_broadcast_receiver");
  61. //这里注意传递个bundle参数
  62. Bundle bundle = new Bundle();
  63. bundle.putString("name3","回家吃饭了");
  64. intent.putExtras(bundle);
  65. //安卓8.0以及以后做了禁止后台运行,不加setPackage无法收到隐式广播或者以下
  66. intent.setPackage(getPackageName());
  67. sendOrderedBroadcast(intent, null);
  68. }
  69. });
  70. }
  71. /**
  72. * 无序广播
  73. */
  74. void noOrder() {
  75. btnNoHaveOrder.setOnClickListener(new View.OnClickListener() {
  76. @Override
  77. public void onClick(View view) {
  78. Intent intent = new Intent();
  79. intent.setAction("my_no_broadcast_receiver");
  80. //安卓8.0以及以后做了禁止后台运行,不加setPackage无法收到隐式广播或者以下
  81. intent.setPackage(getPackageName());
  82. sendBroadcast(intent);
  83. }
  84. });
  85. }
  86. @Override
  87. protected void onDestroy() {
  88. super.onDestroy();
  89. //解除注册
  90. unregisterReceiver(myDyBroadcastReceiver);
  91. unregisterReceiver(mBatteryBroadcast);
  92. }
  93. }

Activity对应的xml页面:activity_static_dynamic_test.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".broadcast.StaticDynamicTestActivity">
  8. <Button
  9. android:id="@+id/bt_static"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:onClick="sendStaticBroadcast"
  13. android:text="发送静态广播啦">
  14. </Button>
  15. <Button
  16. android:id="@+id/btn_dy"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:layout_marginTop="20dp"
  20. android:onClick="sendDyBroadcast"
  21. android:text="发送动态广播"
  22. app:layout_constraintTop_toBottomOf="@+id/bt_static" />
  23. <Button
  24. android:id="@+id/btn_battery"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:layout_marginTop="20dp"
  28. android:onClick="sendDyBroadcast"
  29. android:text="获取电池电量"
  30. app:layout_constraintTop_toBottomOf="@+id/btn_dy">
  31. </Button>
  32. <Button
  33. android:id="@+id/btn_haveOrder"
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"
  36. android:layout_marginTop="20dp"
  37. android:onClick="sendDyBroadcast"
  38. android:text="有序广播"
  39. app:layout_constraintTop_toBottomOf="@+id/btn_battery">
  40. </Button>
  41. <Button
  42. android:id="@+id/btn_noOrder"
  43. android:layout_width="wrap_content"
  44. android:layout_height="wrap_content"
  45. android:layout_marginTop="20dp"
  46. android:onClick="sendDyBroadcast"
  47. android:text="无序号广播"
  48. app:layout_constraintTop_toBottomOf="@+id/btn_haveOrder">
  49. </Button>
  50. </androidx.constraintlayout.widget.ConstraintLayout>

以上为简单使用参考:有问题加QQ:1393508286

发表评论

表情:
评论列表 (有 0 条评论,222人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android广播

    广播机制 1 . Adnroid的广播机制(以intent对象的形式广播出去) Android系统已经写好了广播机制,在我们照相的时候系统会自动生成照相事件并广播出去。

    相关 Android学习之路-------广播接收器

    前言   没想到离上一篇博文的时间已经有一个多星期了,时间真的不等人啊,在这里LP告诉你们一个道理,如果现在有谁正在看管理时间的书,那么请你们把这些书放下吧,看了也没有用

    相关 android广播

    广播的思维导图: ![Center][] 广播即一个发送者向多个接收者发送消息,以下为大家展示一下发送者与接收者的代码示例: 发送者xml部分: <?xm