您的位置:首页 > 移动开发 > Android开发

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

2016-04-26 16:26 411 查看

类图

横向是包含关系,竖向是继承关系。

首先
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的架构。其他组件则更侧重于其他功能方面的解耦和可测试性。

嗯,感觉很厉害!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: