Shield——开源的移动端页面模块化开发框架

一直以来,如何能更高效地开发与维护页面是Android与iOS开发同学最主要的工作和最关心的问题。随着业务的不断发展,根据特定业务场景产生的定制化需求变得越来越多。单一页面往往需要根据不同业务、不同场景甚至不同用户展示不同的内容。在这样的背景下,我们开始考虑对页面进行切分,把一个页面切分成多个模块,以提高复杂页面的可维护性。

各种不同的定制化页面如下:

Shield是美团点评到店综合团队模块化UI界面解决方案,它不仅仅是一个Native(Android&iOS)的UI开发框架,还是到店综合团队基于自身复杂的业务场景沉淀出来的UI开发最佳实践。它具备高可复用、容易协同开发等特性,还包括后端动态配置、动态模块等一系列解决方案,目前已经在GitHub上开源:https://github.com/Meituan-Dianping/Shield。

在Shield框架里,页面是由一个个模块(Agent)组成的。模块是页面中粗粒度的抽象组件,包含部分页面UI展示和与之相关的业务逻辑。这些模块按线性的方式排布在页面中,可以很灵活地调换位置且互不影响。每个模块都有自己独立的生命周期,可以单独通过网络获取数据、渲染视图等等。

每一个模块都有自己独立的逻辑和UI,模块之间完全解耦,这样就可以很方便地通过排列模块来完成不同的页面定制化需求,使一个页面可以展示不同的内容。同时,由于模块并不依赖某一具体页面,模块也可以在不同的页面之间进行复用。

不同于MVP或是MVVM的设计模式,Shield的模块化拆分方式根据视图和业务逻辑对页面进行横向切分。模块化的拆分与MVP等架构方式的拆分并不冲突。开发者完全可以在Shield的某个模块里运用MVP或MVVM的架构方式,来对页面的逻辑进行进一步的拆分以提升代码复用性,使模块逻辑变得更加清晰。

为了更好地抽象UI界面开发的各种场景,Shield框架赋予了模块完整的页面能力,包括完整的页面生命周期和上下文环境(Context)等。这样模块的开发方式与原有的页面开发方式完全一致,页面不再关心具体的UI展现,而是把这些都交给模块。同时模块可以单独开发维护,运行在任意接入了Shield框架的页面中。

以下是模块Agent的接口定义:

public interface AgentInterface {void onCreate(Bundle savedInstanceState);void onStart();void onResume();void onPause();void onStop();void onDestroy();Bundle saveInstanceState();void onActivityResult(int requestCode, int resultCode, Intent data);String getIndex();void setIndex(String index);String getHostName();void setHostName(String hostName);SectionCellInterface getSectionCellInterface();String getAgentCellName();
}

一个Agent模块的结构主要包含两部分: 1. 生命周期回调。 2. 提供一个SectionCellInterface。

其中,SectionCellInterface是模块的视图逻辑抽象。一个模块可以为页面提供一个连续的包含多块(Section)的UI片段,每一块视图可以是视觉上的单行(Row)视图,也可以是多行视图。具体的接口定义如下:

public interface SectionCellInterface {int getSectionCount();int getRowCount(int sectionPosition);int getViewType(int sectionPosition, int rowPosition);int getViewTypeCount();View onCreateView(ViewGroup parent, int viewType);void updateView(View view, int sectionPosition, int rowPosition, ViewGroup parent);}

有了模块承担绝大部分的页面逻辑,Shield框架中的页面就变成了一个单纯的模块容器。页面通过不同的模块配置(Config)来灵活改变自己的视图展现,同时在模块配置(Config)中,定义了模块的位置信息,这样除了本地配置之外,Shield框架也可以很容易就能支持后端动态下发模块配置,以达到客户端的一定动态性。

在接入了Shield框架的页面中,还有两个比较重要的角色,分别是模块管理器(AgentManager)和视图管理器(CellManager)。

其中,模块管理器(AgentManager)负责模块的创建、销毁、生命周期分发等工作。而视图管理器(CellManager)则负责将模块所提供的视图片段(SectionCellInterface)有序地添加到页面中,并在适当的时候对这些视图进行更新。

在某些场景下,页面中的一些视图片段会根据用户操作发生一些联动。而当这些视图片段处于不同的模块中时,这些模块就需要进行通信。

在这种情况下,如果让模块与模块直接进行交互,就无法避免模块之间的耦合,这样既无法保证模块的独立性,也影响可复用性。于是我们基于RxJava设计实现了观察者模式的白板组件,在Shield框架中称之为WhiteBoard。WhiteBoard在一个页面中唯一,所有模块共享,模块之间或是模块与页面的通信都通过WhiteBoard来进行。

灵活配置

只要把模块配置放到远端,通过统一的配置后台进行配置,就可以很轻松地实现App中各个页面一定的动态化特性,无需借助其它插件化、热补丁等方案。

下图便是美团点评开发的页面模块配置后台:

多端统一

