android tutorial 分割或不分割-嵌套碎片反对活动。 为什么我应该使用多个活动?




fragment衣服 (4)

有很多关于你是否应该使用ActivitiesFragments的讨论。 例如:

我发现的大部分讨论都是在Android 4.2之前发布的。
随着Android 4.2谷歌发明嵌套片段

因此,我实际上没有看到任何理由使用多个Activity

Fragments的早期阶段,它们应该被用于应用程序中,以同时以舒适的方式支持平板电脑智能手机

因此,例如,您有一个ListView ,它可以在点击某个项目时打开一个详细View 。 在智能手机上,我们将替换ListView并显示详细的View 。 而不是使用详细信息视图替换列表的平板电脑可以同时显示两个Views

现在嵌套的Fragments有很多其他的可能性。 如果您想使用单个Activity ,则可以将常规信息存储在Activity并且每个Fragment都可以访问它。

除此之外,嵌套Fragments也可以存储子Fragments

通过Fragments我可以轻松地重新使用Views ,我可以同时显示多个Fragment ,并且我可以很容易地从Fragment形成一个对话框。 这一切只会带来一些复制和粘贴操作。

如果我使用“ Activities则必须改变很多才能完成此操作。

我最近实现了一个应用程序 ,我可以轻松使用两个Fragment-ViewPager将事情变得非常美丽和动态(某种:今日信息 - 昨日信息)。 在我看来, Fragments让我们的生活更轻松:)

问题:

  • 为什么我应该使用多个Activity

你能提供一个很好的例子,其中多个Activities的使用更有意义而不是使用Fragments

  • 有没有什么很好的例子,你没有别的选择,只能使用Activities

我认为大多数更大的框架(如MapsYouTube和co)已经支持Fragments 。 所以我们不必依赖Activities 。 在使用Fragments情况下,处理NavigationBarTabHostsViewPagerActionBar也很容易。

来自Udacity:

为什么不总是创建一个有很多碎片的活动?

  1. 复杂性增加
  2. 更难的意图处理
  3. 难以阅读,维护和测试
  4. 紧密耦合的风险
  5. 安全问题

你是完全正确的!

为什么我应该使用多个活动?

你能提供一个很好的例子,其中多个活动的使用更有意义而不是使用碎片?

有没有什么很好的例子,你没有别的选择,只能使用活动?

我认为大多数更大的框架(如Maps,YouTube和co)已经支持Fragments。 所以我们不必依赖活动。 在使用Fragments的情况下,处理NavigationBar,TabHosts,ViewPager,ActionBar也很容易。

总是使用Fragments并不适合将数据扩展到UI,尤其是在情况下

  • ConnectionTimeOut (或低互联网),因为它花了很多时间来初始化数据。 因此,有时使用每个活动来填充少量数据比每个片段更好。

  • 或者为了更灵活地使用onActivityResult方法,使用活动也比。 防爆。 您可以在您的应用程序中调用FileDialogChooser

那是一些情况,

谢谢,


首先,我会同意你可以使用一个活动和嵌套片段来编写一个巨大的应用程序。 这就是软件的乐趣 - 您可以使用各种方法实现相同的功能。 对我而言,使用多种活动的选择取决于我个人对封装,可重用性和可测试性的偏好。

如果我有一个可以在其他应用程序中重用的小部件,我将它作为一个片段。 例如,我的应用程序具有“与服务器同步”按钮,并且我创建了一个使用进度条直观显示同步过程的自定义片段。 很容易想象另一个应用程序能够使用这个小部件,所以这就是为什么我将它作为片段开发的原因。

如果我在我的应用程序内切换任务,以使新任务在概念上独立于以前的任务,那么我使用新的任务。 例如,我的应用程序的第一页会要求您选择一个用户。 点击用户后,我会将您发送到该用户的主菜单。 该用户的主菜单显示在新的活动中。

现在让我们来想象一个庞大而复杂的应用程序,以及分配给开发该应用程序的一组开发人员。 如果应用程序可以分为不同的活动,则从任务上划分概念上非常简单。 每个活动都是自己的沙箱,因此并行开发很简单,可以进行单元测试。 如果有任何共同需求,当然,团队仍然应该开发碎片并重新使用它们。 我应该补充说,在软件开发中代码重用不会经常发生,但如果做得好,应该有很多可重用的碎片。

