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

news2024/11/18 11:28:00

目录

总结放开头

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 {
        //注册EventBus
        EventBus.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.coloradmin.cn/o/1664917.html

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

相关文章

Linux下安装mysql8.0(以rpm包安装)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; Linux下安装mysql8.0&#xff08;以rpm包安装&#xff09;https://myweb.myskillstree.cn/125.html 目录 1、查操作系统信息 2、下载mysql 8.0.34的rpm包 …

JWT深入浅出

文章目录 JWT深入浅出1.JWT是什么2.为什么选JWT2.1 传统Session认证2.2 JWT认证 3.JWT怎么用4. jwt绝对安全吗&#xff1f; JWT深入浅出 1.JWT是什么 JWT&#xff08;JSON Web Token&#xff09;是一种用于在网络应用间传递信息的开放标准&#xff0c;通常用于身份认证和非敏…

LagentAgentLego智能体工具使用

1. lagent 参考文档 https://github.com/InternLM/Tutorial/blob/camp2/agent/lagent.md 使用 LMDeploy 部署 conda activate agent lmdeploy serve api_server /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-7b \--server-name 127.0.0.1 \--model-name in…

WebSocket前后端建立以及使用

1、什么是WebSocket WebSocket 是一种在 Web 应用程序中实现双向通信的协议。它提供了一种持久化的连接&#xff0c;允许服务器主动向客户端推送数据&#xff0c;同时也允许客户端向服务器发送数据&#xff0c;实现了实时的双向通信。 这部分直接说你可能听不懂&#xff1b;我…

线路和绕组中的波过程(三)

本篇为本科课程《高电压工程基础》的笔记。 本篇为这一单元的第三篇笔记。上一篇传送门。 冲击电晕对线路上波过程的影响 实际中的导线存在电阻&#xff0c;而且还有对地电导&#xff0c;会消耗一部分能量。但是因为雷击所涉及的传输距离很短&#xff0c;所以几乎可以忽略这…

acer笔记本怎样进行系统还原?教你两招!

acer笔记本怎样进行系统还原&#xff1f;教你两招&#xff01; 作为笔记本用户&#xff0c;你在日常使用中可能会遇到各种各样的电脑问题。一般来说&#xff0c;对于一些小问题&#xff0c;我们可以通过一些简单的操作来解决&#xff0c;比如重新启动电脑或者长按电源键强制关机…

【吴恩达机器学习-week2】多个变量的线性回归问题

文章目录 1.1 目标2 问题陈述2.1 包含我们示例的矩阵 X2.2 参数向量 w \mathbf{w} w 和 b b b 3 使用多个变量进行模型预测3.1 逐元素单独预测3.2 单一预测&#xff0c;向量 4 使用多个变量计算成本5 使用多个变量的梯度下降5.1 使用多个变量计算梯度 多个变量的梯度下降小结…

卷积特征图与感受野

特征图尺寸和感受野是卷积神经网络中非常重要的两个概念&#xff0c;今天来看一下&#xff0c;如何计算特征尺寸和感受野。 特征图尺寸 卷积特征图&#xff0c;是图片经过卷积核处理之后的尺寸。计算输出特征的尺寸&#xff0c;需要给出卷积核的相关参数包括&#xff1a; 输…

虚表,虚函数习题

6. 关于虚表说法正确的是&#xff08;d &#xff09; A&#xff1a;一个类只能有一张虚表 多重继承 B&#xff1a;基类中有虚函数&#xff0c;如果子类中没有重写基类的虚函数&#xff0c;此时子类与基类共用同一张虚表 即使子类重写了基类的虚函数&#xff0c;此时子类与…

模拟集成电路(3)----单级放大器(共源极)

模拟集成电路(3)----单级放大器&#xff08;共源极&#xff09; 放大是模拟电路的基本功能 大多数自然模拟信号太小而无法处理需要足够的信噪比 理想的放大器 线性&#xff1a;无限的幅度和频率范围 输入阻抗无限大 输出阻抗无限小 共源放大器 共源放大器就是将源极接A…

视频监控系统中,中心录像服务器的录像文件实际大小和理论值相差很大的问题解决

目录 一、现象描述 二、视频监控的录像文件计算 &#xff08;一&#xff09;计算方法 1、仅视频部分 2、视频和音频部分 3、使用平均码率 &#xff08;二&#xff09;计算工具 1、关注威迪斯特公众号 2、打开“计算容量”的小工具 三、原因分析 &#xff08;一&…

企业网络需求及适合的解决方案

近年来&#xff0c;企业网络通信需求可谓五花八门&#xff0c;变幻莫测。它不仅为企业的生产、办公、研发、销售提供全面赋能&#xff0c;同时也让企业业务规模变大成为了可能。 在当前的技术格局下&#xff0c;中大型企业常见的技术方案有很多&#xff0c;而同时也有各自不可替…

超级好看的html网站维护源码

源码介绍 好看的html网站维护源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c; 源码截图 源码下载 好看的html网站维护源码

【力扣】LCR 166.珠宝的最高价值

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 目录 1.题目描述 2.思路分析 3.代码实现 1.题目描述 现有一个记作二维矩阵 frame 的珠宝架&#xff0c;其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为&#xff1a; 只能从架子的左上角开始拿珠宝…

《Python编程从入门到实践》day25

# 昨日知识点回顾 如何创建多行外星人 碰撞结束游戏 创建game_stats.py跟踪统计信息 # 今日知识点学习 第14章 记分 14.1 添加Play按钮 14.1.1 创建Button类 import pygame.font# button.py class Button:def __init__(self, ai_game, msg):"""初始化按钮…

按键配合LDO实现开关功能

今天给大家分享一个学到的按键开关电路&#xff0c;适合没有足够空间给自锁开关的场景&#xff0c;既可以用于USB供电控制也可以用于电池供电控制。话不多说上电路图先。 核心任务就是通过按键控制LDO芯片的使能管脚的电平状态&#xff0c;这枚NCP芯片高电平使能&#xff0c;VB…

基于Nios软件实现流水灯+串口输出

基于NIOS-II软核实现流水灯串口输出 引言&#xff1a; ​ 在现代电子设计领域&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;因其灵活性和并行处理能力而成为实现复杂数字系统的首选平台。Nios II&#xff0c;作为Altera&#xff08;现为Intel旗下&#xff09;提供…

2016-2021年全国范围的2.5m分辨率的建筑屋顶数据

一、论文介绍 摘要&#xff1a;大规模且多年的建筑屋顶面积&#xff08;BRA&#xff09;地图对于解决政策决策和可持续发展至关重要。此外&#xff0c;作为人类活动的细粒度指标&#xff0c;BRA可以为城市规划和能源模型提供帮助&#xff0c;为人类福祉带来好处。然而&#xf…

WordPress原创插件:超链接点击访问统计

WordPress原创插件&#xff1a;超链接点击访问统计 https://download.csdn.net/download/huayula/89296775

ICode国际青少年编程竞赛- Python-4级训练场-while语句综合

ICode国际青少年编程竞赛- Python-4级训练场-while语句综合 1、 for i in range(4):while not Flyer[i].disappear():wait()Spaceship.step(6)Spaceship.turnLeft()2、 Dev.turnLeft() for i in range(4):Spaceship.step(2)while Flyer[i].disappear():wait()Dev.step(4)Dev.…