基于android项目总结,Android 基于流程化设计的项目总结(一)

简介

各位好,近期回顾下以前的一些架构设计,准备总结一下。分享给其他开发者,希望碰碰架构设计思维,提升下自己。

首先 说说自己,本人2014年底参与Android开发工作,距今已经从事移动客户端开发几年了,所谓T型技能型发展,在深入地学习Android技能开发,再以后端、前端为辅拓展自己的开发思维(感谢下一路上帮过我的朋友们~)。

这次讲下自己之前参与SDK开发里,其中一块的功能:

模块主要负责接收后台下发的所有配置数据、电话本(大概8种数据类型)与负责鉴权SDK操作,并且整个流程必须是线性,不可中断且保持会话(session)一致的。

分析

无论写业务代码、还是写库代码,请写代码前多思考思考吧~

一、结构分层

根据需求,大概我们可以分为几个层次

database 层

这一层属于模块的Model层,专门负责数据操作层

network 层

这一层属于模块的网络访问层,专门负责网络请求,包括http与https、session会话保持、失败心跳请求等

process 层

这一层属于业务操作层,我将每个流程抽象成一个process(后面会说明),保持process可拓展性

util层

这一层主要是辅助工具,包括xmlObjTool、timeTool等

二、抽象

这里先大概描述下,在业务场景的每一层中抽象的原因,后面会详细讲下工作流程。

database 层

考虑到sdk是允许跨进程访问的,因此model层采用ContentProvider作为通信层。由于在该模块中下发的所有配置数据类型是多种的,这说明在存在一个DBHelper中,必然需要管理多个Dao。所以这里面如何在配合多个Dao中,与contentprovider进行多个监听协同工作?所以这里面首先在模块中抽象一个BaseRole,数据操作角色的工作模板。

network 层

该模块网络请求层不打算依赖第三方,因此直接使用apache包作为底层http请求层。至于抽象是比较好理解的,首先请求目标对于模块层是不需要理会的,模块关心的只是请求时、请求结果。因此无论是https、http,只需要抽象一个Iprotocol,负责请求seesion同步、header处理、缓存处理等工作模块为请求目标服务即可。

process 层

首先,每个流程操作都是独立线性的,两个流程之间也是不能互相干扰的。例如A流程和B流程,A流程与B流程没有任何直接关系,并且需要保证A流程执行完成后才能进行B流程。因此,这里抽象成一个process工作流程。目前模块只需要两个流程,分别为配置下发process与鉴权process,考虑到以后的拓展性,当然不能“限死”在这两个里面了。

util 层

三、设计

database 层

d1f744911559

database.png

AppContentProvider继承于ContentProvider,在ContentProvider中会有UriMatcher这个角色,用于解析Uri,并从Uri中获取数据。所以我们在设计role与uri之间关系的时候,可以通过定义一个code作为中间属性、并且定义一个

关联code与role、因此可以建立如图所示的关系:

d1f744911559

code.png

整一个设计通过结构图我们可以了解到(a)到(d)的流程

(a) 定义了一个DBHelper和AppContentProvider,DBHelper负责创建数据库和表结构,以及处理版本升级的职责;而AppContentProvider则负责监听来自上层针对指定uri的数据操作,同时也是负责处理role与uri之间数据操作的中间件

(b) 根据BaseRole数据库抽象操作模板,根据数据类型的不同定义了具体的数据库操作role,并且将所有role注入到AppContentProvider中的SparseArray表中(底层由两个数组组成,相对hashmap更节约内存),并且通过code建立起uri与role直接的关系

(c) 假设Application层通过uri进行了query操作,会调用到ContentProvider query方法,通过UriMatcher解析uri等到对应的code之后,再通过SparseArray找到目标role,分发给对应的role去执行数据库操作

(d) 最后,当分发好的role执行完成后,通过回调给AppContentProvider数据源后通过ContentResolver的notifyChange反馈给Application层。

