Android中桌面小部件framework层使用到的设计模式
在Android中,桌面小部件(App Widget)的Framework层采用了多种设计模式,以实现模块化、可维护性和高效的交互。

以下是Android桌面小部件Framework层中常用的设计模式及其具体应用:
1. 观察者模式(Observer Pattern)
应用场景
- 数据更新通知:小部件需要根据数据变化实时更新显示内容。例如,当天气信息更新时,天气小部件需要刷新界面。
实现方式
- AppWidgetProvider 类充当观察者,通过重写其回调方法(如 onUpdate、onReceive)来响应数据或系统事件的变化。
- BroadcastReceiver 用于监听系统广播(如时间变化、网络状态变化),从而触发小部件的更新。
示例
public class MyAppWidgetProvider extends AppWidgetProvider {@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {// 更新小部件的逻辑}@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);// 处理特定的广播事件}
}
2. 单例模式(Singleton Pattern)
应用场景
- 管理全局状态:如AppWidgetManager,用于管理所有小部件的实例和更新。
实现方式
- AppWidgetManager 类采用单例模式,确保在应用程序的整个生命周期内只有一个实例,提供统一的接口来管理小部件。
示例
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
3. 工厂模式(Factory Pattern)
应用场景
- 创建小部件视图:根据不同的小部件类型创建相应的视图对象。
实现方式
- 使用RemoteViews来构建小部件的布局,RemoteViews本身可以看作是工厂模式的一个应用,根据布局资源动态创建视图。
示例
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
appWidgetManager.updateAppWidget(appWidgetId, views);
4. 命令模式(Command Pattern)
应用场景
- 处理用户交互:如用户点击小部件上的按钮,触发相应的操作。
实现方式
- 通过PendingIntent将用户的点击事件封装为命令,发送到BroadcastReceiver或Activity,然后执行具体的操作。
示例
Intent intent = new Intent(context, MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
5. 适配器模式(Adapter Pattern)
应用场景
- 数据绑定:将数据源适配到小部件的视图中,例如在集合型小部件中显示列表项。
实现方式
- 使用RemoteViewsService和RemoteViewsFactory作为适配器,将数据源转换为RemoteViews对象,以供小部件显示。
示例
public class MyRemoteViewsService extends RemoteViewsService {@Overridepublic RemoteViewsFactory onGetViewFactory(Intent intent) {return new MyRemoteViewsFactory(this.getApplicationContext(), intent);}
}public class MyRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {// 实现数据绑定逻辑
}
6. 模型-视图-控制器(MVC)模式
应用场景
- 结构化设计:将小部件的业务逻辑、数据和视图分离,提高代码的可维护性和可扩展性。
实现方式
- 模型(Model):负责数据的获取和处理,如从网络或本地数据库获取数据。
- 视图(View):通过RemoteViews定义小部件的UI布局。
- 控制器(Controller):AppWidgetProvider和相关组件负责协调模型和视图之间的交互。
示例
public class MyAppWidgetProvider extends AppWidgetProvider {@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {// 控制器逻辑:获取数据(模型)并更新视图DataModel data = DataModel.getInstance();RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);views.setTextViewText(R.id.textView, data.getData());appWidgetManager.updateAppWidget(appWidgetId, views);}
}
7. 委托模式(Delegation Pattern)
应用场景
- 任务分发:将特定的任务委托给专门的组件处理,如数据同步或网络请求。
实现方式
- 使用服务(Service)或后台任务将复杂的操作委托出去,保持AppWidgetProvider的简洁。
示例
public class MyAppWidgetProvider extends AppWidgetProvider {@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {Intent intent = new Intent(context, MySyncService.class);context.startService(intent);}
}
8. 桥接模式(Bridge Pattern)
应用场景
- 分离抽象和实现:在支持多种小部件类型时,通过桥接模式分离小部件的抽象层和具体实现。
实现方式
- 定义一个抽象类或接口作为小部件的抽象层,不同的具体实现类负责具体的功能实现。
示例
public interface WidgetBehavior {void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId);
}public class WeatherWidgetBehavior implements WidgetBehavior {@Overridepublic void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {// 更新天气小部件的逻辑}
}public class NewsWidgetBehavior implements WidgetBehavior {@Overridepublic void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {// 更新新闻小部件的逻辑}
}public class MyAppWidgetProvider extends AppWidgetProvider {private WidgetBehavior behavior;public MyAppWidgetProvider(WidgetBehavior behavior) {this.behavior = behavior;}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {for (int appWidgetId : appWidgetIds) {behavior.updateWidget(context, appWidgetManager, appWidgetId);}}
}
总结
Android桌面小部件的Framework层通过采用多种设计模式,如观察者模式、单例模式、工厂模式、命令模式、适配器模式、MVC模式、委托模式和桥接模式,实现了高内聚、低耦合的架构。这些设计模式不仅提高了系统的可维护性和可扩展性,还确保了小部件能够高效、稳定地与系统和用户进行交互。在开发自定义小部件时,理解并应用这些设计模式,有助于编写出结构清晰、功能强大的应用。
相关文章:
Android中桌面小部件framework层使用到的设计模式
在Android中,桌面小部件(App Widget)的Framework层采用了多种设计模式,以实现模块化、可维护性和高效的交互。 以下是Android桌面小部件Framework层中常用的设计模式及其具体应用: 1. 观察者模式(Observe…...
【JavaEE进阶】HTML
本节⽬标 认识 HTML 的基本结构, 学习常⽤的 HTML 标签. 一 HTML基础 1.什么是HTML HTML(Hyper Text Markup Language), 超⽂本标记语⾔. 超⽂本: ⽐⽂本要强⼤. 通过链接和交互式⽅式来组织和呈现信息的⽂本形式. 不仅仅有⽂本, 还可能包含图⽚, ⾳频, 或者⾃已经审阅过它…...
ElasticSearch 添加IK分词器
ElasticSearch 添加IK分词器 前言一、IK分词器的算法二、Ik分词器的下载安装(Winows 版本)三、Ik分词器的下载安装(Linux 版本)四、验证测试(postman工具)测试 ik_smart 分词算法测试 ik_max_word 分词算法…...
可视化建模与UML《顺序图实验报告》
旷野的规则是永不回头。 一、实验目的: 1、熟悉顺序图的构件事物。 2、熟悉发送者与接受者的关系 3、熟练掌握描绘顺序图 4、加深对顺序图的理解和应用能力 二、实验环境: window7 | 10 | 11 EA15 三、实验内容: 据如下描述绘制顺序图&…...
Mac的极速文件搜索工具,高效管理文件
Mac的资源管理可以说是许多转Mac的朋友用不明白的一点了,访达怎么用,文件怎么找,为什么找不到,非常的头大 All作为Mac上的极速文件搜索管理工具,有效的为文件查找困难的用户解决难题 基于极速搜索引擎,快…...
公开仓库改私有再配置公钥后Git拉取仍需要输入用户名的问题
问题描述:git拉取私有仓库需要输入用户名和密码 我之前写了一个脚本用来定时自动拉取远程仓库更新本地仓库,后来将这个远程仓库改成私有后执行脚本就会需要输入用户名和密码。 [rootLH2020 ~]# ./sync_repo.sh 正在从远程仓库拉取最新更改… Username f…...
工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置
工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置...-CSDN博客 工作流初始错误 泛微提交流程提示_泛微OA 工作流WebService接口使用说明 工作流初始错误 泛微提交流程提示_泛微OA 工作流WebService接口使用说明-CSDN博客 工作…...
window下安装rust 及 vscode配置
安装 安装mingw64 (c语言环境 选择posix-ucrt) ucrt:通用c运行时库配置mingw64/bin的路径到环境变量中在cmd窗口中输入命令 "gcc -v" 4. 下载Rust安装程序 安装 Rust - Rust 程序设计语言 5. 配置rustup和cargo目录 (cargo是包管…...
【数据结构】【线性表】单链表1—概念即创建(附C语言源码)
单链表的定义, 链表用链式存储的方式实现线性表,链表中每个结点元素中需要指向下一个结点的指针(有时候也要指向上一个结点的指针),链表中的每个结点指针只指向下一结点的被叫为单链表。 单链表的创建和初始化 先定…...
centos7的maven配置
首先进入conf配置文件夹下的setting.xml 要改两个地方 第一:设置镜像源 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>c…...
day57 图论章节刷题Part08(拓扑排序、dijkstra(朴素版))
拓扑排序-117. 软件构建 思路:拓扑排序是经典的图论问题。给出一个有向图,把有向图转成线性的排序就叫拓扑排序,拓扑排序也要检测有向图是否有环,即存在循环依赖的情况,因为这种情况是不能做线性排序的,所…...
【Steam登录】protobuf协议逆向
https://api.steampowered.com/IAuthenticationService/GetPasswordRSAPublicKey/v1 搜索 input_protobuf_encoded定位 input_protobuf_encoded的值就是 o s r.SerializeBody() o i.iI(s) 精准定位 打上条件断点:t ‘Authentication.GetPasswordRSAPublicKey…...
git 对已提交的说明进行编辑
如果提交代码的时候,对上次提交代码的说明不准确的话,例如 1、可以使用 git log 查看代码提交的记录; 2、使用 git commit --amend 命令对上次提交的说明进行编辑: 当显示上次提交的内容的时候,按下键盘 i 键即可编辑…...
CTF —— 网络安全大赛
前言 💻随着大数据、人工智能的发展,人们步入了新的时代,逐渐走上科技的巅峰。 ⚔科技是一把双刃剑,网络安全不容忽视,人们的隐私在大数据面前暴露无遗,账户被盗、资金损失、网络诈骗、隐私泄露ÿ…...
【大数据测试spark+kafka-详细教程(附带实例)】
大数据测试:Spark Kafka 实时数据处理与窗口计算教程 1. 概述1.1 大数据技术概述1.2 Apache Kafka 与 Spark 的结合 2. 技术原理与流程2.1 Kafka 简介2.2 Spark Streaming 简介2.3 数据流动与处理流程 3. 环境配置3.1 安装依赖项 4. 实例:实时数据处理与…...
如何为 GitHub 和 Gitee 项目配置不同的 Git 用户信息20241105
🎯 如何为 GitHub 和 Gitee 项目配置不同的 Git 用户信息 引言 在多个代码托管平台(如 GitHub 和 Gitee)之间切换时,正确管理用户信息至关重要。频繁使用不同项目时,若用户配置不当,可能会导致意外提交或…...
【Lucene】原理学习路线
基于《Lucene原理与代码分析完整版》,借助chatgpt等大模型,制定了一个系统学习Lucene原理的计划,并将每个阶段的学习内容组织成专栏文章,zero2hero 手搓 Lucene的核心概念和实现细节。 深入的学习和专栏计划,覆盖Lucen…...
Go语言的并发安全与互斥锁
线程通讯 在程序中不可避免的出现并发或者并行,一般来说对于一个程序大多数是遵循开发语言的启动顺序。例如,对于go语言来说,一般入口为main,main中依次导入import导入的包,并按顺序执行init方法,之后在按…...
SpringBoot框架在资产管理中的应用
3系统分析 3.1可行性分析 通过对本企业资产管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本企业资产管理系统采用Spring Boot框架,JAVA作…...
ElasticSearch备考 -- 集群配置常见问题
一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动,日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
