双叒叕-一个-Android-MVVM-组件化架构框架?

使用方式

  • 1.下载本项目删除无用的文件
  • 2.修改项目包名及各组件包结构,修改 AppName
  • 3.填写自己的 Bugly key 在 BaseApplication initialize() 方法中
  • 这样就可以使用了,当然可以删除不用的第三方,或者添加相应要使用的第三方,具体规范看下面的框架解读

Demo

  • 项目里有一个demo分支,这是我写的一个小例子,可以结合Demo去熟悉这个框架

框架解读

组件化相关

  • 本框架采用的是组件化架构,核心组件就是 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 参数控制,项目业务复杂起来后,就需要为每个组件单独编写供其正常单独运行的逻辑代码

MVVM相关

  • MVVM 采用 Jetpack 组件 + Repository 设计模式 实现,所使用的 Jetpack 并不是很多,像 DataBinding、Hilt(不支持多模块)、Room 等并没有使用,如果需要可以添加。采用架构模式目的就是为了解偶代码,对代码进行分层,各模块各司其职,所以既然使用了架构模式那就要遵守好规范
  • Repository 仓库层负责数据的提供,ViewModel 无需关心数据的来源,Repository 内避免使用 LiveData,框架里使用了 Kotlin 协程的 Flow 进行处理请求或访问数据库,最后将数据发射到 ViewModel 调用者,Flow上游负责提供数据,下游也就是ViewModel获取到数据使用LiveData进行存储,View层订阅LiveData,实现数据驱动视图
  • 三者的依赖都是单向依赖,View -> ViewModel -> Repository

示例代码及注意事项🐽

ViewModel

ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。
使用方式:

class MainViewModel : ViewModel(){

}

class MainActivity : AppCompatActivity() {

// 获取无参构造的ViewModel实例

val mViewModel = ViewModelProvider(this).get(MainViewModel::class.java)

}

复制代码

资料:

官方文档: developer.android.com/topic/libra...

Android ViewModel,再学不会你砍我: juejin.im/post/684490...

LiveData

LiveData是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 ActivityFragmentService)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者

LiveData 分为可变值的MutableLiveData和不可变值的LiveData
常用方法:

fun test() {

val liveData = MutableLiveData()

// 设置更新数据源

liveData.value = "LiveData"

// 将任务发布到主线程以设置给定值

liveData.postValue("LiveData")

// 获取值

val value = liveData.value

// 观察数据源更改(第一个参数应是owner:LifecycleOwner 比如实现了LifecycleOwner接口的Activity)

liveData.observe(this, {

// 数据源更改后触发的逻辑

})

}

复制代码

资料:

官方文档: developer.android.com/topic/libra...

Lifecycle

Lifecycle 是一个类,用于存储有关组件(如 ActivityFragment)的生命周期状态的信息,并允许其他对象观察此状态。
LifecycleOwner 是单一方法接口,表示类具有 Lifecycle。它具有一种方法(即 getLifecycle()),该方法必须由类实现。

实现 LifecycleObserver 的组件可与实现 LifecycleOwner 的组件无缝协同工作,因为所有者可以提供生命周期,而观察者可以注册以观察生命周期。

资料:

官方文档: developer.android.com/topic/libra...

ViewBinding

通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。

在大多数情况下,视图绑定会替代 findViewById
使用方式:

按模块启用ViewBinding

// 模块下的build.gradle文件

android {

// 开启ViewBinding

// 高版本AS

buildFeatures {

viewBinding = true

}

// 低版本AS 最低3.6

viewBinding {

enabled = true

}

}

复制代码

ActivityViewBinding 的使用

// 之前设置视图的方法

setContentView(R.layout.activity_main)

// 使用ViewBinding后的方法

val mBinding = ActivityMainBinding.inflate(layoutInflater)

setContentView(mBinding.root)

// ActivityMainBinding类是根据布局自动生成的 如果没有请先build一下项目

// ViewBinding会将控件id转换为小驼峰命名法,所以为了保持一致规范,在xml里声明id时也请使用小驼峰命名法

// 比如你有一个id为mText的控件,可以这样使用

mBinding.mText.te​

xt = "ViewBinding"

复制代码

FragmentViewBinding 的使用

// 原来的写法

return inflater.inflate(R.layout.fragment_blank, container, false)

// 使用ViewBinding的写法

mBinding = FragmentBlankBinding.inflate(inflater)

return mBinding.root

复制代码

资料:

官方文档: developer.android.com/topic/libra...

CSDN: blog.csdn.net/u010976213/...

ARoute

ARoute是阿里巴巴的一个用于帮助 Android App 进行组件化改造的框架 ------ 支持模块间的路由、通信、解耦
使用方式:

// 1.在需要进行路由跳转的Activity或Fragment上添加 @Route 注解

@Route(path = "/test/activity")

public class YourActivity extend Activity {

...

}

// 2.发起路由跳转

ARouter.getInstance()

.build("目标路由地址")

.navigation()

// 3.携带参数跳转

ARouter.getInstance()

.build("目标路由地址")

.withLong("key1", 666L)

.withString("key3", "888")

.withObject("key4", new Test("Jack", "Rose"))

.navigation()

// 4.接收参数

@Route(path = RouteUrl.MainActivity2)

class MainActivity : AppCompatActivity() {

// 通过name来映射URL中的不同参数

@Autowired(name = "key")

lateinit var name: String

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(mBinding.root)

// ARouter 依赖注入 ARouter会自动对字段进行赋值,无需主动获取

ARouter.getInstance().inject(this)

}

}

// 5.获取Fragment

Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();

复制代码

资料:

官方文档:github.com/alibaba/ARo...

屏幕适配 AndroidAutoSize

屏幕适配使用的是 JessYan 大佬的 今日头条屏幕适配方案终极版

GitHub: github.com/JessYanCodi...
使用方式:

// 在清单文件中声明

// 主单位使用dp 没设置副单位

// 默认是以竖屏的宽度为基准进行适配

// 如果是横屏项目要适配Pad(Pad适配尽量使用两套布局 因为手机和Pad屏幕宽比差距很大 无法完美适配)

// 以高度为基准进行适配 (还需要手动代码设置以高度为基准进行适配) 目前以高度适配比宽度为基准适配 效果要好

// 在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 -> }

复制代码

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中...(img-takktOGA-1719099514376)]一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

相关推荐
openinstall全渠道统计9 分钟前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
双鱼大猫31 分钟前
一句话说透Android里面的ServiceManager的注册服务
android
双鱼大猫1 小时前
一句话说透Android里面的Window的内部机制
android
双鱼大猫2 小时前
一句话说透Android里面的为什么要设计Window?
android
双鱼大猫2 小时前
一句话说透Android里面的主线程创建时机,frameworks层面分析
android
苏金标2 小时前
android 快速定位当前页面
android
小丑西瓜6665 小时前
分布式简单理解
linux·redis·分布式·架构·架构演变
雾里看山6 小时前
【MySQL】内置函数
android·数据库·mysql
风浅月明6 小时前
[Android]页面间传递model列表
android
法迪6 小时前
Android自带的省电模式主要做什么呢?
android·功耗