From 37a5c77fa99125ee7dec24dcfdf8ebf1e46df7f4 Mon Sep 17 00:00:00 2001 From: Quyunshuo Date: Sun, 2 May 2021 23:34:55 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 515 ++++++++++++++++++++++++++++----------------------- img/img1.jpg | Bin 99873 -> 0 bytes 2 files changed, 282 insertions(+), 233 deletions(-) delete mode 100644 img/img1.jpg diff --git a/README.md b/README.md index 1186288..c4f8689 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,101 @@ #

AndroidBaseFrameMVVM 🐽

-## 框架已进行部分重构,暂未编写文档及示例demo,等有时间后会根据当前框架编写新的文档及示例demo,本文档目前不是最新的 +>   **AndroidBaseFrameMVVM** 是一个Android工程框架,所使用技术栈为:**组件化、Kotlin、MVVM、Jetpack、Repository、Kotlin-Coroutine-Flow**,本框架既是一个可以开箱即用的工程框架基础层,也是一个很好的学习资源,文档下面会对框架中所使用的一些核心技术进行阐述。该框架作为个人技术积累的产物,会一直更新维护,如果有技术方面的谈论或者框架中的错误点,可以在 **GitHub** 上提 **Issues**,我会及时进行回应。希望这个框架项目能给大家带来帮助,喜欢可以Start🌟。 +> +>   项目地址:[AndroidBaseFrameMVVM](https://github.com/Quyunshuo/AndroidBaseFrameMVVM) -

AndroidBaseFrameMVVM 是一个 Android 项目 MVVM 架构 开箱即用的框架

+## Demo -

该框架基于 Kotlin + Flow + Jetpack + MVVM + 组件化 + Repository 模式实现

+  demo是在另一个demo分支,但是目前的demo分支的代码是以前那一版的demo,目前版本的demo还没有来得及编写,敬请期待吧。 -

该框架存在的意义一方面是秉承着我和大部分程序猿/媛"懒"的天性,实现可复用、不用重复搭项目架构、开箱微小修改即可上手新开项目,另一方面也是想把自己会的东西写出来,供其他学习这方面知识的同学借鉴和参考

+## 框架图示 -

下面展示该框架的架构图 👾

- -

- -

谷歌 Android 团队 Jetpack 视图模型 👾

+**谷歌 Android 团队 Jetpack 视图模型:**

