三大消息传递机制区别与联系

目录

总结放开头

1、定义区别:

EventBus

Broadcast Receiver

Notification

2、使用区别:

EventBus

Broadcast Receiver

Notification

3、补充通知渠道:

通知渠道重要程度


总结放开头

BroadCast Receiver:属于安卓全局监听机制,接收系统或应用发出的消息(应用级)

EventBus:应用内各组件间的解耦和消息传递(组件级,如Activity向Service传递信息)

Notification:向用户通知消息(UI界面展示)

1、定义区别:

EventBus

1、发布/订阅事件总线库 - 》“发布-订阅模式”

2、异步分发

3、应用组件间的解耦(不会直接相互引用)与消息传递

4、EventBus适用于任何组件之间的通信,包括Activity、Fragment、Service等

5、实现“一发多收”功能,发送后,多组件都能接受此事件

Broadcast Receiver

1、Android系统全局监听机制,接受来自系统或其他应用的广播消息

2、系统级别事件: 如电池状态,屏幕关闭、电话呼入或网络状态变更等
3、Broadcast Receiver可用于进程间通信、线程间通信以及监听系统的特定事件

Notification

1、UI界面,向用户展示应用状态或信息更新

2、可交互 :通过设置PendingIntent,用户可以通过点击Notification来打开指定的Activity或者执行特定的操作

2、使用区别:

EventBus

核心 :发布事件——订阅事件

依赖

implementation("org.greenrobot:eventbus:3.3.1")

定义事件类(举例)

class ChangeColorEvent(val color:Int) {}

发送事件

 EventBus.getDefault().post(ChangeColorEvent(Color.MAGENTA))

订阅(界面初始化是注册,界面销毁前取消注册)

