App架构设计之BaseApplication(1)

416 阅读3分钟

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)
    }
}

后续可能会出写一系列关于架构设计的内容,有兴趣的同学可以关注下。