KotlinWanAndroid是以WanAndroid API为基础开发的一款阅读类APP,其主要功能包括:
- 首页,展示广告栏、置顶文章和最新文章列表;
- 搜索,提供热门搜索关键词列表和历史搜索关键词列表,可搜索文章;
- 知识体系,按不同分类展示知识体系,点击可查看分类下的文章;
- 常用网站,展示常用网站;
- 导航,按不同工具网站的分类排序,展示各种工具网站的入口;
- 公众号,按公众号名称展示业内知名大神的公众号最新推送文章;
- 项目,按项目类型展示网站收录的项目;
- 文章详情,文章详情页可以关注文章、取关文章、分享文章;
- 登录注册,登录注册功能对用户身份进行验证,登录后可查看个人收藏列表和日程列表;
- 我的,我的页面中展示个人收藏列表,可添加站外文章,并提供设置页面和日程页面的入口;
- 设置,设置页面可以切换自动缓存、无图模式和夜间模式、清除缓存、意见反馈、关于我们、退出登录;
- 日程,日程页面展示个人所有待办日程,可以添加、修改、删除日程以及查看已完成日程;
- 自动更新,当应用发布了新版本之后,首页会提示用户进行更新。
扫码下载应用(Android 4.4+)。如果在使用中发现任何问题或Bug,欢迎issue,或Email:[email protected]
如果上述二维码无法扫描下载,请点击这里下载APK
Image Column 01 | Image Column 02 | Image Column 03 |
---|---|---|
本项目共分为四个模块:app
、app_main
、app_support
、common
,其模块依赖关系如下图所示。
app
模块是项目的壳模块,其中仅存放了App
和项目的入口页面SplashActivity
;app_main
模块中包含的是MainActivity
及其中的五个Fragment
,和点击弹出的各种Dialog
;app_support
模块是除上述两个模块包含的页面之外的页面;common
模块是项目的通用模块,其中包含了工具类
、HTTP相关类
、Redux的本地实现
等。
具体的技术会在技术栈
章节中详细介绍。
KotlinWanAndroid
,顾名思义是使用Kotlin
语言开发的WanAndroid
客户端,在开发过程中使用了很多Kotlin
的特性,如多种操作符
、扩展函数
等,
结合Kotlin
语言本身简洁的语法进行开发,不仅减少了代码量,也提升了系统性能,关于Kotlin
语言这里不再赘述。
本应用的开发初衷是:尽量做到简约精致,绝不花里胡哨,这里的花里胡哨不仅是页面上的,也包括依赖库上尽量少的使用必要性低的库,尽量多的自己封装,
这样不仅可以减小应用的体积,也可以提升自己的技术水平。这里主要介绍一下笔者在开发过程中,从项目中抽离封装出来的、与具体业务无关的几个开源库,
这几个开源库力求可以应用于其他Android
应用的开发中,以使开发更便捷。
1、RxMVVM框架
RxMVVM
是笔者封装的一个架构框架,其中包括两部分,分别是对MVVM的封装
和一种类似于前端Redux的框架
。
对MVVM
的封装主要是封装出了BaseActivity
、BaseViewModel
、BaseFragment
、BaseLazyFragment
等组件,使开发更便捷。
V
层与VM
层之间通过LiveData
进行数据交互,真正做到响应式、声明式编程,让代码更加具有可读性和可扩展性。
RxMVVM
框架中还封装了一种类似于前端的Redux
框架的代码库,其主要功能是提供一个全局性的状态机,当这个状态机中的数据发生了改变时,
系统中任何一个位置的任何一个组件,都可以监听到这些数据的变化,在KotlinWanAndroid
项目中,这个库被用来代替传统的EventBus
等事件总线来使用。
例如,在“我的”页面点击登录按钮跳转到“登录”页面,登录成功后返回“我的”页面加载用户收藏列表。
此处的传统做法是:在MineFragment
的onResume()
生命周期中判断用户是否登录,如果已登录则获取数据,
这样做的缺点是每当MineFragment
进入到用户视线中时都会进行一次判断,不仅无故浪费系统性能,而且要多写很多代码。
如果换成RxMVVM
中的Redux
来实现,就简单很多了:只需要在MineFragment
中监听系统的状态机变化,这样,仅当状态机中的数据发生了变化时,才会去拉去用于收藏的数据。
上述登录的例子只是Redux
在本系统中诸多应用之一,“收藏文章”、“退出登录”、“切换日/夜间模式”、“切换无图模式”、“切换自动缓存”等功能中都使用了该技术。
2、GRouter
GRouter
是一个路由框架。当项目中进行了模块化以后,同级模块之间是不能互相跳转的,因为它们之间没有依赖关系,例如:在本项目中,app_main
模块中的MainActivity
组件
想要跳转到app_support
模块中的SettingActivity
,如果使用普通的Intent
方式是做不到(优雅的)跳转的。基于这种场景,GRouter
诞生了。
GRouter
的使用方式非常简单:引入依赖、添加kapt
编译依赖、添加插件、添加注解,然后就可以正常的跳转了,不需要做任何其他额外的配置操作。
GRouter
中使用了APT
和ASM
两种技术,将代码生成、代码注入两部分工作提前到了编译器去做,这也是相比于使用反射手段的一大优势:避免了在运行时生成或注入代码,提升系统性能。
GRouter
中除了简单的路由跳转,还提供了一些高级操作,如添加全局拦截器、添加路由匹配器等。具体详情请移步到仓库下的README.md
。
3、UIKit
UIKit
是笔者自己封装的一套UI
库,现在仅用于KotlinWanAndroid
客户端,虽尚待完善,但已经提供了一些扩展性极高的控件,这里简单介绍几个:
- Banner:一个可以自动、无限、循环滚动的广告栏控件,与指示器分离,且可以动态的设置是否无限滚动、是否自动滚动等;
- Browser:基于
AgentWeb
封装的一个网页控件,支持阻绝图片、页内回退、Scheme唤醒、错误页定制等功能; - RichText:富文本生成工具类,支持前景色、背景色、删除线、下划线、加粗、倾斜、点击等多种特效,链式编程,十分方便;
- HeadBar:一个封装性极高的标题栏控件,支持定制返回按钮、定制标题、定制工具按钮、定制菜单等;
- EasyAdapter:
RecyclerView
的封装,通过简单的代码,可以实现多ViewType
和局部刷新
等操作; - ListFooter:一个上滑加载更多的控件,可以自定义
Footer
样式; - StatusView:一个控制状态的控件,为不同状态设置不同的布局,然后通过一行代码在不同状态之间切换,常用于列表页加载出错时显示错误页;
- CommonPage:阅读类应用的通用页面,由
SwipeRefreshLayout
、StatusView
和FAB
组成,通过Behavior
实现协调。
以上是UIKit
库中几个比较有代表性的控件的简单介绍,仓库的README.md
文件中有每个控件的详细介绍和使用文档。
GPermission
是对RxPermission
的封装,将现在应用中常见的动态请求权限的逻辑进行了封装,使开发人员不再需要根据用户的操作去决定系统的反馈效果。
关于GPermission
中的具体业务流程,大家可以移步仓库中的README.md
文件查看。
AndroidX
:迁移到AndroidX
;Retrofit
+OkHttp
+RxJava
+RxAndroid
+Gson
:网络请求、线程切换、请求组合等;OkHttpLoggingInterceptor
:OkHttp
的请求日志框架,便于调错;Glide
:图片加载框架,可以用很少的代码实现强大的功能,且支持多种图片变换;RxBinding
:响应式控件事件监听框架,支持按钮防抖、表单联动等;FlexBox
:Google
开源的流式布局框架,可以结合RecyclerView
使用;JodaTime
:功能强大的时间转换框架,让时间操作更简单;LeakCanary
:内存泄漏监测框架,则debug版本中监测并警报内存泄漏。
解决欢迎页倒计时过程中点击回退键造成的崩溃问题
优化了部分页面的交互体验
添加了权限申请逻辑
集成了Bugly异常监测SDK
解决首页搜索Dialog没有数据的bug
部分页面的UI微调
添加混淆,缩小应用体积
优化部分文本的显示效果
文章详情页功能增强
小幅度修改某些页面的布局
增加了屏幕适配功能,在不同尺寸和分辨率的屏幕上有相同展示效果
将应用改为仅能竖屏展示
支持应用自动检查更新
KotlinWanAndroid
的第一版
鸿洋大神提供的WanAndroid API
JsonChao:Awesome-WanAndroid提供的界面布局思路
Material Design Color Tool提供的颜色搭配方案
阿里巴巴IconFont提供的图标字体解决方案
磐龍提供的应用自动检查更新解决方案
蒲公英提供的APK发布平台
Bugly提供的异常/错误监测解决方案
Rxjava、 RxAndroid、 RxBinding、 Retrofit、 OkHttp、 Gson、 Glide、 FlexBoxLayout、 JodaTimeAndroid、 RxPermission、 LeakCanary 等
Copyright 2019 ITGungnir
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.