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的架构。其他组件则更侧重于其他功能方面的解耦和可测试性。
嗯,感觉很厉害!
相关文章推荐
- Android横竖屏切换总结(Android资料)
- android studio debug签名设置
- android横竖屏切换时Activity的生命周期
- Android 4.4 Kitkat Phone工作流程浅析(四)__RILJ工作流程简析
- Android开发者必知的开发资源
- android studio打.so文件遇到的问题
- android 控件 下拉刷新 Android-PullToRefresh
- Android Studio如何打包APK与查看打包后的SHA1
- Android App中ListView仿QQ实现滑动删除效果的要点解析
- 实现正在加载中界面的Android库:DynamicBox
- 关于Android蓝牙设备的连接使用
- Android Service与Activity之间通信使用Messenger方式
- Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析
- Phonegap插件编写注册与使用
- Android总结 - Fragment
- 如何在Android模拟器上访问电脑本地的Web应用
- Android studio中获取SHA1码及MD5码、及无法使用Keytool命令
- Android带渐变效果的圆角矩形Demo
- windows系统上安装与使用Android NDK r5(转)
- 3. Android框架和工具之 xUtils(DbUtils )