当前位置: 首页 > news >正文

Android --- 广播

广播是什么?

一种相互通信,传递信息的机制,组件内、进程间(App之间)

如何使用广播?

组成部分

发送者-发送广播

与启动其他四大组件一样,广播发送也是使用intent发送。

  • 设置action:表示这个广播可以被哪些接收器接收到
  • 通过 putExtra,传递额外的bundle信息
 Intent intent = new Intent();intent.setAction(SEND_STATIC_ACTION);intent.putExtra("data","静态广播");sendBroadcast(intent);

接收者-广播接收

创建广播接收器

继承 BroadcastReceiver 类

或直接new该类的对象实例,然后重写方法 onReceive,在该方法中处理接收到的广播消息。

注册广播接收器

注册广播接收器有两种办法,静态注册和动态注册,可以分为两种广播

  • 静态广播:常驻内存中,是在Manifest文件中注册的,可在App未启动时就监听广播
  • 动态广播:App启动后注册,是在代码中注册以及解除注册的广播,解除注册后,广播也随时结束。

同时注册时,动态优于静态

静态广播

创建广播接收器类

// 静态广播接收器
public class StaticBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();Log.d("BroadcastReceiver","静态广播接收器接受了一个 - "+bundle.getString("data"));}
}

在 Manifest文件中注册广播接收器

   <receiver android:name=".broadcastreceiver.receiver.StaticBroadcastReceiver"android:exported="true"><intent-filter><action android:name="send_static_action"></action></intent-filter></receiver>

 动态广播
创建广播接收器

直接new该类的对象实例,然后重写方法 onReceive

// 创建广播接收器private BroadcastReceiver dynamicBroadcastReceiver= new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();Log.d("BroadcastReceiver","动态广播接收器接受了一个 - "+bundle.getString("data"));}};
注册广播接收者器类

一般在Activity的onCreate方法中注册

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_broadcast_study);// 动态注册广播接收器IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(SEND_DYNAMIC_ACTION);registerReceiver(dynamicBroadcastReceiver,intentFilter);}
解除注册
   @Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(dynamicBroadcastReceiver);}

无序广播、有序广播

按照广播接收顺序划分

  • 无序广播-普通广播:所有接收器接收的广播没有先后顺序,几乎同时收到消息
  • 有序广播:发送的广播会按照接收器的优先级顺序被接受,同一时刻只会有一个接收器收到广播,且收到广播之后可以对广播进行截断和修改

有序广播

发送

使用语句  sendOrderedBroadcast

广播接收器 

注册时,设置优先级,优先级越大越先收到广播

// 动态注册广播接收器IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(SEND_DYNAMIC_ACTION);intentFilter.setPriority(100);registerReceiver(dynamicBroadcastReceiver, intentFilter);// 注册有序广播// 有序广播设置优先级,优先级越大越先收到IntentFilter intentFilter1 = new IntentFilter();intentFilter1.addAction(SEND_DYNAMIC_ACTION);intentFilter1.setPriority(101);registerReceiver(broadcastReceiver2, intentFilter1);
截断广播 

abortBroadcast();  优先级高的广播接收器截断广播之后,下游的广播就不再会收到。 

修改广播 

上游的广播 使用 setResultExtras 传递一个新的 Bundle 或者使用 setResultData 传递一个字符串下游使用 getResultExtras 接收 Bundle,使用 getResultData 接收字符串

全局广播、本地广播

按照广播的传播范围划分

  • 本地广播:app内部
  • 全局广播:整个手机内部

全局广播

普通广播就是全局广播。

一个发送全局广播,在另一个app中接收到的例子:

App1

1.发送广播

Intent intent = new Intent();
intent.setAction(SEND_GLOBAL_ACTION);
intent.putExtra("data_global", "发送了一条全局广播");
sendBroadcast(intent);

App2

1.创建广播接收器,处理接收数据

 // 接收来自 Androidsutdio App的广播// 创建广播接收器private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, intent.getExtras().getString("data_global"), Toast.LENGTH_LONG).show();Log.d("接受全局广播", intent.getExtras().getString("data_global"));}};

2.注册广播接收器

action与发送广播的action相同

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 注册广播接收器IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("send_global_action");registerReceiver(broadcastReceiver, intentFilter);}

3.解除广播接收器

  @Overrideprotected void onDestroy() {super.onDestroy();// 解除广播接收器unregisterReceiver(broadcastReceiver);}

此时是由App2弹出的这条弹窗。

app2的logcat:

本地广播

只能使用动态注册,因为本地广播只能监听这个app内部的广播,在注册发送广播时,需要使用到LocalBroadcastManager 类。

注册
 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_broadcast_study);// 注册本地广播 - 只能动态注册LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);IntentFilter local_intentFilter = new IntentFilter();intentFilter1.addAction(SEND_LOCAL_ACTION);localBroadcastManager.registerReceiver(new LocalBroadcastReceiver(),local_intentFilter);}
发送 
 Intent intent = new Intent();intent.setAction(SEND_LOCAL_ACTION);intent.putExtra("data", "本地广播");localBroadcastManager.sendBroadcast(intent);
 解除注册
 Intent intent = new Intent();intent.setAction(SEND_LOCAL_ACTION);intent.putExtra("data", "本地广播");localBroadcastManager.sendBroadcast(intent);

广播的作用?

传递信息。

http://www.lryc.cn/news/407546.html

相关文章:

  • AR 眼镜之-蓝牙电话-实现方案
  • stl-set
  • 【Stable Diffusion】(基础篇五)—— 使用SD提升分辨率
  • 5.CSS学习(浮动)
  • Spring Cloud微服务项目统一封装数据响应体
  • java算法day20
  • web自动化测试-python+selenium+unitest
  • LeetCode题练习与总结:组合两个表--175
  • 数据结构:二叉搜索树(简单C++代码实现)
  • 深入理解Prompt工程
  • 代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和
  • vue3 vxe-table 点击行,不显示选中状态,加上设置isCurrent: true就可以设置选中行的状态。
  • Linux没有telnet 如何测试对端的端口状态
  • 花几千上万学习Java,真没必要!(二十九)
  • C#如何引用dll动态链接库文件的注释
  • WordPress原创插件:自定义文章标题颜色
  • Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化
  • .NET Core中如何集成RabbitMQ
  • 嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化:智能物流管理系统设计思路流程(附代码示例)
  • .net core docker部署教程和细节问题
  • php数据库链接
  • python+vue3+onlyoffice在线文档系统实战20240726笔记,左侧菜单实现和最近文档基本实现
  • vue中的nexttrick
  • 【BUG】已解决:ModuleNotFoundError: No module named ‘requests‘
  • 深入理解JS中的发布订阅模式和观察者模式
  • 网站IPv6支持率怎么检测?
  • react中简单的配置路由
  • RocketMQ消息短暂而又精彩的一生(荣耀典藏版)
  • Linux中的文件操作
  • [排序]hoare快速排序