Android模块化框架介绍
模块化是⼀种成熟的业务解耦思想,⽬前已⼴泛应⽤在APP的开发中。之前写过⼀篇⽂章——对APP模块化的过程及遇到的问题进⾏了介绍。具体的实例代码最近也完善的差不多了,所以写篇⽂章介绍⼀下这个项⽬——, ⼀个以分层思想+模块化开发的通⽤框架,将会被长期维护。
项⽬结构
本项⽬是按照中介绍的结构来开展的,所以可先看下这篇⽂章了解⼀下基本结构。项⽬结构如下所⽰:
其中,MainModule, BaseComponentDemo, BaseLibraryDemo和CommonBusinessDemo都是业务层模块,他们的关系如图所⽰:MainModule是整个APP的主模块,⽤来实现APP中主页和路由跳转相关的逻辑,同时也作为Application与其他模块关联的枢纽。
BaseComponentDemo, BaseLibraryDemo和CommonBusinessDemo是⼦业务模块,都依赖于library⽬录中的三个公共模块。这三个模块⼀⽅⾯是⽤来展⽰业务模块化实现过程,另⼀⽅⾯也是library中三个模块的⽰例代码。所以这三个模块中没有什么核⼼的代码,下⾯主要介绍⼀下library中的三个模块。
建议
默认情况下,创建的Module都是在Project⽬录下,但是当模块⽐较的多的时候,定位代码时还是⽐较繁琐的,所以推荐将底层的Module 放在创建的library⽬录中,然后在adle中对Module的路径进⾏配置:
project(':baselibrary').projectDir = new File('library/baselibrary')
project(':basecomponent').projectDir = new File('library/basecomponent')
project(':commonbusiness').projectDir = new File('library/commonbusiness')
复制代码
有时候也会引⼊⼀些第三⽅的Module, 此时也可将其放在library⽬录中,或者创建其他的⽬录⽤来存放第三⽅的Module,然后在adle中进⾏配置。这样Project⽬录下只有业务层的Module,项⽬结构看起来会清晰很多。
baselibrary
baselibrary是Common组件层的实现,包括各种常⽤的⼯具类,通⽤的UI库,数据源的封装(包括⽹络,⽂件,数据库)。
⼯具类
中包含了丰富的⼯具类,具体介绍如下:
AppUtil: App相关的⼀些操作,如版本号,进程号,是否已安装,是否正在运⾏,是否运⾏在前台等;
BitmapUtil: Bitmap相关的⼀些操作,如缩放,与Drawable之间的转换等;
CollectionUtil: 与集合/数组相关的操作;
ConvertUtil: 基本类型与String之间的转换操作;
DateTimeUtil: 时间格式化相关的操作;
DeviceUtil: 设备相关的操作,如获取系统的各种参数;
EncryptUtil: 加密操作,如MD5,隐藏⼿机号,邮箱等操作;
FileUtil: 与⽂件相关的操作;
InputMethodUtil: 与键盘相关的操作,如打开/隐藏键盘,键盘弹出时调整EditText位置等;
LaunchUtil: 跳转到其他APP的操作,如打开电话,短信等;
LogUtil: ⽇志⼯具类;
NetworkUtil: 与⽹络相关的⼯具类,如获取⽹络参数,获取联⽹状态等;
PermissionUtil: 权限验证类;
RomUtil: 判断⼿机ROM的类型;
ScrollStateUtil: 判断可滑动View是否到达顶部或底部;
SpannableStringUtil: 富⽂本⼯具类;
ToastUtil: Toast⼯具类
VerificationUtil: 验证⼯具类,如⼿机号,邮箱,⾝份证,是否为中⽂等;
ViewBgUtil: 动态设置View背景的⼯具类;
ShadowDrawable: 被View设置阴影的⼯具类;
复制代码
数据源
Android中常⽤的数据源也就四个:SharePreference,⽂件,数据库和⽹络。
SharePreference
SharePreference是Android提供的⼀种以key-value结构⽤来存储少量数据的⽅式,本质上也是⽂件的存储⽅式,但是直接使⽤时⽐较繁琐,为了简化调⽤过程,项⽬中提供了它的封装版——,⽀持同步和异步两种⽅式。
⽂件
⽂件⽅式就是简单的⽂件读写,这⾥的⽂件缓存使⽤了。
数据库
与⽂件⼀样,数据库也算是Android中的低频数据源,直接使⽤即可。
⽹络
⽹络是Android开发中主要的数据源,会被⼤量使⽤,所以需要进⾏简单的封装,从⽽简化⽹络请求的过程。⽹络框架使⽤了Retrofit。 ⽬录中是整个⽹络框架的封装,其中提供了公共参数,缓存,Cookie,认证四种。同时提供了Gson数据转换的兼容类,避免异常数据转换时因类型不匹配⽽导致的闪退。
⽹络请求⽰例代码:
@Override
public void onSuccess(UserInfoBean response) {
// 请求成功
}
@Override
public void onFailure(int code, String msg) {
// 请求失败
}
});
复制代码
通⽤UI
通⽤UI是⼀些⾃定义View,放在这个位置的⾃定义View需要有⾼度的可定制性和与业务⽆关的特征。
CircleProgressBar: 圆形进度条;
LevelView: 类似Uber的等级选择器;
RefreshLayout: 下拉刷新、上拉加载组件;
ResilienceListView: 下拉可回弹的ListView;
ShapeImageView: 可定义形状的ImageView;
TabLayout: 类似底部的Tab组件;
复制代码
basecomponent
basecomponent是基础业务层的实现,⽤于统⼀APP的代码结构和UI风格。主要包括Activity&Fragment,Dialog的封装。
Activity & Fragment
Activity&Fragment作为Android中承载View的组件,它们的风格基本决定了APP的整体风格。其实就⽬前主流的设
计,Activity/Fragment的UI也就⼏种状态:
页⾯加载时是否有加载圈;
页⾯是否有NavigationBar;
总的来说也就这4种情况的组合。针对这4种情况提供了以下封装类:
BaesActivity 不需要⽹络请求的Activity;
BaesProgressActivity 需要⽹络请求的Activity(页⾯默认显⽰加载圈);
BaseFragment 不需要⽹络请求的Fragment;
BaseProgressFragment 需要⽹络请求的Fragment(页⾯默认显⽰加载圈);
⽽对于NavigationBar也提供了三种样式: ⽩底,透明,半透明,根据需要进⾏设置即可。
Dialog
Dialog也是Android开发中常⽤的UI组件,这⾥提供了普通对话框,单选对话框,多选对话框,底部对话框四种⽅式,同时对每⼀种提供了⾃定义样式和Material样式两种风格,具体可参考
commonbusiness
commonbusiness是公共组件层的实现。其中包括APP中⼀些通⽤的功能,如登录验证,权限验证,第三⽅登录,分享,⽀付,推送等功能。
登录验证
在Android开发中,有⼀些页⾯是需要登录才能查看的,如果直接使⽤判断登录状态的⽅式,就是显得很繁琐。所谓为了简化这种验证过程,项⽬中提供了基于AOP的⽅式,开发者中需要验证登录状态的⽅法上⾯使⽤@CheckLogin注解即可。具体代码参考⽬录。
权限验证
Android6.0之后权限的获取都是通过动态获取的,但是获取的过程⽐较繁琐,所以为了简化权限的获取过程,这⾥也使⽤了基于AOP的权限申请。在需要申请权限时,使⽤@CheckPermission注解即可,代码如下所⽰:
@CheckPermission(permissions = {Manifest.permission.CAMERA,}, permissionDesc = "没有权限⽆法使⽤相机", settingDesc = "快去设置中开启权限") private void setUserIcon() {
}
复制代码
当⽤户拒绝了权限申请后,弹出toast提⽰permissionDesc中的内容,当勾选了【不再询问】拒绝后,再次申请就会弹出Dialog, 提⽰内容为settingDesc,当然,这两个字段也是有默认值的,如果不需要详细的提⽰,可不⽤设置。
第三⽅登录
现在的应⽤除了内置的登录功能外,为了便于⽤户使⽤,通常还会提供第三⽅登录的功能。通常使⽤的第三⽅登录也就,微博,QQ三种。这⾥为第三⽅登录提供了统⼀的接⼝,需要登录时直接调⽤即可。
分享
⽬前APP的主要分享渠道是,微博和QQ,所以分享模块也只集成了这三种分享⽅式。使⽤时只需要在相应的开发平台上创建应⽤并配置参数,然后在分享模块中配置参数即可。当然,项⽬中也提供了⼀个分享页⾯——ShareActivity,分享时调⽤(...)⽅法即可。
⽀付
项⽬中集成了⽀付和⽀付宝⽀付,并且为⽀付提供了统⼀了接⼝,使⽤时只需要将从后台获取的参数传⼊即可
⽀付宝⽀付
// requestStr是后台返回的订单相关的参数
@Override
public void onSuccess() {
ToastUtil.show("⽀付成功");
}
@Override
public void onFailure(Exception e) {
ToastUtil.show("⽀付失败" + e.getMessage());
}
});
复制代码
⽀付
// 根据后台返回的⽀付的参数构造PayRequestBean对象
PayRequestBean payRequest = new PayRequestBean(...)
@Override
public void onSuccess() {
ToastUtil.show("⽀付成功");
}
@Override
public void onFailure(Exception e) {
ToastUtil.show("⽀付失败" + e.getMessage());
}
});
复制代码
推送
⽬前推送的推送率基本都是通过第三⽅推送SDK组合的⽅式来保障的,项⽬中集成了⼩⽶,华为,极光推送三种⽅式,根据机型动态设置推送⽅式,⼩⽶⼿机使⽤⼩⽶推送,华为推送使⽤华为推送,其他的品牌则使⽤极光推送。开发时只需要在Applicataion中调⽤PushManager的init⽅法进⾏初始化,并且设置推送的监听即可。
"⼩⽶推送的appKey");
@Override
public void onReceiveMessage(Context context, int pushChannel, Object object) {
android retrofit/**
* 接收到⾃定义消息时的回调
*/
}
@Override
public void onReceiveNotification(Context context, int pushChannel, Object object) {
/**
* 接收到通知时的回调
*/
}
@Override
public void onNotificationClicked(Context context, int pushChannel, Object object) {
/**
* 点击推送通知时的回调
*/
}
});
复制代码
项⽬地址
总结
⽬前的项⽬已经有个⼤概的轮廓了,但是细节⽅⾯还有许多需要完善的,同时实例代码的展⽰也还不够详细,随后会进⼀步完善,感兴趣的⼩伙伴可关注⼀下。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论