-## 框架技术栈 +## 模块 + +- **app:** + + **app壳** 工程,是依赖所有组件的壳,该模块不应该包含任何代码,它只作为一个空壳存在,由于项目中使用了EventBusAPT技术,需要索引到各业务组件的对应的APT生成类,所以在 **app壳** 内有这一部分的代码。 + +- **buildGradleScript:** + + 脚本模块,该模块下存放的都是各个组件及封装的一些 **Gradle** 脚本文件。初衷是将所有的脚本统一管理,事实上我在组件内查找脚本的习惯还是没有改掉。 + +- **buildSrc:** + + 这是一个特殊的文件夹,负责项目的构建,里面存放着一些项目构建时用到的东西,比如项目配置,依赖。这里面还是存放 **Gradle** 插件的地方,一些自定义的 **Gradle** 的插件都需要放在此处。 + +- **lib_base:** + + 项目的基础公共模块,存放着各种基类封装、对远程库的依赖、以及工具类、三方库封装,该组件是和项目业务无关的,和项目业务相关的公共部分需要放在 **lib_common** 中。 + +- **lib_common:** + + 项目的业务公共模块,这里面存放着项目里各个业务组件的公共部分,还有一些项目特定需要的一些文件等,该组件是和项目业务有关系的。 + +- **lib_net:** + + 网络模块,网络模块的配置、封装等,专门设立了一个组件来负责网路模块部分。 + +## 组件化相关 + +### 组件初始化 + +>   为了更好的代码隔离与解耦,在特定组件内使用的SDK及三方库,应该只在该组件内依赖,不应该让该组件的特定SDK及三方库的API暴露给其他不需要用的组件。有一个问题就出现了,SDK及三方库常常需要手动去初始化,而且一般都需要在项目一启动(即 **Application** 中)初始化,但是一个项目肯定只能有一个自定义的 **Application**,该项目中的自定义 **Application** 在 **lib_base** 模块中,并且也是在 **lib_base** 模块中的清单文件中声明的,那其他组件该如何初始化呢?带着这个问题我们一起来深入研究下。 + +**常见的组件初始化解决方案:** + +在我的了解范围内,目前有两种最为常见的解决方案: + +- **面向接口编程 + 反射扫描实现类:** + +   该方案是基于接口编程,自定义 **Application** 去实现一个自定义的接口(**interface**),这个接口中定一些和 **Application** 生命周期相对应的抽象方法及其他自定义的抽象方法,每个组件去编写一个实现类,该实现类就类似于一个假的自定义 **Application**,然后在真正的自定义 **Application** 中去通过反射去动态查找当前运行时环境中所有该接口的实现类,并且去进行实例化,然后将这些实现类收集到一个集合中,在 **Application** 的对应声明周期方法中去逐一调用对应方法,以实现各实现类能够和 **Application** 生命周期相同步,并且持有 **Application** 的引用及 **context** 上下文对象,这样我们就可以在组件内模拟 **Application** 的生命周期并初始化SDK和三方库。使用反射还需要做一些异常的处理。该方案是我见过的最常见的方案,在一些商业项目中也见到过。 + +- **面向接口编程 + meta-data + 反射:** + +   该方案的后半部分也是和第一种方法一样,通过接口编程实现 **Application** 的生命周期同步,其实这一步是避免不了的,在我的方案中,后半部分也是这样实现的。不同的是前半部分,也就是如何找到接口的实现类,该方案使用的是 **AndroidManifest** 的 **meta-data** 标签,通过每个组件内的 **AndroidManifest** 内去声明一个 **meta-data** 标签,包含该组件实现类的信息,然后在 **Application** 中去找到这些配置信息,然后通过反射去创建这些实现类的实例,再将它们收集到一个集合中,剩下的操作基本相同了。该方案和第一种方案一样都需要处理很多的异常。这种方案我在一些开源项目中见到过,个人认为过于繁琐,还要处理很多的异常。 + +**本项目中所使用的方案:** + +- **面向接口编程 + Java的SPI机制(ServiceLoader)+AutoService:** + +   先来认识下 **Java** 的 **SPI** 机制:面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候不用在程序里动态指明,这就需要一种服务发现机制。**JavaSPI** 就是提供这样的一个机制:为某个接口寻找服务实现的机制。这有点类似 **IOC** 的思想,将装配的控制权移到了程序之外。这段话也是我复制的别人的,听起来很懵逼,大致意思就是我们可以通过 **SPI** 机制将实现类暴露出去。关于如何使用 **SPI**,这里不在陈述,总之是我们在各组件内通过 **SPI** 去将实现类暴露出去,在 **Application** 中我们通过 **Java** 提供的 **SPI** **API** 去获取这些暴露的服务,这样我们就拿到了这些类的实例,剩下的步骤就和上面的方案一样了,通过一个集合遍历实现类调用其相应的方法完成初始化的工作。由于使用 **SPI** 需要在每个模块创建对应的文件配置,这比较麻烦,所以我们使用 **Google** 的 **AutoService** 库来帮助我们自动创建这些配置文件,使用方式也非常的简单,就是在实现类添加一个 **AutoService** 注解。本框架中的核心类是这几个:**lib_base-LoadModuleProxy**、**lib_base-ApplicationLifecycle**。这种方案是我请教的一个米哈游的大佬,这位大佬告诉我在组件化中组件的初始化可以使用 **ServiceLoader** 来做,于是我就去研究了下,最后发现这种方案还不错,比前面提到的两种方案都要简单、安全。 + +### 资源命名冲突 + +  在组件化方案中,资源命名冲突是一个比较严重的问题,由于在打包时会进行资源的合并,如果两个模块中有两个相同名字的文件,那么最后只会保留一份,如果不知道这个问题的小伙伴,在遇到这个问题时肯定是一脸懵逼的状态。问题既然已经出现,那我们就要去解决,解决办法就是每个组件都用固定的命名前缀,这样就不会出现两个相同的文件的现象了,我们可以在 **build.gradle** 配置文件中去配置前缀限定,如果不按该前缀进行命名,**AS** 就会进行警告提示,配置如下: + +```Groovy +android { + resourcePrefix "前缀_" +} +``` + +### 组件划分 + +  其实组件的划分一直是一个比较难的部分,这里其实也给不到一些非常适合的建议,看是看具体项目而定。 + +  关于基础组件通常要以独立可直接复用的角度出现,比如网络模块、二维码识别模块等。 + +  关于业务组件,业务组件一般可以进行单独调试,也就是可以作为 **app** 运行,这样才能发挥组件化的一大用处,当项目越来越大,业务组件越来越多时,编译耗时将会是一个非常棘手的问题,但是如果每个业务模块都可以进行的单独调试,那就大大减少了编译时间,同时,开发人员也不需要关注其他组件。 + +  关于公共模块,**lib_base** 放一些基础性代码,属于框架基础层,不应该和项目业务有牵扯,而和项目业务相关的公共部分则应该放在 **lib_common** 中,不要污染 **lib_base**。 + +### 依赖版本控制 + +  组件化常见的一个问题就是依赖版本,每个组件都有可能自己的依赖库,那我们应该统一管理各种依赖库及其版本,使项目所有使用的依赖都是同一个版本,而不是不同版本。本项目中使用 **buildSrc** 中的几个kt文件进行依赖版本统一性的管理,及其项目的一些配置。 + +## **MVVM相关** + +* **MVVM** 采用 **Jetpack** 组件 + **Repository** 设计模式 实现,所使用的 **Jetpack** 并不是很多,像 **DataBinding**、**Hilt**、**Room** 等并没有使用,如果需要可以添加。采用架构模式目的就是为了解偶代码,对代码进行分层,各模块各司其职,所以既然使用了架构模式那就要遵守好规范。 +* **Repository** 仓库层负责数据的提供,**ViewModel** 无需关心数据的来源,**Repository** 内避免使用 **LiveData**,框架里使用了 **Kotlin** 协程的 **Flow** 进行处理请求或访问数据库,**Repository** 的函数会返回一个 **Flow** 给 **ViewModel** 的调用函数,**Flow** 上游负责提供数据,下游也就是 **ViewModel** 获取到数据使用 **LiveData** 进行存储,**View** 层订阅 **LiveData**,实现数据驱动视图 +* 三者的依赖都是单向依赖,**View** -> **ViewModel** -> **Repository** + +## 项目使用的三方库及其简单示例和资料 -* 组件化 架构 -* MVVM 架构 -* Repository 设计模式 * [Kotlin](https://github.com/JetBrains/kotlin) * [Kotlin-Coroutines-Flow](https://github.com/JetBrains/kotlin) * [Lifecycle](https://developer.android.com/jetpack/androidx/releases/lifecycle) @@ -28,145 +103,111 @@ * [LiveData](https://developer.android.com/topic/libraries/architecture/livedata) * [ViewBinding](https://developer.android.com/topic/libraries/view-binding) * [Android KTX](https://developer.android.com/kotlin/ktx) -* [OkHttp](https://github.com/square/okhttp):网络请求 -* [Retrofit](https://github.com/square/retrofit):网络请求 -* [MMKV](https://github.com/Tencent/MMKV):腾讯基于 mmap 内存映射的 key-value 本地存储组件 -* [Glide](https://github.com/bumptech/glide):快速高效的Android图片加载库 -* [ARoute](https://github.com/alibaba/ARouter):阿里用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦 -* [BaseRecyclerViewAdapterHelper](https://github.com/CymChad/BaseRecyclerViewAdapterHelper):一个强大并且灵活的RecyclerViewAdapter -* [StatusBarUtil](https://github.com/laobie/StatusBarUtil):状态栏 -* [EventBus](https://github.com/greenrobot/EventBus):适用于Android和Java的发布/订阅事件总线 -* [Bugly](https://bugly.qq.com/v2/index):腾讯异常上报及热更新(只集成了异常上报) -* [PermissionX](https://github.com/guolindev/PermissionX):郭霖权限请求框架 -* [Chuck](https://github.com/jgilfelt/chuck):适用于Android OkHttp 客户端的应用内HTTP拦截器 显示请求信息 -* [LeakCanary](https://github.com/square/leakcanary):Android的内存泄漏检测库 +* [OkHttp](https://github.com/square/okhttp):网络请求 +* [Retrofit](https://github.com/square/retrofit):网络请求 +* [MMKV](https://github.com/Tencent/MMKV):腾讯基于 **mmap** 内存映射的 **key-value** 本地存储组件 +* [Glide](https://github.com/bumptech/glide):快速高效的 **Android** 图片加载库 +* [ARoute](https://github.com/alibaba/ARouter):阿里用于帮助 **Android App** 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦 +* [BaseRecyclerViewAdapterHelper](https://github.com/CymChad/BaseRecyclerViewAdapterHelper):一个强大并且灵活的 **RecyclerViewAdapter** +* [StatusBarUtil](https://github.com/laobie/StatusBarUtil):状态栏 +* [EventBus](https://github.com/greenrobot/EventBus):适用于 **Android** 和 **Java** 的发布/订阅事件总线 +* [Bugly](https://bugly.qq.com/v2/index):腾讯异常上报及热更新(只集成了异常上报) +* [PermissionX](https://github.com/guolindev/PermissionX):郭霖权限请求框架 +* [LeakCanary](https://github.com/square/leakcanary):**Android** 的内存泄漏检测库 +* [AndroidAutoSize](https://github.com/JessYanCoding/AndroidAutoSize):**JessYan** 大佬的 今日头条屏幕适配方案终极版 -## 使用方式 -* 1.下载本项目删除无用的文件 -* 2.修改项目包名及各组件包结构,修改 AppName -* 3.填写自己的 Bugly key 在 BaseApplication initialize() 方法中 -* 这样就可以使用了,当然可以删除不用的第三方,或者添加相应要使用的第三方,具体规范看下面的框架解读 +### **Kotlin协程** -## Demo -* 项目里有一个demo分支,这是我写的一个小例子,可以结合Demo去熟悉这个框架 +关于 **Kotlin 协程**,是真的香,具体教程可以看我的一篇文章: -## 框架解读 +- [万字长文 - Kotlin 协程进阶](https://juejin.cn/post/6950616789390721037) -**组件化相关** -* 本框架采用的是组件化架构,核心组件就是 Base 和 Common ,这两个组件都属于公共组件,负责为功能业务组件提供支持 -* Base 组件主要集成了各种需要使用的第三方库和依赖或者公用的 aar/jar,并将依赖向依赖该组件的组件传递,需要集成的依赖,全部集成在 Base 组件内,Base 组件也提供了各种基类封装以及工具类、扩展函数、顶层函数,这些都应该是项目无关性的,可以达到 Base 模块直接拷贝复用的效果 -* Common 组件主要是与项目有关的公用库,比如网络接口,全局常量, bean 类等,和项目有关的东西因该放在 Common 组件内,不要侵入 Base 组件,因为和项目有关的东西一旦放在了 Base 组件内,想要直接拷贝复用 Base 组件就不可能了,肯定会有一堆和项目相关的东西,项目的资源文件或者公用的资源文件最好统一放在 Common 组件内,方便公用,方便管理 -* Base 和 Common 都属于公共组件,区别就在于 Base 比 Common 更底层,偏于与项目无关性,而 Common 是与项目有关性 -* 项目的依赖版本管理和项目参数等配置统一写在了 buildSrc 文件夹内,内部维护了几个 kt 文件进行对依赖库版本及项目参数统一存放管理 -* 功能组件应该依赖 Common 组件,壳 App 依赖所有的功能组件,要尽量避免各组件互相依赖,壳 App 内不要写东西,只当一个壳负责集成各个组件,每个组件都应该在 build.gradle 文件内设置资源命名规范,目的是为了避免资源冲突 -``` -android { - resourcePrefix "资源名前缀" -} -``` -* 各个功能业务组件可以单独运行,通过 buildSrc/BuildConfig.kt 中的 isAppMode 参数控制,项目业务复杂起来后,就需要为每个组件单独编写供其正常单独运行的逻辑代码 +**Flow** 类似于 **RxJava**,它也有一系列的操作符,资料: -**MVVM相关** -* MVVM 采用 Jetpack 组件 + Repository 设计模式 实现,所使用的 Jetpack 并不是很多,像 DataBinding、Hilt、Room 等并没有使用,如果需要可以添加。采用架构模式目的就是为了解偶代码,对代码进行分层,各模块各司其职,所以既然使用了架构模式那就要遵守好规范 -* Repository 仓库层负责数据的提供,ViewModel 无需关心数据的来源,Repository 内避免使用 LiveData,框架里使用了 Kotlin 协程的 Flow 进行处理请求或访问数据库,最后将数据发射到 ViewModel 调用者,Flow上游负责提供数据,下游也就是ViewModel获取到数据使用LiveData进行存储,View层订阅LiveData,实现数据驱动视图 -* 三者的依赖都是单向依赖,View -> ViewModel -> Repository +- [Google 推荐在 MVVM 架构中使用 Kotlin Flow: ](https://juejin.im/post/6854573211930066951) +- [即学即用Kotlin - 协程:](https://juejin.im/post/6854573211418361864) +- [Kotlin Coroutines Flow 系列(1-5):](https://juejin.im/post/6844904057530908679) -#