现在假设是测试应用程序的时候了。 您的测试团队可以将每个活动视为自己的黑匣子。 这比单个巨大的应用程序更容易测试,该应用程序依赖于单个活动和大量嵌套的片段。 如果存在错误,这一点尤其重要。 如果存在一个不明显的错误,至少我知道错误的范围仅限于多个单独的活动。

总之,我的猜测是,您正在开发您的应用程序作为个人,因此您的开发决策不会影响任何其他人。 如果您正在开发一个拥有较大团队的应用程序,您的观点可能会发生变化,我希望我的回答在这方面具有很大意义。


对于你的问题,我只能说有时候,用复杂的用户体验或复杂的应用程序必须使用不同的硬件组件,你需要使用活动而不是片段。

例如,如果您必须创建具有某种形式的应用程序,该应用程序具有拍摄照片的步骤,然后将此照片用于某些使用内存的工作难记忆任务(例如面部检测),则需要将此任务与主要任务活动并将清单上的权限个性化为仅在此活动中使用更多内存。

另一个例子是,如果你想使用弱内存活动(在清单中,你可以设置属性来清除活动堆栈,并在活动结束时强制垃圾收集器清理内存)

需要使用更多活动和片段的最可能情况是该应用的用户体验。 如果您需要包含菜单的右侧抽屉自定义,并且菜单的每个片段都包含listView,并且每个列表视图都必须详细说明。 你可以做很多窍门来隐藏右侧抽屉并创建动画以从片段滑动到细节,但最好和最简单的方法是为细节创建新的活动并使用与主体分离的逻辑/生命周期进行管理与抽屉的活动。 我已经在我的两个应用中做了这个选择:

iMeal - https://play.google.com/store/apps/details?id=it.fullsix.chiccopappe

GGRugby - https://play.google.com/store/apps/details?id=it.f6.template

在这个应用程序中,抽屉位于主片段活动中,每个菜单都会更改内容片段。 内容片段中的列表视图用意图更改活动上下文并进入另一活动。

最后有一些情况,我认为你应该使用更多的只有fragmentActivity ......但这是我的工作模式,可能你可以找到一个技巧/方法或范围来做一些只有一个Activity和片段的东西。


你是对的。 人们可以单独使用片段。 但是,根据活动类别 ,活动是用户可以执行的单一且重点突出的活动。 我总是倾向于将我的应用程序划分为顶级活动,并进一步划分为片段。

例如,这里是多种活动有意义的情况。 我们的应用程序具有一定的功能,如果用户登录,它可以被扩展。但是,用户在登录之前可能仍会使用这种有限的功能。例如,除了您登录时,您不能评论项目。在这种情况下,我们MainActivity可能会显示整个功能。 如果用户想要发表评论,我们要求他通过保存他的请求并启动一个处理登录/注册的活动LoginActivity来登录,并在他完成时设置正确的结果。 在我们的调用Fragment或Activity中,我们检查结果是否为LOGIN_SUCCESS或者用户当前是否登录并提供未决请求。 我想说的是,登录的操作流程应该是一个单独的活动。 否则,处理可能会搞砸。 这样,任何需要登录的操作都可以调用startActivityForResult(LOGIN)并将其自身保存为pendingAction。 然后在设置结果之后,我们可以在super.onActivityResult中实现处理。 这当然都是理论,可以毫不费力地在一个片段中实现Login。 但是,代码肯定会变成FUed。

您需要一个活动的另一种情况是当您的活动提供导出的服务时。 例如,假设您是“文件上传器”的开发人员,并且您收到上传文件的意图。 在这种情况下创建一个可以使用上传文件请求的活动非常方便。

然而,就目前的更新而言,Fragments的功能涵盖了android应用程序的大部分功能,因此可以单独使用一个主机活动来满足应用程序的要求。

然而,你的整个“单一活动主持人”数据在这方面的防守相当薄弱。 活动和紧密片段具有整个生命周期,包括通过捆绑包的保存/恢复实例。 单个宿主活动可以持续很长时间,并且宿主多个片段,这些片段可以在其活动的一生中循环多次。 因此,随着时间的推移,持续所有这些事件的活动极有可能超过其资源预算。 当数据真正在多个对象之间共享时,开发人员有责任将数据保存在共享的上下文中。 这是这种方法的一个缺点。 在我们的例子中,MainActivity消耗额外的数据字节是没有意义的,因为它在它可能睡眠并且需要时释放它的内存时托管了这些登录片段。

最后,一个好的程序员可以设法同样完成同样的任务。





android-fragments