单 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 架构感兴趣,那么推荐给他吧。
作者:非非白
链接:https://juejin.im/post/5a5c57f96fb9a01cb1391dcb