init {//注册EventBusEventBus.getDefault().register(this)}override fun onDetachedFromWindow() {super.onDetachedFromWindow()//取消EventBus事件订阅EventBus.getDefault().unregister(this)}@Subscribe(threadMode = ThreadMode.MAIN)fun changeColor(event:ChangeColorEvent){setTextColor(event.color)}

Broadcast Receiver

创建Reciever

class MyBoradCastReceiver: BroadcastReceiver() {override fun onReceive(context: Context?, intent: Intent?) {
/**如下接收外部消息*/       val action = intent!!.getStringExtra(NotificationHelper.BROADCAST_EXTRA_KEY)}
}

动态注册(依赖于注册的Activity,只要此Activity关闭,广播也失效

val mReceiver = MyBroadCastReceiver();              
val intentFilter = IntentFilter(NotificationHelper.action_broadcast_notification)
registerReceiver(mReceiver, intentFilter);

发送标准广播

sendBoardcast(intent)

接收广播

override fun onReceive(context:Context , intent:Intent ) {String data = intent.getStringExtra("key"); // 获取传递的数据// 在这里处理接收到的广播 逻辑代码实现
}

取消注册

手动移除广播接收器 ——>在onDestroy()重写中加入unregister(mReceiver)

Notification

(可以自定义通知栏,这里采用系统自带通知栏)

申请权限

Manifest 中 ,application外添加

<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {val result = checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS)if (result != PackageManager.PERMISSION_GRANTED){ //没有权限val launcher = registerForActivityResult(ActivityResultContracts.RequestPermission()){if (it){//申请到权限了}else{//用户拒绝授权}}launcher.launch(Manifest.permission.POST_NOTIFICATIONS)}}

创建NotificationManager

 val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

创建通知渠道

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {val channel =NotificationChannel(channel_id, channel_name, NotificationManager.IMPORTANCE_HIGH)notificationManager.createNotificationChannel(channel)}

使用Build构造器创建Notification对象

//创建Notification,传入Context和channelId
val notification = new NotificationCompat.Builder(this, "channelId").setAutoCancel(true).setContentTitle("收到聊天消息").setContentText("今天晚上吃什么").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).setContentIntent(pendingIntent)//在build()方法之前还可以添加其他方法.build();

显示通知

notificationManager.notify(1, notification);

通知消失

创建Notification时添加setAutoCancel(true) ,或者如下手动取消

//传入对应通知的id
notificationManager.cancel(1);

3、补充通知渠道:

一个应用可以有多个通知权限(如Twitter可以分别设置通知 私信,与你相关推文);

每条通知都要属于一个对应的渠道;

自由选择通知渠道的重要程度(是否响铃、是否振动、或者是否要关闭这个渠道的通知);

通知渠道重要程度

public class NotificationManager {......public static final int IMPORTANCE_DEFAULT = 3;public static final int IMPORTANCE_HIGH = 4;public static final int IMPORTANCE_LOW = 2;public static final int IMPORTANCE_MAX = 5;public static final int IMPORTANCE_MIN = 1;public static final int IMPORTANCE_NONE = 0;public static final int IMPORTANCE_UNSPECIFIED = -1000;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】最短路问题 bfs 到 dijkstra

1976、到达目的地的方案数 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff0c;某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口&#xff0c;且任意两个路口之间最多有一条路。 给你一个整数 n 和二维整…

五一 大项目--docker-compose编排lnmp完成wordpress

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

Linux-线程概念

1. 线程概念 线程&#xff1a;轻量级进程&#xff0c;在进程内部执行&#xff0c;是OS调度的基本单位&#xff1b;进程内部线程共用同一个地址空间&#xff0c;同一个页表&#xff0c;以及内存中的代码和数据&#xff0c;这些资源对于线程来说都是共享的资源 进程&#xff1a;…

RabbitMQ (windows) 安装

大家好我是苏麟 , 今天安装一下 RabbitMQ . 官网 : RabbitMQ: One broker to queue them all | RabbitMQ 1.点击 Getting Started 2. 点击 Docs 3.点击 Install And Upgrade 4.点击 installation via Chocolatory 5. 直接下载安装包 RabbitMQ 下好了先放在一遍 RabbitMQ 需要 E…

【C++】-------反向迭代器的模拟实现(补充)

目录 前言 一、反向迭代器接口&#xff08;用户层&#xff09; 二、模拟实现 三、以vector模拟实现为例 四、总结 前言 在vector和list的接口中我们实际上有说明过反向迭代器的用法&#xff0c;这里就有个问题&#xff0c;并不是只有这两个容器存在反向迭代器的。那么对于他…

点云DBSCAN聚类,同时获取最多点数量的类,同时删除其他的类并显示

代码的主要目的是处理一个点云文件(从某个巷道或类似环境中获取的),并尝试识别并可视化其中的主要结构(比如墙壁),同时去除可能的噪声和异常点。它首先读取一个点云文件,进行降采样和异常点移除,然后使用DBSCAN聚类算法对剩余的点云进行聚类,最后选择并可视化包含最多…

应用案例 | 商业电气承包商借助Softing NetXpert XG2节省网络验证时间

一家提供全方位服务的电气承包商通过使用Softing NetXpert XG2顺利完成了此次工作任务——简化了故障排查的同时&#xff0c;还在很大程度上减少了不必要的售后回访。 对已经安装好的光纤或铜缆以太网网络进行认证测试可能会面临不同的挑战&#xff0c;这具体取决于网络的规模、…

示例五、气敏传感器

通过以下几个示例来具体展开学习,了解气敏传感器原理及特性&#xff0c;学习气敏传感器的应用&#xff1a; 示例五、气敏传感器 一、基本原理&#xff1a;随着人们生活水平的不断提高&#xff0c;人们对环境和健康问题越来越重视。各种燃气的广泛使用&#xff0c;使生产效率和…

多模态CLIP和BLIP

一、CLIP 全称为Contrastive Language-Image Pre-Training用于做图-文匹配&#xff0c;部署在预训练阶段&#xff0c;最终理解为图像分类器。 1.背景 以前进行分类模型时&#xff0c;存在类别固定和训练时要进行标注。因此面对这两个问题提出CLIP&#xff0c;通过这个预训练…

B 站评论系统架构设计难点

更多大厂面试内容可见 -> http://11come.cn B 站评论系统架构设计难点 这里整理一下在哔哩哔哩技术公众号看到的 B 站评论系统的架构设计文章&#xff0c;自己在学习过程中&#xff0c;对其中感觉比较有帮助的点做一下整理&#xff0c;方便以后查阅&#xff0c;详细版可以点…

Portforge:一款功能强大的轻量级端口混淆工具

关于Portforge Portforge是一款功能强大的轻量级端口混淆工具&#xff0c;该工具使用Crystal语言开发&#xff0c;可以帮助广大研究人员防止网络映射&#xff0c;这样一来&#xff0c;他人就无法查看到你设备正在运行&#xff08;或没有运行&#xff09;的服务和程序了。简而言…

邂逅Linux--常见指令,万物为文件(一)

引子&#xff1a;在之前&#xff0c;我们经常听到Linux&#xff0c;那什么是Linux呢&#xff1f;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff…

力扣每日一题-统计已测试设备-2024.5.10

力扣题目&#xff1a;统计已测试设备 题目链接: 2960.统计已测试设备 题目描述 代码思路 根据题目内容&#xff0c;第一感是根据题目模拟整个过程&#xff0c;在每一步中修改所有设备的电量百分比。但稍加思索&#xff0c;发现可以利用已测试设备的数量作为需要减少的设备电…

Spring底层入门(十)

1、内嵌tomcat boot框架是默认内嵌tomcat的&#xff0c;不需要手动安装和配置外部的 Servlet 容器。 简单的介绍一下tomcat服务器的构成&#xff1a; Catalina&#xff1a; Catalina 是 Tomcat 的核心组件&#xff0c;负责处理 HTTP 请求、响应以及管理 Servlet 生命周期。它包…

Vitis HLS 学习笔记--理解串流Stream(1)

目录 1. 介绍 2. 示例 2.1 代码解析 2.2 串流数据类型 2.3 综合报告 3. 总结 1. 介绍 在Vitis HLS中&#xff0c;hls::stream是一个用于在C/C中进行高级合成的关键数据结构。它类似于C标准库中的std::stream&#xff0c;但是专门设计用于硬件描述语言&#xff08;如Veri…

基于springboot实现贸易行业crm系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现贸易行业crm系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于springboot的贸易行业crm系统的开发全过程。通过分析基于springboot的贸易行业crm系统管理的不足&#xff0c;创建…

【栈】Leetcode 字符串解码

题目讲解 394. 字符串解码 算法讲解 这道题有四种情况&#xff1a;1.遍历的时候遇到数字&#xff0c;我们计算并保存数字&#xff0c;将它加入到数字栈中&#xff1b;2.遍历的时候遇到[&#xff0c;我们就把字符保存&#xff0c;加入到字符栈中&#xff1b;3.当遇到]&#x…

如何远程控制另一部手机:远程控制使用方法

在现今高科技的社会中&#xff0c;远程控制手机的需求在某些情境下变得越来越重要。不论是为了协助远在他乡的家人解决问题&#xff0c;还是为了确保孩子的在线安全&#xff0c;了解如何实现这一功能都是有益的。本文将为您简要介绍几种远程控制手机的方法及其使用要点。 KKVi…

交直流充电桩检测有哪些实验项目

交直流充电桩检测是为了保证充电桩的正常运行和使用安全&#xff0c;对充电桩的各项性能进行检测的过程。 1. 充电功能检测&#xff1a;检测充电桩的充电功能是否正常&#xff0c;包括充电电流、电压、功率等参数的测量和调整&#xff0c;以及充电过程中的故障诊断和处理。 2.…

2024年4月24日华为春招实习试题【三题】-题目+题解+在线评测,2024.4.24,华为机试

2024年4月24日华为春招实习试题【三题】-题目题解在线评测&#xff0c;2024.4.24&#xff0c;华为机试 &#x1f3e9;题目一描述&#xff1a;输入格式输出格式样例1样例2样例3数据范围解题思路一&#xff1a;dfs解题思路二&#xff1a;直接二分查找哇&#xff01;解题思路三&am…