横向是包含关系,竖向是继承关系。
首先Activity
需要视图支持,所以有ViewGroup
,需要生命周期,所以有LifecycHandler
,还需要跳转其他Activity
,所以有ControllerChangeHandler
。
可见Router
是联系各组件的关键,下面我们从Router的代码开始整个架构。
在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;
}
注意参数,Activity
!LifecycleHandler
是一个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
创建Router
,Router
持有根视图,持有LifecycleHandler
(LifecycleHandler
持有Activity
实例),因此可以实现界面,生命周期和跳转。
在根Activity
中其实只有一个根ViewGroup
。真正的界面实现需要Controller
。
实现界面需要inflateView
或onCreateView
,再进行界面实现。
Router.performControllerChange()
是跳转的开始, 接着调用ControllerChangeHandler.executeChange
,继续调用performChange
。ControllerChangeHandler
的子类需要复写了父类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的架构。其他组件则更侧重于其他功能方面的解耦和可测试性。
嗯,感觉很厉害!