今天看啥  ›  专栏  ›  非非白

单 Activity 架构组件

非非白  · 掘金  ·  · 2018-01-15 08:24

单 Acvitivy 架构是指整个应用只有一个 MainActivity, 可能还有个 SplashAcvitiy 来作为闪屏。笔者有个项目比较特殊,必须用单 Activity 来实现。单 Activity 架构的一个挑战就是需要处理好 Fragment 的嵌套问题,曾经有最佳实践明确指出,尽量不要嵌套使用 Fragment。

但是,随着 google 对 Fragment 相关 api 的完善,这一戒律已经过时。

笔者到 google 上一搜,也有不少文章或开源库讲单 Activity 架构的哦

知乎团队:Single Activity Multiple Fragments Architecture

Modern Android: Ditching Activities and Fragments

因为其他同学可能也对单 Activity 架构感兴趣,因此笔者从项目中抽离出了这个子项目,专门用来处理单 Acvitity 架构的问题。

由于笔者也做了几年的 iOS 开发,而 iOS 的导航系统是比较完善的。因此这个单 Activity 架构组件的设计参考了 iOS 的导航系统。

在 iOS 中,只有一个 keyWindow,它可以设置一个 rootViewController,这个 rootViewController 可能是一个容器,里面包含着其它 UIViewController, 而被包含的 controller 可能也还是个容器。也就是说,在 iOS 中,控制器是一层套一层的。

碰巧,在 Android 中,Activity 也是一个 Window,Activity 也可以设置 Fragment, Fragment 也可以嵌套,感觉就是异曲同工啊。

所以呢,笔者就照着 iOS 的样子,实现这个组件

Compare with iOS

AndroidNavigation iOS
AwesomeActivity Window
AwesomeActivity#setRootFragment Window#rootViewController
AwesomeFragment UIViewController
NavigationFragment UINavigationController
TabBarFragment UITabBarController
DrawerFragment -

特性

  • 使用 Lifecycle 架构组件,解决了生命周期问题
  • 以 iOS 的导航系统为参照,因为 iOS 的导航系统设计得比较完善,支持 push, pop, popTo, popToRoot, present, dismiss, replace, replaceToRoot 等操作
  • 支持 StatusBar, ToolBar, BottomBar 的全局样式配置以及局部调整
  • 支持 vector fonts

第三第四点尚未完全实现,仍在开发中

截图

如果你身边有同学也对单 Activity 架构感兴趣,那么推荐给他吧。

源码地址




原文地址:访问原文地址
快照地址: 访问文章快照