Dilemma: when to use Fragments vs Activities:
我知道
直到不久前,我开发了一个应用程序,因为它说应该开发它们。我创建了一个
最近我偶然发现一个只有2个
我喜欢这种方法的原因是,由于应用程序使用了
所以我想我要问的是分享你关于这个主题的当前开发方式,我知道乍一看它可能看起来像一个基于意见的问题,但我把它看作是一个安卓设计和架构问题…不是基于观点的。
更新(2014年5月1日):以下是来自Square的EricBurke的演讲(我不得不说,这是一个很好的演讲,有很多有用的工具供Android开发者使用)。我和Square没有任何关系)
http://www.infoq.com/presentations/android-design/
根据我过去几个月的个人经验,我发现构建应用程序的最佳方法是创建一组片段,这些片段表示应用程序中的流,并将所有这些片段显示在一个
专家会告诉你:"当我看到用户界面时,我会知道是使用
我发现有一个很好的做法对我很有帮助。当我试图向女儿解释一些事情时,我突然想到了。
也就是说,想象一个代表屏幕的盒子。你能在这个盒子里再装一个屏幕吗?如果使用新框,是否必须从第一个框复制多个项目?如果答案是肯定的,那么您应该使用
但别忘了你总是需要一个盒子容器(
小心不要误用盒子。安卓用户体验专家建议(你可以在YouTube上找到),当我们显式加载另一个
你现在能看看你的用户界面,找出你是需要一个
我的哲学是:
只有在绝对必要时才创建活动。由于后堆栈可用于提交大量碎片事务,我尝试在应用程序中创建尽可能少的活动。此外,不同片段之间的通信比在活动之间来回发送数据容易得多。
活动转换很昂贵,对吗?至少我相信是这样的-因为旧的活动必须被销毁/暂停/停止,推到堆栈上,然后必须创建/启动/恢复新的活动。
自从碎片被引进以来,这只是我的哲学。
好吧,根据谷歌的讲座(也许在这里,我不记得了),你应该考虑在任何可能的时候使用片段,因为它使你的代码更容易维护和控制。
然而,我认为在某些情况下,它可能变得过于复杂,因为承载片段的活动需要在它们之间导航/通信。
我认为你应该自己决定什么对你最好。通常把一个活动转换成一个片段并不难,反之亦然。
我已经在这里写了一篇关于DILEMA的文章,如果你想进一步阅读的话。
为什么在所有情况下我都喜欢片段而不是活动。
活动是昂贵的。在fragment中,视图和属性状态是分离的——只要一个片段在
backstack 中,它的视图就会被破坏。所以您可以堆叠比活动更多的片段。backstack 操纵。使用FragmentManager ,很容易清除所有碎片,插入的碎片比碎片和ETC要多。但对于活动来说,操纵这些东西将是一场噩梦。可预测的生命周期。只要主机活动不被回收。背衬中的碎片将不会被回收。因此可以使用
FragmentManager::getFragments() 来寻找特定的片段(不鼓励)。
在我看来,这并不真正相关。要考虑的关键因素是
片段的主要用途是构建多通道活动,这使得它非常适合平板电脑/手机响应应用程序。
由于Jetpack,单活动应用程序是首选的架构。特别适用于导航体系结构组件。
来源
这比你意识到的要多得多,你必须记住的是,一个被启动的活动不会隐式地破坏调用活动。当然,您可以将其设置为用户单击某个按钮以转到某个页面,启动该页面的活动并销毁当前页面。这会导致很多开销。我能给你的最好的指导是:
**只有当主活动同时打开时才启动新活动(考虑多个窗口)。
谷歌驱动器就是一个很好的例子,说明多个活动何时有意义。主活动提供文件资源管理器。打开文件时,将启动一个新的活动来查看该文件。您可以按"最近使用的应用程序"按钮,这样就可以在不关闭打开的文档的情况下返回浏览器,然后甚至可以与第一个文档并行打开另一个文档。
不要忘记,活动是应用程序的块/组件,可以通过意图共享和启动!所以应用程序中的每个活动应该只解决一种任务。如果应用程序中只有一个任务,那么我认为如果需要,您只需要一个活动和许多片段。当然,您可以在将来解决其他任务的活动中重用片段。这种方法将清晰而合乎逻辑地分离任务。对于不同的片段集,您不需要使用不同的意图过滤器参数来维护一个活动。您可以根据需求在开发过程的设计阶段定义任务。
我做的事:尽可能少用碎片。不幸的是,这几乎是可能的。所以,我最终得到了很多片段和一些活动。我意识到了一些缺点:
ActionBar 菜单:当两个片段的标题、菜单不同时,很难处理。示例:添加新片段时,可以更改操作栏标题,但从backstack 中弹出时,无法恢复旧标题。对于本例,您可能需要在每个片段中都有一个工具栏,但请相信我,这将花费您更多的时间。- 当我们需要
startForResult 时,活动有,片段没有。 - 默认情况下没有过渡动画
我的解决方案是使用一个活动在里面包装一个片段。所以我们有单独的操作栏,菜单,
与活动相比,
你可以随意使用其中一个。< BR>基本上,你必须评估哪一个对你的应用是最好的。考虑如何管理业务流以及如何存储/管理数据首选项。
想想,片段是如何存储垃圾数据的。当您实现片段时,您有一个活动根来填充片段。因此,如果你试图用太多的片段来实现很多活动,你必须考虑应用程序的性能,因为你在操纵(粗略地说)两个上下文生命周期,记住复杂性。
记住:我应该使用碎片吗?为什么我不能?
当做。
这取决于你真正想要建造什么。例如,EDCOX1〔13〕使用片段。标签使用EDOCX1,11也一样。另一个很好的实现,是在EDOCX1的15个方面。当您旋转电话并单击一行时,活动将显示在剩余屏幕的一半。我个人使用EDOCX1 11和EDOCX1 17,因为它更专业。此外,它们在旋转过程中处理起来更容易。
每个应用程序使用一个活动为
我使用片段来获得更好的用户体验。例如,如果您有一个按钮,并且您想要运行它,比如当您单击一个WebService时,我将一个片段附加到父活动。
1 2 3 4 5 6 7 8 9 10 | if (id == R.id.forecast) { ForecastFragment forecastFragment = new ForecastFragment(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.main_content, forecastFragment); ft.addToBackStack("backstack"); forecastFragment.setArguments(b); ft.commit(); } |
这样,用户就不必移动到其他活动中。
第二,我更喜欢片段,因为在旋转过程中可以很容易地处理它们。