我们通过提供多端统一的模块化框架,减少开发者在不同平台的视觉实现差异上耗费的精力,从而将精力集中于如何实现具体的视图片段。Shield框架针对Native开发中常见的画分隔线、loading动画等一系列场景做了抽象,为模块提供了丰富的定制化功能,简化了App开发过程中占比较高的视图开发工作。

动态化

模块化框架对模块的业务和视图逻辑行为都做了一定的抽象,这样,ReactNative一类的动态化方案不仅可以运用到视图绘制层面上,同时也可以通过不同的JSBridge实现模块业务逻辑的动态化。而配置后台不仅可以动态调整模块,同时可以动态调整模块的内部展示,这样整个模块化框架可以通过配置后台实现不同粒度的页面动态化方案。有关动态模块的相关方案,后续将另文详述。

页面混排与稳定性

借助于模块化框架,可以有效地降低诸如ReactNative等开源框架的接入成本,无需对整个页面进行改造,而是在模块级的粒度上进行快速试错,有效控制影响范围,提升页面整体的稳定性。

我们还在逐步建设围绕模块化框架的工具链及生态圈,包括基于模块的自动化测试、声明式打点、动态化等项目。

在美团点评的多业务线运营背景下,大部分页面通过Activity+Fragment+Agent的模块化架构支撑了大量的业务差异化定制需求。同时我们结合业务特点,沉淀了列表型模块、Tab锚点型模块等多种组件型模块。除了提升开发效率外,模块化框架在我们针对各业务解耦、跨Team协同开发等方面也扮演了重要的角色。

希望大家多多支持我们的开源项目Shield,也欢迎大家多提意见,互相交流移动端架构方面的经验与心得。

美团点评到店综合前端研发中心招聘,大量职位open。 1. 前端研发工程师。 2. Node开发工程师。 3. iOS/Android客户端开发工程师。

欢迎实习生(2019年及以后毕业)、2018年毕业生及社招同学踊跃投递简历。

工作描述: 1. 负责各业务前端研发工作,涵盖Mobile Web、小程序、App、自研硬件等多终端平台。 2. 负责前端开发、测试、上线、监控系统研发。 3. 负责开放平台、第三方开发者平台系统构建及研发。

有意者请邮件至:nihao#meituan.com。

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

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

相关文章

1年排名前进13位 ,这个论题成顶会新宠!

