api 'com.jyc:aac_library:1.0.1'
android support ->必须是androidx
implementation 'androidx.appcompat:appcompat:1.0.2'
base库默认依赖第三方库
//kotlin
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api "androidx.core:core-ktx:1.0.2"
//rxjava2
api 'io.reactivex.rxjava2:rxjava:2.2.2'
api 'io.reactivex.rxjava2:rxandroid:2.1.0'
//retrofit2
api 'com.squareup.retrofit2:converter-gson:2.5.0'
api 'com.squareup.retrofit2:retrofit:2.5.0'
api 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
//okhttp
api 'com.squareup.okhttp3:okhttp:3.14.2'
api 'com.squareup.okhttp3:logging-interceptor:3.11.0'
//lifecycle 生命周期
api "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
//net status 全局网络监听
api 'com.sunchen:netstatusbus:0.1.5'
//base adapter 万能adapter
api 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.47-androidx'
// log print 日志打印
api 'com.orhanobut:logger:2.2.0'
//popup window 万能弹窗
//api 'com.lxj:xpopup:1.8.7-x'
//glide 图片处理
api 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
//glide 处理变换
implementation 'jp.wasabeef:glide-transformations:2.0.2'
//utils 工具类 很强大
api 'com.blankj:utilcodex:1.25.4'
界面层(MVVM-V)
V层即View层 : 就是 静态的XML文件 负责绘制界面布局 包括
数据层(MVVM-M)
M层即Model层 : 负责定义解析数据 数据来源有:
业务控制层(MVVM-VM)
VM层即ViewModel : 从Repository 仓库获取数据,对数据进行处理,类似Controller和Presenter 的角色,区别是ViewModel 角色比较单纯 不涉及UI相关的操作只处理业务相关数据 通过中间件LiveData与UI进行通讯
基于MVVM的代码模块划分总结
UI 界面
BaseActivity
BaseFragment
1.包含activity的Base操作
2.懒加载机制
BaseAdapter
1.item视图填充
2.支持一个RecycleView 多Type类型view
3.点击/长按事件
BaseViewModel
1.业务处理 统一公共操作 loading dismiss toast等...
NetWork 网络框架
这里采用RxJava+OkHttp+Retrifit 封装一套完整的网络请求 并需要支持以下接口:
Libs 第三方或自己的
Widgets 自定义公共组件
Utils 工具类
直接使用了强大的AndroidUtilCode
组件通讯
应用内通讯
Intent/Bundle
主要在于activity和fragment,service之间的通讯
Handler
主线程和子线程之间的通信
EventBus
管理比较混乱 需要注册反注册容易出错
RxBus
配合RxJava 比较方便
LiveDataBus
配合LiveData 比较方便
综上 目前选择 LiveDataBus 因为框架使用了LiveData库
进程间通讯
IPC(Inter-Process Communication)为进程间通信或跨进程通信,是指两个进程进行进程间通信的过程。
Android中进程间通信方式
1.并发读写不可靠 可以是XML 、JSON、FILE
2.无法进程间实时通信
1.被动的进程间通讯,属于系统级别的监听,仅一次有效
2.接收器中10s内未处理完事件会直接ANR 建议不要做耗时操作
3.通过AMS进行转发过滤注册的Action回调通知onRecive函数
1.网络通信
1.ContentResolver进行监听数据库 操作数据库 增删改查
2.ContentProvider
1.轻量级IPC 基于AIDL实现 单进程处理 不支持并发
2.只支持Bundle类型数据
1.处理多线程,多客户端并发访问
2.支持实时通信 使用较复杂
图标形式看吧
方案 | Bundle | File Share | BroadCast | Socket | ContentProvider | Messenger | AIDL |
---|---|---|---|---|---|---|---|
优点 | 使用简单 | 使用简单 | 使用简单 | 网络通信 | 使用简单 | 轻量级IPC | 支持多并发访问 |
缺点 | 数据类型大小有限制 | 不支持实时,不支持并发 | 消耗资源大 | 支持实时跨进程 | 仅支持Bundle 不支持并发 | 支持实时通信 | |
跳转 | 网络监听等 | IM | 全局变量 | 所有 |
基于binder封装的okbinder 无需创建aidl接口 通过java接口及注解 实现进程间通讯 比较便捷
/**
* Aidl业务回调接口 须添加 @OkBinder.Interface 注解
*/
@OkBinder.Interface
interface ICallback {
val data: String
fun onResult(result: String)
}
/**
* 抽象的Service
*/
abstract class BaseService : Service() {
abstract fun initOkBinder():OkBinder
override fun onBind(intent: Intent?): IBinder? {
return initOkBinder()
}
}
/**
* 自定义Aidl业务接口 须添加 @OkBinder.Interface 注解
*/
@OkBinder.Interface
interface IRemoteService {
fun doSomething(data:String,callback:ICallback)
}
/**
* 具体的Service
*/
class MyService : BaseService() {
override fun initOkBinder(): OkBinder {
return OkBinder(object : IRemoteService {
override fun doSomething(data: String, callback: ICallback) {
Log.d("okbinder", ">> **data = $data ** <<")
Log.d("okbinder", ">> **callback.data = ${callback.data} ** <<")
callback.onResult("I am from binder callback data")
}
})
}
}
类图
时序图