RemoteViews的原理

简介: RemoteViews支持在其他进程显示和更新View,由于RemoteViews没有findViewById的方法,因为它是远程的View,即使有findViewById我们也不知道远程app的资源文件id  所以如果想要更新View的内容 就要使用RemoteViews提供的一系列set方法:RemoteViews方法RemoteViews每调用用一个set方法都会添加一个Action到Action列表中,Action也是序列化的,也可以通过Binder传到远程。

RemoteViews支持在其他进程显示和更新View,由于RemoteViews没有findViewById的方法,因为它是远程的View,即使有findViewById我们也不知道远程app的资源文件id  所以如果想要更新View的内容 就要使用RemoteViews提供的一系列set方法:

img_e9f0ebed2b98b2dd8385f6e0e040f4e7.png
RemoteViews方法

RemoteViews每调用用一个set方法都会添加一个Action到Action列表中,Action也是序列化的,也可以通过Binder传到远程。当执行Notification的notify方法后,就会调用RemoteView的apply方法,该方法会遍历每个Action,执行Action的 apply函数,apply函数会通过反射的方式调用RemoteViews的子子view的method,并进行设置,从而完成布局更新。

进程的通信一般基于Binder机制,在使用RemoteViews的时候将RemoteViews传给远程进程,所以RemoteViews是可以序列化的,系统会根据RemoteViews的包名,去创建Inflater类,并根据layoutId创建出view,然后应用apply方法来更新布局的内容。理论上Binder可以支持View的所有操作,但是太麻烦,需要提供更多的IPC操作,降低IPC的效率。所以Android系统在实现界面更新的时候没有每调用一次set操作就进行一次IPC操作,而是在调用诸如NotificationManager的notify的时候,进行批量更新。例如,如下代码创建一个RemoteViews并设置TextView。

img_d875c1a3da29178f49620dad15b24f27.png
RemoteViews用法

在调用setTextViewText的时候,RemoteViews的方法如下:

img_2747a6bcd5abf566bae7da2a6015f129.png
setTextViewText

上面代码将setTextViewText转换成一个ReflectionAction,包含了textview_id、setText方法、value值。当调用appWidgetManager.updateAppWidget的时候就将remoteViews提交给远程进程,之后远程进程会执行RemoteViews的apply方法,如下所示:

img_21e3432f7cdb52cf5591c7975433254a.png
RemoteViews.apply

RemoteViews的apply方法分为以下几步:

1、获取RemoteViews对象

2、获取Inflater布局加载服务

3、根据RemoteViews中的layoutId,加载布局

执行RemoteViews的performApply,执行Action列表的所有apply操作,进行View更新

img_b7f2065cd634fe14b870a198a0767168.png
performApply

参数root也就是RemoteViews的layoutId对应的父view,viewId也就是要查找的子view,这里就是id为text_1的TextView,Action的apply方法首先find出TextView,然后反射调用他的setText方法,进行value设置。

RemoteViews的apply和reapply的区别,apply多了一个创建布局的步骤,即创建Inflater后再inflate布局,之后再加载内容;而replay只会更新布局,不会创建新的布局。

目录
相关文章
|
存储 缓存 网络协议
你只会用 Java Sockets?推荐 11 个开源的 Java Socket 框架
你只会用 Java Sockets?推荐 11 个开源的 Java Socket 框架
2272 0
|
6月前
|
人工智能 自然语言处理 前端开发
API赋能:从大模型到智能应用的“最短路径”
在AI技术迅猛发展的今天,大模型已成为智能应用的核心驱动力。本文探讨如何通过API这一“数据桥梁”,高效对接大模型,实现智能应用开发。内容涵盖API的核心价值、分类与适用场景,API对接的关键实践步骤,以及如何通过前后端分离、AI Agent和低代码平台等新范式提升开发效率。结合医疗影像分析与智能教育平台等案例,展示API如何改变传统开发模式。展望未来,随着模型即服务(MaaS)和智能化API的发展,智能应用开发将迈向更广阔的新时代。
|
10月前
|
Prometheus 监控 算法
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
|
11月前
|
自然语言处理 搜索推荐 小程序
微信公众号接口:解锁公众号开发的无限可能
微信公众号接口是微信官方提供的API,支持开发者通过编程与公众号交互,实现自动回复、消息管理、用户管理和数据分析等功能。本文深入探讨接口的定义、类型、优势及应用场景,如智能客服、内容分发、电商闭环等,并介绍开发流程和工具,帮助运营者提升用户体验和效率。未来,随着微信生态的发展,公众号接口将带来更多机遇,如小程序融合、AI应用等。
|
8月前
|
Android开发 开发者
Android中Dialog位置+样式的设置
本文介绍了在Android开发中如何设置Dialog的位置和样式。通过自定义`MyDialog`类,可以灵活调整Dialog的显示位置,例如将其固定在屏幕底部,并设置宽度匹配父布局。同时,文章还展示了如何模仿Android原生Dialog样式,通过定义`MyDialogStyle`去除标题栏、设置背景透明度、添加阴影效果以及配置点击外部关闭等功能,从而实现更加美观和符合需求的Dialog效果。代码示例详细,便于开发者快速上手实现。
424 2
|
11月前
|
机器学习/深度学习 人工智能
Diffusion-DPO:一种基于直接偏好优化的扩散模型对齐新方法
本文介绍了一种名为 Diffusion-DPO 的创新方法,该方法基于直接偏好优化(DPO)原理,简化了扩散模型与人类偏好的对齐过程。相比传统的基于人类反馈的强化学习(RLHF)方法,Diffusion-DPO 避免了显式奖励模型的训练,通过数学近似简化实现流程,并在处理开放词汇表场景时展现出更强的能力。实验结果表明,该方法在 Stable Diffusion 1.5 和 SDXL-1.0 等主流模型上显著提升了生成图像的质量和可控性,为未来扩散模型的发展提供了新的思路。
882 14
Diffusion-DPO:一种基于直接偏好优化的扩散模型对齐新方法
|
存储 人工智能 算法
数据安全与隐私保护在人工智能时代的挑战与应对
随着人工智能技术的快速发展,数据安全和隐私保护问题日益凸显。本文将探讨在人工智能时代下,数据安全面临的挑战以及如何有效应对,为保护用户数据和维护信息安全提供新思路。
1945 13
|
Python Windows
Anaconda最新版详细安装教程
Anaconda最新版详细安装教程
695 0
|
NoSQL 关系型数据库 MySQL
Redis入门到通关之Redis实现Session共享
Redis入门到通关之Redis实现Session共享
587 0
|
存储 Java 程序员
图解,深入浅出带你理解ThreadLocal
图解,深入浅出带你理解ThreadLocal
1902 0
图解,深入浅出带你理解ThreadLocal