本质上ContentProvider是一种观察者模式,可以很好的完成跨进程通信交互。

设计优势:

1、数据库操作分层,对应的数据表类型有自己一套操作逻辑。并且支持动态拓展

2、role动态绑定ContentProvider层,可跨进程访问到数据

network 层

这一层相对比较简单,直接可以看结构图理解

d1f744911559

network.png

Iprotocol为协议层,具体实现交给下面的HTTP、HTTPS子类去实现(包括session保持、header处理、请求参数处理等),并且网络异步请求依赖于AsyncTask去试下一系列的Http请求。

process 层

d1f744911559

processmanger.png

首先要说下process流程,在整个模块执行过程中,应该会有A、B、C...等流程,是线性执行且不可互相干扰的,即A->B->C-....>N。当然,在每个大流程中可能还会有小流程,例如A中,可能会有a、b、c这样的小流程,如图所示:

d1f744911559

Drawing3.png

其次processManager这里要说两个角色,processWorker与processEvent。在初始化processManager的时候,会自动注册定义好的processWorker和processEvent。processWorker与processEvent直接通过委托IProcessCallback与中间件processManager进行交互工作。

processWorker

前面描述过在模块中有流程这个定义,例如A流程和B流程,A流程与B流程没有任何直接关系,并且需要保证A流程执行完成后才能进行B流程。所以我们把每个流程都抽象成一个processWorker,而且都根据IProcess规范好流程的执行流程。在上面的结构图中例如定义了鉴权AuthProcess、配置下载DownloadProcess。两者都是需要提前注册到ProcessManager管理之间,借鉴于要保持两者执行是线性的,因此有一个linkedList保持管理他们的执行顺序,这是processWorker的作用。

processEvent

了解到每个流程执行的时候,在保证process执行的完整性前提,要求要告诉processManager中间件执行结果,所以这里涉及到执行结果的成功与失败。前面描述过,每个大流程执行直接有多个执行步骤(a-n),这里允许我们通过processEvent中的dispathEvent进行拦截,只是拦截,其不会干预流程执行的完整性。

processWorker与processEvent交互

中间件processManager中维护着一个IProcessCallback回调列表,本身processManager初始化的时候会维护自己一个默认的IProcessCallback,属于强引用。当然允许外界注入监听process的回调,但是属于弱引用。事件传递如下图所示:

process -> IProcessCallback(processManager或其他)->processEvent

读者可能会抱着怀疑,事件传递为什么不是process->processEvent就行,process维护自己的事件处理不是更方便维护么?process -> IProcessCallback(processManager或其他)->processEvent 这样设计,有个好处。首先笔者设计的时候,不希望单独给process太大的权限,Manager才是老大,事件决定权大于process,针对以后一些特殊拦截,Manager可以放出接口注入这些特殊拦截事件,所以由Manager进行优先处理。

最后的Util层不做太多的详细说明,最后贴一个整体设计图

d1f744911559

all.png

设计的不是很好,望读者多给建议交流交流。架构这种东西只能通过慢慢总结经验和拥有广泛的知识才能够提升。

欢迎邮件我:sy.wu@foxmail.com

我的github:https://github.com/YuanClouds/

下一篇准备总结下之前写一个策略项目的设计,运用是工厂+策略结合的设计模式。今年给自己定个小目标,沉下来专研技术为自己的目标做好铺垫。感谢阅读,祝大家拥有一个好的假期!

2018.4.5

