类图

横向是包含关系,竖向是继承关系。
首先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;
}

注意参数,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的架构。其他组件则更侧重于其他功能方面的解耦和可测试性。
嗯,感觉很厉害!

更多相关文章

  1. Java线程的生命周期和状态控制
  2. Android项目实战--手机卫士01--启动界面
  3. android 输入法界面显示的开关
  4. 问题记录-Activity跳转后显示空白界面
  5. DroidDraw---Android的界面设计工具
  6. Android Service的生命周期图解
  7. Android界面的.9.png图片显示出错,怎么回事啊?
  8. Android 实现多页界面左右滑动切换效果之进阶
  9. 仿微信公众号界面实现

随机推荐

  1. PHP的SOAP扩展原理和使用(转)
  2. 如果ROW2包含“string”,MySQL会更改ROW1
  3. Ubuntu 9.04:Pecl扩展名下载但不安装
  4. 跟踪PHP中的登录用户
  5. php连接mssql两种方法(com & pdo)
  6. 本机PHP函数将授予我直接访问字符串部分
  7. php多进程处理
  8. 基于MySQL查询的Laravel路由
  9. 【实战】如何通过html+css+mysql+php来快
  10. 在使用PHP编程时,使用存储过程还是硬编码S