正文
单 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
第三第四点尚未完全实现,仍在开发中