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

ops/2024/9/24 8:24:28/

目录

总结放开头

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();

显示通知

java">notificationManager.notify(1, notification);

通知消失

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

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

3、补充通知渠道:

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

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

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

通知渠道重要程度

java">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.ppmy.cn/ops/39506.html

相关文章

AI“源神”启动!Llama 3发布,开闭源之争战局生变

在AI的世界里&#xff0c;开源与闭源的较量一直是科技界的热门话题。 今年年初&#xff0c;埃隆马斯克在对OpenAI及其CEO萨姆奥特曼提起诉讼时&#xff0c;就对OpenAI逐渐不公开其模型研究相关细节的行为大加谴责。“时至今日&#xff0c;OpenAI公司网站还宣称&#xff0c;它的…

MongoDB聚合运算符:$toHashedIndexKey

MongoDB聚合运算符&#xff1a;$toHashedIndexKey 文章目录 MongoDB聚合运算符&#xff1a;$toHashedIndexKey语法举例角度的双曲正切 $toHashedIndexKey计算并返回输入表达式的哈希值&#xff0c;其使用的哈希函数与MongoDB创建哈希索引相同。哈希函数将键值或字符串映射到固定…

Git命令Gitee注册idea操作git超详细

文章目录 概述相关概念下载和安装常见命令远程仓库介绍与码云注册创建介绍码云注册远程仓库操作关联拉取推送克隆 在idea中使用git集成add和commit差异化比较&查看提交记录版本回退及撤销与远程仓库关联 push从远程仓库上拉取&#xff0c;克隆项目到本地创建分支切换分支将…

JSON-server 服务的搭建

1、全局安装&#xff1a; pnpm i -g json-server2、创建db.json文件 {"posts": [{"id": 1,"title": "json-server","author": "typicode"}],"comments":[{"id": 1,"body": "…

QT day5 作业

服务器头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QList> //链表类 #include <QMessageBox> //消息对话框类 #include <QDebu…

Linux常见指令(二)

Linux下的基本指令大全 下面将Linux指令分成9种不同的主要类别&#xff1a; 文件管理指令&#xff1a;这些指令用于文件和目录的创建、编辑、复制、移动和删除。例如&#xff1a;ls&#xff08;列出目录内容&#xff09;&#xff0c;cp&#xff08;复制文件或目录&#xff09;…

2024云生成式AI手机产业白皮书

来源&#xff1a;MediaTek&Counterpoint&阿里 2022年11月30日&#xff0c;ChatGPT上线&#xff0c;并迅速获得追捧。这场最初由ChatGPT引发的生成式AI浪潮&#xff0c;让全球消费者惊讶于大语言模型&#xff08;LLM&#xff09;所带来的全新人机交互体验的同时&#x…

iOS 侧滑手势的打开关闭

方法一&#xff1a; 参考文章&#xff1a;点这里 方法二&#xff1a; - (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];[self.navigationController.navigationBar setHidden:NO];//在其他离开改页面的方法同样加上下面两句代码self.isTapBac…