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

Activity, AppCompatActivity, FragmentActivity, and ActionBarActivity: When to Use Which?

我来自 iOS,那里很简单,您只需使用 UIViewController。然而,在 Android 中,事情似乎复杂得多,某些 UIComponents 用于特定的 API 级别。我正在为 Android 阅读 BigNerdRanch(这本书大约有 2 年历史),他们建议我使用 Activity 来托管我的 FragmentActivities。但是,我认为 Activity 已被弃用。

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

这里有很多混乱,尤其是当你阅读过时的资料时。

基本的是Activity,可以显示Fragments。如果您使用的是 Android 版本 > 4.

,则可以使用此组合

但是,还有一个支持库包含您提到的其他 类:FragmentActivityActionBarActivityAppCompat。最初它们用于支持 Android 版本 < 4 上的片段,但实际上它们也用于向后移植 Android 较新版本的功能(例如 material 设计)。

最新的是AppCompat,另外2个是旧的。我使用的策略是始终使用 AppCompat,以便应用程序在从 Android.

的未来版本向后移植的情况下准备就绪

对于最低 API 级别 15,您需要使用 AppCompatActivity。因此,例如,您的 MainActivity 将如下所示:

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

要使用 AppCompatActivity,请确保您已下载 Google 支持库(您可以在工具 -> Android -> SDK 管理器中查看)。然后只需在应用的 gradle.build 文件中包含 gradle 依赖项:

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

您可以将此 AppCompat 用作您的主要 Activity,然后可将其用于启动 Fragment 或其他 Activity(这取决于您构建的应用类型)。

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

Activityclass是基本的class。 (原文) 支持Fragment管理(Since API11)。不再推荐它的纯粹用途,因为它的专业化要好得多。

ActionBarActivity 很快 替代了 Activity class,因为它可以轻松处理应用程序中的 ActionBar。

AppCompatActivitythe 的新方法,因为不再鼓励使用 ActionBar,您应该改用 Toolbar(目前 the ActionBar 替换)。 AppCompatActivity 继承自 FragmentActivity,因此如果您需要处理片段,您可以(通过片段管理器)。 AppCompatActivity 适用于任何 API,而不仅仅是 16+(谁说的?)。您可以通过在 Gradle 文件中添加 compile 'com.android.support:appcompat-v7:24:2.0' 来使用它。我在 API 10 中使用它并且效果很好。

I thought Activity was deprecated

没有

So for API Level 22 (with a minimum support for API Level 15 or 16), what exactly should I use both to host the components, and for the components themselves? Are there uses for all of these, or should I be using one or two almost exclusively?

Activity 是基线。每个 activity 直接或间接继承自 Activity

FragmentActivity 用于 support-v4support-v13 库中片段的反向移植。 API 级别 11 中添加了片段的本机实现,低于您建议的 minSdkVersion 值。您需要特别考虑 FragmentActivity 的唯一原因是,如果您想使用嵌套片段(一个片段包含另一个片段),因为在 API 级别 17 之前,本机片段不支持它。

AppCompatActivity 来自 appcompat-v7 库。主要是,这提供了操作栏的反向移植。由于本机操作栏是在 API 级别 11 中添加的,因此您不需要 AppCompatActivity。但是,appcompat-v7 的当前版本还在操作栏和各种小部件方面添加了 Material 设计美学的有限向后移植。使用 appcompat-v7 有利有弊,远远超出了这个特定 Stack Overflow 答案的范围。

ActionBarActivityappcompat-v7 基础 activity 的旧名称。由于种种原因,他们想改名。除非您使用的某些第三方库坚持使用 ActionBarActivity,否则您应该更喜欢 AppCompatActivity 而不是 ActionBarActivity

因此,鉴于您的 minSdkVersion 在 15-16 范围内:

  • 如果您想要向后移植的 Material 设计外观,请使用 AppCompatActivity

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

  • 如果没有,使用Activity

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

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

Activity <- FragmentActivity <- AppCompatActivity <- ActionBarActivity

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

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

  • Activity是基本的
  • 基于ActivityFragmentActivity提供了使用Fragment的能力。
  • 基于FragmentActivityAppCompatActivity 提供ActionBar 的功能。

由于名称在 Android 的未来版本中可能会更改(目前最新版本是 AppCompatActivity 但它可能会在某些时候更改),我相信拥有一个好东西是class Activity 扩展 AppCompatActivity 然后你的所有活动都从那个扩展。如果明天,他们将名称更改为 AppCompatActivity2,例如,您将不得不在一个地方进行更改。

2019:使用AppCompatActivity

在撰写本文时(检查 link 以确认它仍然是正确的),Android Documentation 建议如果您使用的是应用栏,则使用 AppCompatActivity

这是给定的有理数:

Beginning with Android 3.0 (API level 11), all activities that use the default theme have an ActionBar as an app bar. However, app bar features have gradually been added to the native ActionBar over various Android releases. As a result, the native ActionBar behaves differently depending on what version of the Android system a device may be using. By contrast, the most recent features are added to the support library's version of Toolbar, and they are available on any device that can use the support library.

For this reason, you should use the support library's Toolbar class to implement your activities' app bars. Using the support library's toolbar helps ensure that your app will have consistent behavior across the widest range of devices. For example, the Toolbar widget provides a material design experience on devices running Android 2.1 (API level 7) or later, but the native action bar doesn't support material design unless the device is running Android 5.0 (API level 21) or later.

添加工具栏的一般说明是

  1. 添加 v7 appcompat 支持库
  2. 让你的所有活动都延伸 AppCompatActivity
  3. 在清单中声明您想要 NoActionBar
  4. 为每个 activity 的 xml 布局添加一个 ToolBar
  5. 在每个 activity 的 onCreate 中获取 ToolBar

有关详细信息,请参阅 documentation directions。他们非常清楚和有帮助。