写过论文的同学都知道,写久了真的会头秃,其中耗发量最高的当属论题和创新点。今天分享一套方法,这个方法已经帮助近3000位同学成功发(拯)表(救)论(头)文(发&a…

LeetCode 50. Pow(x, n)(二分查找)

文章目录1. 题目2. 二分查找2.1 递归2.2 循环1. 题目 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数。 示例 输入: 2.00000, 10 输出: 1024.00000 示例 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 1/22 1/4 0.25 说明: -100.0 < x < 100.0 n 是 32 位有符号…

OpenKG 祝大家 2021 新年快乐 —「2020 精选文章汇编」

过去的一年是不寻常的一年&#xff0c;虽然疫情改变了所有人的生活&#xff0c;但是它并没有击垮我们。这一年&#xff0c;大家依旧保持着开源开放的精神&#xff0c;持续地分享着知识图谱领域的技术动态、应用实践&#xff0c;同学们也持续不断地输出优质的论文笔记。OpenKG 继…

智能分析最佳实践——指标逻辑树

所有业务都会面对“为什么涨、为什么降、原因是什么&#xff1f;”这种简单粗暴又不易定位的业务问题。为了找出数据发生异动的原因&#xff0c;业务人员会通过使用多维查询、dashboard等数据产品锁定问题&#xff0c;再辅助人工分析查找问题原因&#xff0c;这个过程通常需要一…

论文浅尝 - EMNLP2020 | 图结构对于多跳问答而言必要吗?

笔记整理 | 陈卓&#xff0c;浙江大学计算机科学与技术系&#xff0c;博士研究生研究方向 | 知识图谱&#xff0c;图神经网络&#xff0c;多模态论文链接&#xff1a;https://www.aclweb.org/anthology/2020.emnlp-main.583.pdf发表会议&#xff1a;EMNLP 2020背景提要抽取式阅…

为什么每次有人大声通电话时,我就很烦躁...

文 | Chaos编 | 小戏不知你是否有过这样的体验&#xff0c;当你周围有人在大声讲电话时&#xff0c;你会不自觉的感觉到烦躁。为什么呢&#xff1f;有一种委婉的说法是因为你听到了不完整的对话。直白点说其实就是讲电话的人通过放大声音强行让你接收了他说的信息&#xff0c;但…

LeetCode 367. 有效的完全平方数(二分查找)

1. 题目 给定一个正整数 num&#xff0c;编写一个函数&#xff0c;如果 num 是一个完全平方数&#xff0c;则返回 True&#xff0c;否则返回 False。 说明&#xff1a;不要使用任何内置的库函数&#xff0c;如 sqrt。 示例 1&#xff1a; 输入&#xff1a;16 输出&#xff1…

美团点评联盟广告场景化定向排序机制

在美团点评的联盟广告投放系统&#xff08;DSP&#xff09;中&#xff0c;广告从召回到曝光的过程需要经历粗排、精排和竞价及反作弊等阶段。其中精排是使用CTR预估模型进行排序&#xff0c;由于召回的候选集合较多&#xff0c;出于工程性能上的考虑&#xff0c;不能一次性在精…

论文浅尝 - COLING2020 | 一种用于跨语言实体对齐的上下文对齐强化跨图谱注意力网络...

笔记整理 | 谭亦鸣&#xff0c;东南大学博士生来源&#xff1a;COLING 2020链接&#xff1a;https://www.aclweb.org/anthology/2020.coling-main.520.pdf本文发现&#xff0c;目前基于GCN的对齐方法都是分别考虑两个KG&#xff0c;然后分别学习它们的embedding&#xff0c;并认…

LeetCode 744. 寻找比目标字母大的最小字母(二分查找)

1. 题目 给定一个只包含小写字母的有序数组letters 和一个目标字母 target&#xff0c;寻找有序数组里面比目标字母大的最小字母。 数组里字母的顺序是循环的。举个例子&#xff0c;如果目标字母target ‘z’ 并且有序数组为 letters [‘a’, ‘b’]&#xff0c;则答案返回…

超越YOLOv5,1.3M超轻量,高效易用,这个目标检测开源项目太香了!

这个目标检测神器简直香炸了&#xff01;它不仅连续登录Github全球趋势榜&#xff0c;拥有的全球尖端算法论文也接连登录全球技术趋势榜PaperWithCode。这个神器就是刚刚全面升级的PaddleDetection2.0&#xff01;它全面兼顾高性能算法、便捷开发、高效训练及完备部署&#xff…

MyFlash——美团点评的开源MySQL闪回工具

由于运维、DBA的误操作或是业务bug&#xff0c;我们在操作中时不时会出现误删除数据情况。早期要想恢复数据&#xff0c;只能让业务人员根据线上操作日志&#xff0c;构造误删除的数据&#xff0c;或者DBA使用binlog和备份的方式恢复数据&#xff0c;不管那种&#xff0c;都非常…

论文浅尝 - ACL2020 | 用于多媒体事件提取的跨媒体结构化公共空间

笔记整理 | 王琰&#xff0c;东南大学来源&#xff1a;ACL 2020链接&#xff1a;https://arxiv.org/pdf/2005.02472.pdf概述本论文引入一项新任务&#xff1a;多媒体事件提取&#xff08;ME&#xff09;&#xff0c;该任务旨在从多模态中抽取出事件和其论点(M2E2)。此外&#x…

屠榜CV还不是这篇论文的终极目标,它更大的目标其实是……

文 | 魏旭编 | 橙橙子&#xff0c;小戏当 BERT 模型出来之后&#xff0c;Transformer 架构基本成为 NLP 任务的底色。诸如 Roberta、XLNet、ELECTRA、GPT3 等刷榜各类 NLP 任务的模型&#xff0c;无一不是基于 Transformer 框架。无疑&#xff0c;Transformer 开启了 NLP 的统治…

day01『NLP打卡营』实践课1:词向量应用演示

Day01 词向量作业辅导 本教程旨在辅导同学如何完成 AI Studio课程——『NLP打卡营』实践课1&#xff1a;词向量应用展示 课后作业。 1. 选择词向量预训练模型 在PaddleNLP 中文Embedding模型查询PaddleNLP所支持的中文预训练模型。选择其中一个模型&#xff0c;如中文维基百…

流计算框架 Flink 与 Storm 的性能对比

1. 背景 Apache Flink 和 Apache Storm 是当前业界广泛使用的两个分布式实时计算框架。其中 Apache Storm&#xff08;以下简称“Storm”&#xff09;在美团点评实时计算业务中已有较为成熟的运用&#xff08;可参考 Storm 的可靠性保证测试&#xff09;&#xff0c;有管理平台…

论文浅尝 - AAAI2021 | 基于对比学习的三元组生成式抽取方法

作者 | 叶宏彬&#xff0c;浙江大学博士研究生&#xff0c;研究方向&#xff1a;知识图谱、自然语言处理接收会议 | AAAI2021论文链接 | https://arxiv.org/pdf/2009.06207.pdf摘要在自然语言处理和知识图谱领域的信息提取中&#xff0c;三元组抽取是必不可少的任务。在本文中&…

LeetCode 101. 对称二叉树(递归循环)

1. 题目 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。1/ \2 2/ \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ \2 2\ \3 3来源&#xff1a;力扣&#xff08;LeetCode&#x…

剑桥大学终身教授T.S.:7大机器学习算法与应用案例

机器学习和人工智能可被应用在文本翻译、面部检测和识别、自动驾驶汽车和诸如国际象棋和围棋一类的极为复杂的控制类游戏等领域&#xff0c;其最新发展日益受到越来越高的关注。本次为大家推荐的科研项目&#xff0c;还是来自于ViaX盐趣&#xff0c;导师是来自剑桥大学计算机系…