Android:有什么更好的-多个活动或手动切换视图?


115

我已经为Android开发了一些应用程序,但这个问题始终存在:

我应该如何构造我的UI?我应该在活动后启动活动,然后让手机留下“后退”按钮,还是应该选择更优化但实现起来更复杂的方式,即手动切换视图,然后手动执行“后退”按钮功能?

您认为(或知道)什么是更好的做法?


4
对于新读者,请注意,这个问题已经很久了,今天的问题更可能是“多个片段或多个活动”,而不是“多个视图或多个活动”。请参阅stackoverflow.com/a/10794086/199364中的 UPDATE 。此外,Google还提供了有关片段与活动的其他stackoverflow主题-很多不错的答案。
ToolmakerSteve

Answers:


99

我要说,多次活动几乎总是更有意义。我只是不认为Android是专为不断切换自己的视图而设计的-您会错过很多。您必须自己实现Back,没有任何活动间转换,必须实现很多内部逻辑以使应用程序恢复到正确的状态。如果您不将应用程序划分为“活动”,则以后更改应用程序流程将变得更加困难。它也导致一个大型活动比许多较小的代码更难处理。

我很难想象速度确实是个问题。如果是,则初始化每个活动的方式有问题。例如,我曾经尝试过在Activity之间传递Serializable对象,但事实证明这非常慢。当我切换到一种更快的传递对象的方法时,启动“活动”的速度大大提高了。

另外,我认为这是在告诉Android活动和任务设计指南根本没有提到切换视图。它以“活动即查看”设计为中心。


5
只需提一下,我最近看到了一些很棒的应用程序(例如Pulse),这些应用程序使用动画并在不同的View之间平滑地转移,这些都在一个Activity中进行。
丹尼尔(Danail)

3
我同意您的观点,但许多视觉效果仅在视图转换之间可用,而在活动之间不可用,这会导致在
人为

这是一个非常有趣的话题。至此,我有一个最终将实现4个视图的应用程序。我正在1个活动中完成所有操作,因此导致了此答案中所述的“超级活动”。我这样做主要是为了使我的应用外观和感觉完全像它的iOS版本。我同意这在很大程度上取决于您要完成的工作。伟大的问题,并回答+1 :-)
trumpetlicks

制作iOS UI是个坏主意。仅Hvis是不使用多个活动的错误原因。
老虎机

3
@Daniel:当我切换到一种更快的传递对象的方法时,启动“活动”的速度大大提高了。您能否提供一些其他详细信息或相同的参考资料?
Bhargav Jhaveri 2015年

21

我想指出一些实例,对于一个具有多个全屏视图的Android应用程序,单个活动可能是更好的设计:

  • 如果应用程序屏幕紧密耦合并共享它们都在其中运行的公共对象。在这种情况下,传递对象可能需要使用捆绑软件,并且容易出错,因为会有对象的副本。一个很好的例子可能是向导。是的,您可以使用static来访问公共对象,但是static在Android中可能很危险(请考虑更改配置!)

  • 如果您想在屏幕之间添加一些非常酷的动画。也许您希望一只鸟在一个屏幕中起飞并降落在另一个屏幕中。当每个屏幕都是活动时,尝试这样做!

另一方面,如果您设计的一个屏幕可以由任意数量的其他应用程序显示,则该屏幕应该是其自己的活动。

2014年3月更新:

此时,问题现在应该包括片段的选择。我认为Views可能是3:Activity,Fragment,View中最不可能的选择。如果要实现利用后退按钮的屏幕,则它应该是Activties或Fragments,因为两者都本地处理后退按钮。片段将需要添加到FragmentManager的后堆栈中,以使后退按钮起作用。但是,管理片段,对话框和后退堆栈可能会有些烦人!

2018年9月更新:

Google的一些开发人员建议使用新的导航体系结构组件的单活动应用程序


谢谢您添加UPDATE来谈论片段。完全同意,今天的重要选择是何时使用Fragment vs Activity。
ToolmakerSteve

11

还请记住,使用多个应用程序实施Activities将为用户带来整个平台更一致的体验。部分体验将通过使用内置的Google应用来调整,因此,如果您的应用与手机上已安装的应用具有相似的行为,则用户可能会更轻松地使用您的应用。


4

与其他应用程序不同,例如,我将两者混合使用
。1.应用程序启动时有一个主菜单
2.单击搜索,带您搜索活动
3.然后有一个过滤器按钮,它仅会切换视图并显示您可以筛选选项
。4.筛选器视图的末尾有两个按钮,您单击“搜索”或“取消”,然后又返回到搜索视图(不进行切换活动)
。5.现在,如果用户回拨了电话按钮,他将返回主菜单,而不是搜索过滤器选项。我猜这是正确的行为。

以用户感觉自然的方式使用它。并且将所有内容都保留在一个活动中将使其变得复杂。


3

一切都取决于应用程序,您要如何实现更好的性能和更流畅的UI。恕我直言,我喜欢手动控制活动的第二种方法,即使您说的比较复杂。这是我在android tabs项目中使用的一种方法,您可能还想看看一个名为ActivityGroup的类(不确定软件包),它可以让您进行多个活动之间进行切换,这个类的好处是因为切换时不会卸载您的活动,但是不好的事情是加载主应用程序需要更长的时间。

只是我的观点。


1

我偶然发现,切换视图的问题也是由垃圾收集器引起的。似乎在您离开活动而不是视图时触发了GC。因此,例如,更改带有相当复杂的子视图的选项卡几乎不可避免地会导致堆栈溢出异常。


3
仅当您具有无限递归时,StackOverflowError才会在Java中发生,也许您正在考虑OutOfMemoryError?作为Java程序员,您真的不必担心何时或在何处触发垃圾收集器。
satur9nine 2012年

2
在Android中,当视图层次结构也太深时,就会发生stackoverflow。
Danail

0

除非有充分的理由选择,否则我在多次活动布局中遇到了很多问题,因此我强烈不建议这样做。

多项活动的弊端

使用多个活动,很难重构代码以从活动中返回数据。

如果您称为“子”活动,则主要活动可能会被杀死。但是,在像样的设备上进行调试时,您永远不会遇到这种情况,因此,您需要始终处理保存状态并正确恢复状态。真痛苦。想象一下在库(即另一个活动)上调用一个方法,并且必须确保当该方法返回时,您的应用必须能够使用VM中所有对象上的所有字段(即活动)完全重新创建其状态。 restoreIntance)。太疯狂了

反之亦然,当您打开子活动时,自第一次产生该子活动以来,VM可能已被杀死,例如,在显示子活动时最小化了应用程序。

它非常干净,只有一个地方可以存储相关的应用程序状态,就我而言,大多数情况下,如果VM被杀死,我想让用户回到主屏幕,然后让他们再次做自己的事情,因为我不这样做无需花费30-50个小时来编码0.1%的用户将体验的保存/恢复功能。

另类

片段或自己管理活动视图。手动管理视图需要根据需要为活动/片段编码一些视图切换替代方案。

不,这并不意味着一种通用活动(如已接受的答案所示),而不是一种大型应用程序。它只需要对代码库进行更多的设计就可以了,因为管理视图的工作量略多,尽管管理活动状态和其他怪异的工作要少得多。

可能相关:Reddit:官方:Google正式推荐单一活动应用架构

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.