Android高可拓展框架Conductor源码解析(2)

类图

横向是包含关系,竖向是继承关系。
首先Activity需要视图支持,所以有ViewGroup,需要生命周期,所以有LifecycHandler,还需要跳转其他Activity,所以有ControllerChangeHandler
可见Router是联系各组件的关键,下面我们从Router的代码开始整个架构。

Android高可拓展框架Conductor源码解析(2)_第1张图片

源码

初始化

Activity中调用,详见上篇

 mRouter = Conductor.attachRouter(this, mContainer, savedInstanceState);
    if (!mRouter.hasRootController()) {
        mRouter.setRoot(new HomeController());
    }

看一下初始化的方法

    public static Router attachRouter(@NonNull Activity activity, @NonNull ViewGroup container, Bundle savedInstanceState) {
    LifecycleHandler lifecycleHandler = LifecycleHandler.install(activity);

    Router router = lifecycleHandler.getRouter(container, savedInstanceState);
    router.rebindIfNeeded();

    return router;
}

注意参数,ActivityLifecycleHandler是一个Fragment,需要持有Activity的引用,控制跳转和生命周期。

ViewGroup!LifecycleHandler持有一个键值对(ViewId/Router)的Router缓存列表,若不存在缓存则新建。rebindIfNeeded()用于设置根视图。

开天辟地

看一下setRoot的关键代码

 public void setRoot(@NonNull Controller controller, String tag, ControllerChangeHandler changeHandler) {
        RouterTransaction currentTop = mBackStack.peek();
........

        trackDestroyingControllers(mBackStack.popAll());

        RouterTransaction transaction = RouterTransaction.builder(controller)
                .tag(tag)
                .pushChangeHandler(changeHandler != null ? changeHandler : new SimpleSwapChangeHandler())
                .popChangeHandler(new SimpleSwapChangeHandler())
                .build();

        pushToBackstack(transaction);
        performControllerChange(transaction, currentTop, true);
    }

先取当前第一个RouterTransaction,然后销毁所有Controller,构建一个新的RouterTransaction加入列表并执行这个RouterTransaction
先忽略具体的实现,回头看一看刚刚整个创建的过程,在Activity创建RouterRouter持有根视图,持有LifecycleHandler(LifecycleHandler持有Activity实例),因此可以实现界面生命周期跳转

界面实现

在根Activity中其实只有一个根ViewGroup。真正的界面实现需要Controller
实现界面需要inflateViewonCreateView,再进行界面实现。

跳转

Router.performControllerChange()是跳转的开始, 接着调用ControllerChangeHandler.executeChange,继续调用performChangeControllerChangeHandler的子类需要复写了父类performChange,通过container.removeView(from)container.addView(to)移除和添加视图,另外可以添加动画和过渡的东西。

生命周期

极大地减少生命周期的复杂性,保留了日常开发中最频繁使用的生命周期函数。
喵一眼。

    public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }

通过getApplication().registerActivityLifecycleCallbacks()注册生命周期方法监听。通过Router->Transaction->最终在Controller中暴露出回调方法。

总结

Router像一个分发器,Controller更像View和Control的集合,可以扩展出各种MVC,MVP,MVVM的架构。其他组件则更侧重于其他功能方面的解耦和可测试性。
嗯,感觉很厉害!

你可能感兴趣的:(Android)