为何 JakeWharton 建议:App 只要用到一个 Activity ?

安卓开发大神级人物 JakeWharton 前不久在接受采访时提出一个颇具争议而又没有给出缘由的建议:一个 App 只须要一个 Activity ,你可使用 Fragments,只是别用 Fragments 回退栈。android

针对这一言论,有关 JakeWharton 建议的背后缘由的一个提问迅速在 Reddit 国外网站的安卓开发频道引起热评。程序员

众多安卓开发人员纷纷提出本身的看法。其中获赞最高的一条,甚至获得 JakeWharton 本人的亲自赞评。面试

咱们来看看这条回答都提到了哪些内容,对 Activity 和 Fragment 之间的爱恨情仇有何独到的看法,凭什么能获得 JakeWharton 本尊的青睐有加。微信


由于 Activity 是一个程序入口。你能够将其视为 app 的一个 main 函数。站在用户的立场上,一般你进入 app 的方式可能包括如下几种:app

  • launcher 桌面程序(main 函数入口);dom

  • 来自参数化 main 函数入口的通知栏,而且导航到 app 的指定位置;函数

  • 若是你作的是一个相机应用,那么须要处理图片请求的 intents;布局

  • 若是你作的是一个社交产品,那么须要处理 share 请求的 intents;动画

差很少相似这些场景。网站

可是,若是你真的不用分享和来自应用的 intents 的话,而且惟一的程序入口就是 launcher 桌面,别为每个页面建立一个新的入口。这样作其实没有意义。为何没有意义?由于这种场景下,进程死掉后 launcher 可以启动任何你应用中的 Activity 页面。

Fragments 是处理生命周期事件的视图控制器,而且很是不错。然而,Fragments 回退栈简直垃圾;回退栈变化监听器老是不正常地被调用( 1 次 transaction 三次调用?),而且不告诉你调用什么,而在恢复事务时也不知道哪些 fragments 是可用的。

你能够给事务添加 tag 标签,而后从栈中弹出操做,可是仅仅是一个 main -> Events -> Details(id=123) 的操做流程就至关繁琐了。

一样的,一旦你将一个 Fragment 放进回退栈中,我我的不知道它的生命周期开始作什么。我曾经遇到过一个后台中的 fragment 被调用四次 onCreateView() 方法,我甚至不知道究竟怎么了。而没有位于回退栈中的 Fragments 是能够被预见的。它们的动画支持有点古怪,但至少它们还能使用。

因此若是你想知道哪些 Fragments 是你可以操做的而且哪些 views 是你正在展现的而且可以在你本身的导航状态控制之中,那么你应该本身处理导航操做。把“应用逻辑”抽象化到一个 presenter(亦枫注:MVP 模式)中听起来来很棒,可是你是否是脱离了应用视图层里面的真实状况?

可是单一 activity 的优点是什么?

更简单的生命周期处理(例如,当 app 进入后台时,你只须要处理 onStop 方法),更少错误空间,和更多控制。一样的,你能够移动视图层外面的导航状态到 domain 层,或者至少到 presenter 中。不须要太多 view.navigateToDetail(songId) 之类的东西,你只须要在你的 presenter 或者 ViewModel 或者不管哪些时髦的用法中使用 backstack.goTo(SongKey.create(songId)) 就行。借助一个合适的库,当你到了 onResume 时它会自动将这些导航调用加入队列,而且不会导致 fragment 事务发生崩溃,很是得好。

尽管 Google 给出的案例也在用 commitAllowingStateLoss(),我有使用 commitNow() 的动画爱好。在我看来,单个 activity 可以看得见的好处就是,页面间共享 views 的能力,取代经过使用 <include 标签在 18 个布局文件重复视图。其余固然是更简单的导航操做。


以上即是深得 JakeWharton 大神心意的一条回答。话虽如此,可是系统 Fragment 存在的未解之谜或者说出乎你意料的坑实在太多。若是必定要在多 activity 部分 fragments 和单 activity 多 fragments 之间选择的话,我想不仅是我,不少人仍是坚决果断地选择前者。

更多讨论内容,参见:

www.reddit.com/r/androidde…

备注:关于使用 Fragments 的那些道道,我以前也写过相关总结性的文章来,感兴趣地不妨去个人博客搜索看看。

关于我:亦枫,博客地址:yifeng.studio/,新浪微博:IT亦枫

微信扫描二维码,欢迎关注个人我的公众号:安卓笔记侠

不只分享个人原创技术文章,还有程序员的职场遐想

彩蛋:公众号回复关键字“面试资料”,获取 BAT 面试大牛为你准备的全套面试资料!

相关文章
相关标签/搜索