Activity, AppCompatActivity, FragmentActivity和ActionBarActivity:何时使用哪个?

我来自iOS,它很简单,你只需要使用UIViewController。然而,在Android中,事情似乎要复杂得多,特定的API级别有特定的uiccomponent。我正在阅读BigNerdRanch for Android(这本书大约有2年了),他们建议我使用Activity来托管我的FragmentActivities。然而,我认为Activity已弃用。

那么对于API级别22(至少支持API级别15或16),我究竟应该使用什么来托管组件,以及组件本身呢?所有这些都有用处吗,还是我应该只使用其中一两个?

226986 次浏览

这里有很多困惑,特别是如果你阅读了过时的资料。

最基本的是Activity,它可以显示片段。如果你在Android版本> 4上,你可以使用这个组合。

然而,还有一个支持库,它包含了你提到的其他类:FragmentActivityActionBarActivityAppCompat。最初他们是用来支持Android版本的片段<4,但实际上它们也被用于移植新版本Android的功能(例如材质设计)。

最新的一个是AppCompat,其他两个是旧的。我使用的策略是总是使用AppCompat,这样应用程序将准备好从未来的Android版本的后移植。

对于最低API级别15,你会想要使用AppCompatActivity。例如,你的MainActivity看起来是这样的:

public class MainActivity extends AppCompatActivity {
....
....
}

要使用AppCompatActivity,确保你下载了谷歌支持库(你可以在你的Tools -> Android -> SDK管理器中检查这一点)。然后在你的应用的gradle中包含gradle依赖。构建文件:

compile 'com.android.support:appcompat-v7:22:2.0'

你可以使用这个AppCompat作为你的主Activity,然后它可以用来启动片段或其他活动(这取决于你正在构建的应用程序类型)。

《BigNerdRanch》这本书是一个很好的资源,但是是的,它已经过时了。阅读它可以获得关于Android如何工作的一般信息,但不要期望他们使用的特定类是最新的。

Activity类是基本类。它支持片段管理(API 11以来)。不再推荐使用它,因为它的专门化要好得多。

ActionBarActivity很快被替换为活动类的,因为它使得在应用程序中处理动作栏变得很容易。

AppCompatActivity的新方法,因为动作栏不再被鼓励,你应该使用工具栏代替(目前是的动作栏替代品)。AppCompatActivity继承自FragmentActivity,所以如果你需要处理片段,你可以(通过片段管理器)。AppCompatActivity适用于任何API,而不仅仅是16+(谁说的?)你可以通过在Gradle文件中添加compile 'com.android.support:appcompat-v7:24:2.0'来使用它。我在API 10中使用它,它工作得很完美。

我以为Activity被弃用了

不。

那么对于API级别22(至少支持API级别15或16),我究竟应该使用什么来托管组件,以及组件本身呢?所有这些都有用处吗,还是我应该只使用其中一两个?

Activity是基线。每个活动直接或间接地继承自Activity

FragmentActivity用于在support-v4support-v13库中找到的片段的后端口。片段的本机实现是在API级别11中添加的,这比您建议的minSdkVersion值要低。你需要特别考虑FragmentActivity的唯一原因是如果你想使用嵌套的片段(一个片段持有另一个片段),因为这在原生片段中是不支持的,直到API级别17。

AppCompatActivity来自appcompat-v7库。主要来说,这提供了一个操作栏的后端口。由于本机操作栏是在API Level 11中添加的,因此不需要AppCompatActivity。然而,当前版本的appcompat-v7也在操作栏和各种小部件方面增加了材料设计美学的有限后端口。使用appcompat-v7有优点和缺点,这远远超出了这个特定的Stack Overflow答案的范围。

ActionBarActivity是来自appcompat-v7的基本活动的旧名称。由于种种原因,他们想要改名。除非你使用的第三方库坚持使用ActionBarActivity,否则你应该更喜欢AppCompatActivity而不是ActionBarActivity

因此,给定你的minSdkVersion在15-16范围内:

  • 如果你想要反向移植的材质设计外观,使用AppCompatActivity

  • 如果不是,但你想要嵌套的片段,使用FragmentActivity

  • 如果不是,使用Activity

只是从注释中添加注释:AppCompatActivity扩展了FragmentActivity,因此任何需要使用FragmentActivity特性的人都可以使用AppCompatActivity

Activity是所有其他活动的基类,我不认为它会被弃用。它们之间的关系是:

Activity <- FragmentActivity <- AppCompatActivity <- ActionBarActivity

'<-'在这里表示继承。参考表示ActionBarActivity已弃用,请改用AppCompatActivity

所以基本上,使用AppCompatActivity始终是正确的选择。它们之间的区别是:

  • Activity是最基本的。
  • 基于ActivityFragmentActivity提供了使用Fragment的能力。
  • 基于FragmentActivityAppCompatActivityActionBar提供了一些特性。

由于名称可能会在未来的Android版本中发生变化(目前最新的是AppCompatActivity,但它可能会在某个时候发生变化),我认为最好有一个扩展AppCompatActivity的类Activity,然后所有的活动都从这个类扩展。如果明天,他们把名字改为AppCompatActivity2,例如,你将不得不在一个地方改变它。

2019:使用AppCompatActivity

在撰写本文时(检查链接以确认它仍然正确),如果您正在使用应用程序栏,安卓系统文档建议使用AppCompatActivity

这是给定的理性:

从Android 3.0 (API级别11)开始,所有使用 默认主题有一个动作栏作为应用程序栏。然而,应用程序栏 功能已逐渐添加到本机动作栏over 各种Android版本。因此,本机ActionBar会正常工作 根据Android系统版本的不同而有所不同 可能正在使用。的特性中添加了最新的特性 支持库版本的工具栏,它们可以在任何 可以使用支持库的设备 出于这个原因,您应该使用支持库的工具栏类来 实现活动的应用程序栏。使用支持库 工具栏有助于确保您的应用程序将有一致的行为 跨越最广泛的设备。例如,Toolbar小部件 为运行Android 2.1的设备提供材料设计体验 (API级别7)或更高版本,但本机操作栏不支持 除非设备运行Android 5.0 (API级别)

.

.

添加工具栏的一般方向是

  1. 添加v7版appcompat支持库
  2. 使你所有的活动扩展AppCompatActivity
  3. 在清单中声明你想要NoActionBar
  4. 在每个活动的xml布局中添加ToolBar
  5. 在每个活动的onCreate中获取ToolBar

更多细节请参见文档的方向。它们很清楚,很有帮助。