siven

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "大家来找茬"是一款经典的游戏,也有相关的Android源码提供。这款游戏的源码可以通过多种途径获得,包括从互联网上搜索下载,或者找到相关的开源项目进行学习和使用。 "大家来找茬"的Android源码通常涵盖了游戏的各个方面,如界面设计、游戏逻辑、图像处理等。这样的源码可以供开发者参考学习,了解游戏开发的基本流程和技术要点。 通过阅读这个源码,我们可以学习到如何构建一个基于Android平台的游戏应用。例如,源码中会包含一些基本的布局文件,用于展示游戏的主界面和各个菜单选项等。同时,源码中也会包含游戏逻辑的实现,如游戏关卡的设置、计分系统的设计等。此外,源码通常还包含了与用户交互的代码,比如通过触摸屏幕来选择和识别不同的差异。 当我们有了这个源码的基础上,我们可以对其进行进一步的修改和扩展。比如,可以根据自己的需求定制游戏界面的样式和布局,或者添加更多关卡和难度等级。同时,我们还可以加入其他的功能,如储存游戏进度、增加游戏道具等,以增强游戏的趣味性和可玩性。 总而言之,"大家来找茬"的Android源码为我们提供了一个学习和开发Android游戏的良好起点。通过深入研究源码,我们可以了解游戏开发的工作流程和一些重要的技术要点。同时,我们也可以根据自己的想法和需求,对源码进行修改和扩展,以满足个性的游戏开发需求。 ### 回答2: 《大家来找茬 android源码》是一款寻找差异的游戏,主要是给用户提供了两张图片,让用户在两个图中找出不同之处。如果要开发这款游戏的Android版本,我们可以通过编写相应的源码来实现。 首先,我们需要创建一个游戏场景,在场景中放置两张图片并将它们显示给用户。可以使用ImageView来展示图片,在XML文件中定义两个ImageView,并设置图片路径。然后,在Java代码中使用findViewById方法获取ImageView的实例,然后使用setImageResource方法设置图片资源。 接下来,我们需要为图片添加点击事件,当用户点击某个图片时,我们需要判断用户是否点击了不同之处。可以通过比较两个图片的像素点来实现。可以通过Bitmap对象来获取每个像素点的颜色值,然后将两个图片相同位置的像素点进行对比。 在判断完用户点击的图片之后,我们需要给用户展示正确或者错误的提示。可以通过Toast来实现,当用户点击了不同的图片时,弹出一个提示称用户答案错误,如果用户点击的是相同的图片,则弹出一个提示称用户答案正确。 同时,我们可以增加难度,让用户在规定的时间内找出全部的不同之处。可以使用Handler类来实现定时器的功能,在游戏开始时开启计时器,在规定的时间到了之后,关闭计时器并弹出用户的答题结果。 总结起来,要开发《大家来找茬 android源码》游戏,我们需要通过编写源码来实现图片的加载、点击事件的监听、像素点的比较、提示信息的展示等功能。这样,用户就可以通过观察两张图片的差异,寻找出不同之处。 ### 回答3: 大家都喜欢找茬游戏,它能够锻炼我们的观察力和思维能力。而如果我们想要了解找茬游戏背后的代码,就要研究它的源码。在Android平台上,也有很多找茬游戏的源码可以研究和学习。 为了找到适合的Android找茬游戏源码,我们可以通过搜索引擎或者开源代码共享网站查找。一般来说,开源的代码质量较高,可以为我们提供更好的学习材料。我们可以选择一款评价较高、下载量较多的找茬游戏源码进行研究。 在研究源码时,我们需要注意以下几个方面: 首先,我们需要了解游戏的整体结构和逻辑,包括游戏的启动界面、主界面、关卡选择界面以及游戏内部的图片显示和答案验证等功能。 其次,我们需要学习游戏中图片加载和显示的方法。找茬游戏中,一般需要加载两张相似的图片,并在图片上标示找茬的位置。我们可以学习如何使用Android的图像处理库,如Picasso或Glide,来加载和显示图片。 另外,我们还需要学习如何实现找茬功能。这包括如何判断用户所点击的区域是否为找茬的位置,以及如何给用户提供答案和奖励。 通过学习找茬游戏的源码,我们可以获得很多宝贵的经验和技巧。同时,我们也可以将这些技术应用到其他项目中,提升自己的开发能力。因此,研究找茬游戏的源码是一种有益的学习方式。希望大家能够找到适合自己的源码,并在研究中有所收获。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值