续前篇《献给android原生应用层开发初学者技术架构选型和整合的方案思路(三)》

本构架采用的 多Activity + 多 Fragments 开发模块,所以以下先介绍BaseFragment 一步步封装的过程。

以下的成品代码可见本人放在 GitHub 上的项目。

  1. 新建一个 package,比如叫 general.core,在些 package中新建一个抽象 Kotlin Class,取名RxLifecycleMvRxFragment,本对象用来继承BaseMvRxFragment,可以获得 MvRx MVVM 架构的相关功能,同时实现rxLifeCycle2库的接口LifecycleProvider<FragmentEvent>以解决 RxJava的内存泄露问题。通过BehaviorSubject对象 override Fragment 的各个生命周期函数对外发射生命周期事件,实现Fragment生命周期事件感知。RxLifeCycle官方文档表示可以继承他们的 RxAppCompatDialogFragment抽象类,但是因为类的单继承特性,继承类已经被BaseMvRxFragment占用,故打开RxAppCompatDialogFragment的源代码直接复制即可,因为面向接口编程的设计原则,后续只针对LifecycleProvider<FragmentEvent>进行操作,故不需继承官方的 BaseFragment,方便我们自己封装。参见文章《解决RxJava内存泄漏》。代码示例如下:
abstract class RxLifecycleMvRxFragment : BaseMvRxFragment(), LifecycleProvider<FragmentEvent> {
    private val lifecycleSubject = BehaviorSubject.create<FragmentEvent>()
    @CheckResult
    override fun lifecycle(): Observable<FragmentEvent> {
        return this.lifecycleSubject.hide()
    }

    @CheckResult
    override fun <T> bindUntilEvent(event: FragmentEvent): LifecycleTransformer<T> {
        return RxLifecycle.bindUntilEvent(this.lifecycleSubject, event)
    }

    @CheckResult
    override fun <T> bindToLifecycle(): LifecycleTransformer<T> {
        return RxLifecycleAndroid.bindFragment(this.lifecycleSubject)
    }

    override fun onAttach(activity: Activity?) {
        super.onAttach(activity)
        this.lifecycleSubject.onNext(FragmentEvent.ATTACH)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        this.lifecycleSubject.onNext(FragmentEvent.CREATE)
    }
}
  1. 新建abstract class FragmentationSupportFragment 抽象 Kotlin 类,继承上一步的RxLifecycleMvRxFragment,同时实现 Fragmatation 库的ISupportFragment接口,以解决作者发现的 Fragment 的若干个 BUG。根据库作者建议,可全盘照抄他采用代理模式SupportFragmentDelegate相关 override生命周期的操作代码和他封装的有关 Fragment 的栈操作公共方法。又因 Kotlin 的默认参数值的语法糖,可以进一步简化原 Java 代码的重载方法为一个方法。
abstract class FragmentationSupportFragment : RxLifecycleMvRxFragment(), ISupportFragment {
    private val mDelegate by lazy { SupportFragmentDelegate(this) }
    private lateinit var mInnerActivity: FragmentActivity

    /**
     * 作为当前实例中的 fragmentManager 统一管理 fragment 的容器 containerId
     */
    abstract fun getContextViewId(): Int

    override fun getSupportDelegate(): SupportFragmentDelegate {
        return mDelegate
    }

    /**
     * Perform some extra transactions.
     * 额外的事务:自定义Tag,添加SharedElement动画,操作非回退栈Fragment
     */
    override fun extraTransaction(): ExtraTransaction {
        return mDelegate.extraTransaction()
    }

    override fun onAttach(activity: Activity?) {
        super.onAttach(activity)
        mDelegate.onAttach(activity!!)
        mInnerActivity = mDelegate.activity
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mDelegate.onCreate(savedInstanceState)
    }
}
  1. 在上述FragmentationSupportFragment中新增一个抽象方法abstract fun getContextViewId(): Int供在最后的实现类中 override,本方法需要返回一个正数值(通常该数值配置成 Fragament 的 xml layout 的 R.id),作用是作为当前实例中的 fragmentManager 统一管理 fragment 的容器 containerId。在 Fragmataion 中封装的栈管理方法中也多处使用了该方法的返回值。
  2. 新建abstract classSwipeBackSupportFragment抽象 Kotlin 类,继承上一步的FragmentationSupportFragment,同时实现 Fragmatation 库的ISwipeBackFragment接口,以实现 Fragment 的手势滑动退出功能,增强用户体验。根据库作者建议,可全盘照抄他的SwipeBackSupprtFragment 中的处理代码,方便在最终的实例子类中调用或者 override调整功能。同样该功能也是采用代理模式编程,所有操作委托给SwipeBackFragmentDelegate的 API 函数,降低对Fragment 原有代码的入侵,让集成更为简洁。代码示例:
abstract class SwipeBackSupportFragment : FragmentationSupportFragment(), ISwipeBackFragment {
    private val mDelegate by lazy { SwipeBackFragmentDelegate(this) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mDelegate.onCreate(savedInstanceState)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mDelegate.onViewCreated(view, savedInstanceState)
    }

    override fun attachToSwipeBack(view: View): View {
        return mDelegate.attachToSwipeBack(view)
    }
}

下面介绍一下 BaseActivity 一步步的封装过程:

与最终封装 BaseFragment 前类似,我们也需要封装集成 RxLifeCycle 到自定义的 Activity 中,还有FragmatationSupport,SwipeBack 的功能,每一步类的封装也同样是采用 mDelegate 代理对象操作。BaseMvRxActivity --> RxLifecycleMvRxActivity --> FragmentationSupportActivity --> SwipeBackSupportActivity.在此不贴出详细的过程,可参见本文对应的 GitHub 工程库

下一篇文章介绍最终 BaseFragment和 BaseActivity 的封装。

后续《献给android原生应用层开发初学者技术架构选型和整合的方案思路(五)》