1. 自定义Application的作用
- SDK初始化;
- 启动或通用的业务处理,例如启动时的网络请求或者各自组件通用的业务;
- 统一的事件分发处理;
2.设计的目的
- 拆分SDK初始化或耗时任务执行,分同步、异步、闲时,目的是定义任务执行的优先级、减少应用启动耗时;
- 创建应用级别的ViewModel,目的是封装通用的业务处理;
- 统一处理事件分发,例如埋点事件上报,目的是解决多处理点不方便维护的问题;
3.BaseApplication基本框架
- 注释1:实现ViewModelStoreOwner、HasDefaultViewModelProviderFactory,具备存储、提供ViewModel的能力,使得各Activity或Fragment公用同一个ViewModel对象;
- 注释2:实现CoroutineScope,具备协程能力;
- 注释3:init,执行基本初始化代码,例如注册Application.ActivityLifecycleCallbacks;
- 注释4:onSyncInitialize,同步执行的代码块,定义成抽象,子类必须实现;
- 注释5:onAsyncInitialize,异步执行的代码块,通过协程进行调度,定义成抽象,子类必须实现;
- 注释6:onIdleInitialize,主线程闲时执行的代码块,子类根据实际情况实现;
- 注释7:observerEvent,处理全局Event的函数;
- 注意:onSyncInitialize、onAsyncInitialize定义为抽象,让子类有意识地拆分sdk的初始化以及耗时任务执行时机,不是一脑子低放在主线程执行,有效地降低应用启动时间;因为在onAsyncInitialize、onIdleInitialize初始化SDK有不可用预知性,所以建议在调用该SDK之前判断其是否初始化成功。
abstract class BaseApplication : Application(),
ViewModelStoreOwner, HasDefaultViewModelProviderFactory,//1
CoroutineScope by MainScope()//2
{
private val mViewModelStore: ViewModelStore by lazy {
ViewModelStore()
}
private val mDefaultFactory: ViewModelProvider.Factory by lazy {
ViewModelProvider.AndroidViewModelFactory.getInstance(this)
}
@Override
override fun getViewModelStore(): ViewModelStore {
return mViewModelStore
}
override fun getDefaultViewModelProviderFactory(): ViewModelProvider.Factory {
return mDefaultFactory
}
override fun onCreate() {
super.onCreate()
init()//3
onSyncInitialize()//4
launch(Dispatchers.IO) {//
onAsyncInitialize()
}
Looper.myQueue().addIdleHandler {//6
onIdleInitialize()
false
}
```
launch {
observerEvent()//7
}
}
/**
* 基本的初始化
*
*/
abstract fun init()
/***
* 异步初始化,
*/
abstract fun onAsyncInitialize()
/***
* 同步初始化
*/
abstract fun onSyncInitialize()
/***
* 利用idle初始化
*/
open fun onIdleInitialize() {}
/**
* 监听Event
*
*/
open fun observerEvent(){
}
}
4.子类Application的实现
class App : BaseApplication() {
companion object {
const val TAG = "App"
}
private val mViewModel by applicationViewModels<AppViewModel>()
override fun init() {} //TODO 基本初始化
override fun onSyncInitialize() {} //TODO 执行不耗时逻辑
override fun onAsyncInitialize() {}//TODO 执行耗时逻辑
override fun observerEvent() {
//TODO 监听Event
AppEventBus.eventFlow.collect { it ->
when (it) {
is AppEventBus.EventA -> {}//TODO 处理A事件
is AppEventBus.EventB -> {}////TODO 处理B事件
else -> {}
}
}
}
}
5.获取Application ViewModel的方式
//调用处
class RequestPermissionActivity : Activity{
private val appViewModel by applicationViewModels<AppViewModel2>()
//封装的扩展函数
inline fun <reified VM : ViewModel> Application.applicationViewModels(
noinline factoryProducer: (() -> ViewModelProvider.Factory)? = null
) = createViewModelLazy(VM::class, { (applicationContext as ViewModelStoreOwner).viewModelStore },
factoryProducer
?: { (applicationContext as HasDefaultViewModelProviderFactory).defaultViewModelProviderFactory })
fun <VM : ViewModel> Application.createViewModelLazy(
viewModelClass: KClass<VM>,
storeProducer: () -> ViewModelStore,
factoryProducer: (() -> ViewModelProvider.Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
(applicationContext as HasDefaultViewModelProviderFactory).defaultViewModelProviderFactory
}
return ViewModelLazy(viewModelClass, storeProducer, factoryPromise)
}
inline fun <reified VM : ViewModel> FragmentActivity.applicationViewModels(
noinline factoryProducer: (() -> ViewModelProvider.Factory)? = null
) = createViewModelLazy(VM::class, { (applicationContext as ViewModelStoreOwner).viewModelStore },
factoryProducer
?: { (applicationContext as HasDefaultViewModelProviderFactory).defaultViewModelProviderFactory })
fun <VM : ViewModel> FragmentActivity.createViewModelLazy(
viewModelClass: KClass<VM>,
storeProducer: () -> ViewModelStore,
factoryProducer: (() -> ViewModelProvider.Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
(applicationContext as HasDefaultViewModelProviderFactory).defaultViewModelProviderFactory
}
return ViewModelLazy(viewModelClass, storeProducer, factoryPromise)
}
6.AppEventBus的设计
SharedFlow的特点,可以有多个监听者且无粘性;
object AppEventBus {
sealed class AppEvent(open val data: Any? = null)
data class EventA(override val data: Any? = null) : AppEvent(data)
data class EventB(override val data: Any? = null) : AppEvent(data)
private val _EventFlow = MutableSharedFlow<AppEvent>()
val eventFlow: SharedFlow<AppEvent>
get() = _EventFlow
supsend fun emitEvent(event: AppEvent) {
_EventFlow.emit(event)
}
}
后续可能会出写一系列关于架构设计的内容,有兴趣的同学可以关注下。