示例代码及注意事项🐽

+### **PermissionX** -## ViewModel -`ViewModel` 类旨在以注重生命周期的方式存储和管理界面相关的数据。`ViewModel` 类让数据可在发生屏幕旋转等配置更改后继续留存。 +**PermissionX** 是郭霖的一个权限申请框架 **使用方式:** -``` -class MainViewModel : ViewModel(){ -} -class MainActivity : AppCompatActivity() { - // 获取无参构造的ViewModel实例 - val mViewModel = ViewModelProvider(this).get(MainViewModel::class.java) -} ``` -**资料:** -官方文档: [https://developer.android.com/topic/libraries/architecture/viewmodel](https://developer.android.com/topic/libraries/architecture/viewmodel) -Android ViewModel,再学不会你砍我: [https://juejin.im/post/6844903919064186888](https://juejin.im/post/6844903919064186888) -## LiveData -`LiveData`是一种可观察的数据存储器类。与常规的可观察类不同,`LiveData` 具有生命周期感知能力,意指它遵循其他应用组件(如 `Activity`、`Fragment` 或 `Service`)的生命周期。这种感知能力可确保 `LiveData` 仅更新处于活跃生命周期状态的应用组件观察者 -LiveData 分为可变值的`MutableLiveData`和不可变值的`LiveData` -**常用方法:** +PermissionX.init(this) + .permissions("需要申请的权限") + .request { allGranted, grantedList, deniedList -> } ``` -fun test() { - val liveData = MutableLiveData() - // 设置更新数据源 - liveData.value = "LiveData" - // 将任务发布到主线程以设置给定值 - liveData.postValue("LiveData") - // 获取值 - val value = liveData.value - // 观察数据源更改(第一个参数应是owner:LifecycleOwner 比如实现了LifecycleOwner接口的Activity) - liveData.observe(this, { - // 数据源更改后触发的逻辑 - }) - } -``` -**资料:** -官方文档: [https://developer.android.com/topic/libraries/architecture/livedata](https://developer.android.com/topic/libraries/architecture/livedata) - -## Lifecycle -`Lifecycle` 是一个类,用于存储有关组件(如 `Activity` 或 `Fragment`)的生命周期状态的信息,并允许其他对象观察此状态。 -`LifecycleOwner` 是单一方法接口,表示类具有 `Lifecycle`。它具有一种方法(即 `getLifecycle()`),该方法必须由类实现。 -实现 `LifecycleObserver` 的组件可与实现 `LifecycleOwner` 的组件无缝协同工作,因为所有者可以提供生命周期,而观察者可以注册以观察生命周期。 **资料:** -官方文档: [https://developer.android.com/topic/libraries/architecture/lifecycle](https://developer.android.com/topic/libraries/architecture/lifecycle) -## ViewBinding -通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。 -在大多数情况下,视图绑定会替代 `findViewById` -**使用方式:** -按模块启用`ViewBinding` -``` -// 模块下的build.gradle文件 -android { - // 开启ViewBinding - // 高版本AS - buildFeatures { - viewBinding = true - } - // 低版本AS 最低3.6 - viewBinding { - enabled = true - } -} -``` -`Activity` 中 `ViewBinding` 的使用 -``` -// 之前设置视图的方法 -setContentView(R.layout.activity_main) +GitHub: [https://github.com/guolindev/PermissionX](https://github.com/guolindev/PermissionX) -// 使用ViewBinding后的方法 -val mBinding = ActivityMainBinding.inflate(layoutInflater) -setContentView(mBinding.root) +### EventBus APT -// ActivityMainBinding类是根据布局自动生成的 如果没有请先build一下项目 -// ViewBinding会将控件id转换为小驼峰命名法,所以为了保持一致规范,在xml里声明id时也请使用小驼峰命名法 -// 比如你有一个id为mText的控件,可以这样使用 -mBinding.mText.text = "ViewBinding" -``` -`Fragment` 中 `ViewBinding` 的使用 -``` -// 原来的写法 -return inflater.inflate(R.layout.fragment_blank, container, false) +事件总线这里选择的还是 **EventBus**,也有很多比较新的事件总线框架,还是选择了这个直接上手的 +在框架内我对 **EventBus** 进行了基类封装,自动注册和解除注册,在需要注册的类上添加 **@EventBusRegister** 注解即可,无需关心内存泄漏及没及时解除注册的情况,基类里已经做了处理 -// 使用ViewBinding的写法 -mBinding = FragmentBlankBinding.inflate(inflater) -return mBinding.root +```kotlin +@EventBusRegister +class MainActivity : AppCompatActivity() {} ``` -**资料:** -官方文档: [https://developer.android.com/topic/libraries/view-binding](https://developer.android.com/topic/libraries/view-binding) -CSDN: [https://blog.csdn.net/u010976213/article/details/104501830?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5](https://blog.csdn.net/u010976213/article/details/104501830?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5) -## ARoute -`ARoute`是阿里巴巴的一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦 +很多使用 **EventBus** 的开发者其实都没有发现 **APT** 的功能,这是 **EventBus3.0** 的重大更新,使用 **EventBus APT** 可以在编译期生成订阅类,这样就可以避免使用低效率的反射,很多人不知道这个更新,用着**3.0**的版本,实际上却是**2.0**的效率。 +项目中已经在各模块中开启了 **EventBus APT**,**EventBus** 会在编译器对各模块生成订阅类,需要我们手动编写代码去注册这些订阅类: + +```kotlin +// 在APP壳的AppApplication类中 +EventBus + .builder() + .addIndex("各模块生成的订阅类的实例 类名在base_module.gradle脚本中进行了设置 比如 module_home 生成的订阅类就是 module_homeIndex") + .installDefaultEventBus() +``` + +### 屏幕适配 AndroidAutoSize + +屏幕适配使用的是 **JessYan** 大佬的 今日头条屏幕适配方案终极版 + +GitHub: [https://github.com/JessYanCoding/AndroidAutoSize](https://github.com/JessYanCoding/AndroidAutoSize) + **使用方式:** + +``` +// 在清单文件中声明 + + + // 主单位使用dp 没设置副单位 + + + + + +// 默认是以竖屏的宽度为基准进行适配 +// 如果是横屏项目要适配Pad(Pad适配尽量使用两套布局 因为手机和Pad屏幕宽比差距很大 无法完美适配) + + + // 以高度为基准进行适配 (还需要手动代码设置以高度为基准进行适配) 目前以高度适配比宽度为基准适配 效果要好 + + + + +// 在Application 中设置 +// 屏幕适配 AndroidAutoSize 以横屏高度为基准进行适配 +AutoSizeConfig.getInstance().isBaseOnWidth = false +``` + +### ARoute + +**ARoute** 是阿里巴巴的一个用于帮助 **Android App** 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦 + +**使用方式:** + ``` // 1.在需要进行路由跳转的Activity或Fragment上添加 @Route 注解 @Route(path = "/test/activity") @@ -206,113 +247,121 @@ class MainActivity : AppCompatActivity() { // 5.获取Fragment Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation(); ``` -**资料:** + +**资料:** + 官方文档:[https://github.com/alibaba/ARouter](https://github.com/alibaba/ARouter) -## 屏幕适配 AndroidAutoSize -屏幕适配使用的是 JessYan 大佬的 今日头条屏幕适配方案终极版 -GitHub: [https://github.com/JessYanCoding/AndroidAutoSize](https://github.com/JessYanCoding/AndroidAutoSize) -**使用方式:** -``` -// 在清单文件中声明 - - - // 主单位使用dp 没设置副单位 - - - - +### ViewBinding -// 默认是以竖屏的宽度为基准进行适配 -// 如果是横屏项目要适配Pad(Pad适配尽量使用两套布局 因为手机和Pad屏幕宽比差距很大 无法完美适配) - - - // 以高度为基准进行适配 (还需要手动代码设置以高度为基准进行适配) 目前以高度适配比宽度为基准适配 效果要好 - - - +通过视图绑定功能,可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 **XML** 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 **ID** 的所有视图的直接引用。 +在大多数情况下,视图绑定会替代 **findViewById** -// 在Application 中设置 -// 屏幕适配 AndroidAutoSize 以横屏高度为基准进行适配 -AutoSizeConfig.getInstance().isBaseOnWidth = false -``` -## EventBus APT -事件总线这里选择的还是`EventBus`,也有很多比较新的事件总线框架,还是选择了这个直接上手的 -在框架内我对`EventBus`进行了基类封装,自动注册和解除注册,在需要注册的类上添加`@EventBusRegister`注解即可,无需关心内存泄漏及没及时解除注册的情况,基类里已经做了处理 -``` -@EventBusRegister -class MainActivity : AppCompatActivity() { -} -``` -很多使用`EventBus`的其实都没有发现APT的功能,这是`EventBus3.0`的重大更新,使用`EventBus APT`可以编译期生成订阅类,这样就可以避免使用低效率的反射,很多人不知道这个更新,用着3.0的版本,实际上却是2.0的效率 -项目中已经在各模块中开启了`EventBus APT`,`EventBus`会在编译器对各模块生成订阅类,需要我们手动代码去集成这些订阅类 -``` -// 因为App包依赖了所有的模块所以选择在App包下的Application中进行设置 -// 开启EventBus APT -EventBus - .builder() - .addIndex("各模块生成的订阅类的实例 类名在 moduleBase.gradle 脚本中进行了设置 比如 Lib_Main 生成的订阅类就是 MainEventIndex") - .installDefaultEventBus() -``` +**使用方式:** -## PermissionX -`PermissionX` 是郭霖的一个权限申请框架 -**使用方式:** -``` -PermissionX.init(this) - .permissions("需要申请的权限") - .request { allGranted, grantedList, deniedList -> } -``` -**资料:** -GitHub: [https://github.com/guolindev/PermissionX](https://github.com/guolindev/PermissionX) -## 组件化资源命名冲突 -组件化方案中有一个坑就是资源命名冲突的问题,小则导致合并清单文件时资源丢失,大则直接导致崩溃 -为了解决这个问题,需要在`build.gradle`文件中,对各模块声明资源前缀规则 -``` +按模块启用**ViewBinding** + +```groovy +// 模块下的build.gradle文件 android { - // 前缀最好以组件包名规定 - resourcePrefix "main_" + // 开启ViewBinding + // 高版本AS + buildFeatures { + viewBinding = true + } + // 低版本AS 最低3.6 + viewBinding { + enabled = true + } } ``` -## Kotlin 协程 -`Kotlin Coroutines` 是一套解决异步编程的方案,在 Android 平台就是一个线程框架,用了都说好 -**使用示例:** -* `Activity` 中 -``` -// 在 Activity 中 可以使用 lifecycleScope 协程作用域 进行开启协程 -// lifecycleScope 是 LifecycleOwner 的扩展属性 使用 lifecycleScope 你就无需关心Activity声明周期的问题 无需关心因为生命周期导致的协程泄漏的问题 可以说是真方便 -// 使用示例 -lifecycleScope.launch(Dispatchers.Default) { - delay(1000L) - ARouter.getInstance() - .build(RouteUrl.MainActivity) - .navigation() - delay(100L) - finish() -} -// launch() 函数开启了一个协程 调度器默认是Main 这里我指定了 Dispatchers.Default -// 使用默认调度器可以直接使用 launch{} -// Activity 中还有一个协程作用域可以使用 就是 MainScope() 它会返回一个协程作用域实例 使用这个就需要我们手动去处理声明周期的问题了 -``` -* `ViewModel` 中使用 -``` -// 在 ViewModel 中可以使用 -viewModelScope.launch {} -// 默认的调度器也是Main 同样也不需要我们去做生命周期的处理 -``` -* `Flow` -`Flow`类似于`RxJava`,它也有一系列的操作符 -**资料:** -Google 推荐在 MVVM 架构中使用 Kotlin Flow: [https://juejin.im/post/6854573211930066951](https://juejin.im/post/6854573211930066951) -即学即用Kotlin - 协程: [https://juejin.im/post/6854573211418361864](https://juejin.im/post/6854573211418361864) -Kotlin Coroutines Flow 系列(1-5): [https://juejin.im/post/6844904057530908679](https://juejin.im/post/6844904057530908679) -## 结语 -* 本人是一个刚大学毕业的 Android 开发者,技术相对来说比较薄弱,写这个框架主要是为了在以后自己使用、对自己技术做一个总结、对其他想学习的同学提供一个例子、也是想把一些东西开源出去,让这个社区更加的美好。文档中可能有些描述不太专业和生硬,我也很少写这些东西,所以表达起来很生疏。 -* 如果你绝对该项目对你有用,那就请给一个 star🌟吧🥰 \ No newline at end of file +**Activity** 中 **ViewBinding** 的使用 + +```kotlin +// 之前设置视图的方法 +setContentView(R.layout.activity_main) + +// 使用ViewBinding后的方法 +val mBinding = ActivityMainBinding.inflate(layoutInflater) +setContentView(mBinding.root) + +// ActivityMainBinding类是根据布局自动生成的 如果没有请先build一下项目 +// ViewBinding会将控件id转换为小驼峰命名法,所以为了保持一致规范,在xml里声明id时也请使用小驼峰命名法 +// 比如你有一个id为mText的控件,可以这样使用 +mBinding.mText.text = "ViewBinding" +``` + +**Fragment** 中 **ViewBinding** 的使用 + +```kotlin +// 原来的写法 +return inflater.inflate(R.layout.fragment_blank, container, false) + +// 使用ViewBinding的写法 +mBinding = FragmentBlankBinding.inflate(inflater) +return mBinding.root +``` + +**资料:** + +官方文档: [https://developer.android.com/topic/libraries/view-binding](https://developer.android.com/topic/libraries/view-binding) + +CSDN: [https://blog.csdn.net/u010976213/article/details/104501830?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5](https://blog.csdn.net/u010976213/article/details/104501830?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5) + +### ViewModel + +**ViewModel** 类旨在以注重生命周期的方式存储和管理界面相关的数据。**ViewModel** 类让数据可在发生屏幕旋转等配置更改后继续留存。 + +**使用方式:** + +```kotlin +class MainViewModel : ViewModel(){} + +class MainActivity : AppCompatActivity() { + // 获取无参构造的ViewModel实例 + val mViewModel = ViewModelProvider(this).get(MainViewModel::class.java) +} +``` + +**资料:** + +官方文档: [https://developer.android.com/topic/libraries/architecture/viewmodel](https://developer.android.com/topic/libraries/architecture/viewmodel) + +Android ViewModel,再学不会你砍我: [https://juejin.im/post/6844903919064186888](https://juejin.im/post/6844903919064186888) + +### LiveData + +**LiveData** 是一种可观察的数据存储器类。与常规的可观察类不同,**LiveData** 具有生命周期感知能力,意指它遵循其他应用组件(如 **Activity**、**Fragment** 或 **Service**)的生命周期。这种感知能力可确保 **LiveData** 仅更新处于活跃生命周期状态的应用组件观察者 + +**LiveData** 分为可变值的 **MutableLiveData** 和不可变值的 **LiveData** + +**常用方法:** + +```kotlin +fun test() { + val liveData = MutableLiveData() + // 设置更新数据源 + liveData.value = "LiveData" + // 将任务发布到主线程以设置给定值 + liveData.postValue("LiveData") + // 获取值 + val value = liveData.value + // 观察数据源更改(第一个参数应是owner:LifecycleOwner 比如实现了LifecycleOwner接口的Activity) + liveData.observe(this, { + // 数据源更改后触发的逻辑 + }) + } +``` + +**资料:** + +官方文档: [https://developer.android.com/topic/libraries/architecture/livedata](https://developer.android.com/topic/libraries/architecture/livedata) + +### Lifecycle + +**Lifecycle** 是一个类,用于存储有关组件(如 **Activity** 或 **Fragment**)的生命周期状态的信息,并允许其他对象观察此状态。**LifecycleOwner** 是单一方法接口,表示类具有 **Lifecycle**。它具有一种方法(即 **getLifecycle()**),该方法必须由类实现。实现 **LifecycleObserver** 的组件可与实现 **LifecycleOwner** 的组件无缝协同工作,因为所有者可以提供生命周期,而观察者可以注册以观察生命周期。 + +**资料:** + +官方文档: [https://developer.android.com/topic/libraries/architecture/lifecycle](https://developer.android.com/topic/libraries/architecture/lifecycle) \ No newline at end of file diff --git a/img/img1.jpg b/img/img1.jpg deleted file mode 100644 index 3dc4726f4ce85be7223e5ca94d98e18986e44025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99873 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

!BrKRPD>9a=v6=!RC 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 j<)`|id=T`RdcggEWG