309

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

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

4

7 回答 7

371

我认为 Activity 已被弃用

不。

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

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

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

AppCompatActivity来自appcompat-v7图书馆。原则上,这提供了操作栏的反向移植。由于本机操作栏是在 API 级别 11 中添加的,因此您不需要这样做AppCompatActivity。但是,就操作栏和各种小部件而言,当前版本appcompat-v7还添加了 Material Design 美学的有限反向移植。使用 的优点和缺点appcompat-v7远远超出了这个特定的 Stack Overflow 答案的范围。

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

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

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

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

  • 如果没有,请使用Activity

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

于 2015-07-08T15:45:38.927 回答
101

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

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

'<-' 在这里表示继承。所说的引用ActionBarActivity已弃用,请AppCompatActivity改用。

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

  • Activity是基本的。
  • 基于ActivityFragmentActivity提供了使用的能力Fragment
  • 基于FragmentActivityAppCompatActivity提供功能到ActionBar.
于 2015-07-08T15:46:16.870 回答
74

2019:使用AppCompatActivity

在撰写本文时(检查链接以确认它仍然正确),如果您使用的是 App Bar , Android 文档建议使用。AppCompatActivity

这是给定的理性:

从 Android 3.0(API 级别 11)开始,所有使用默认主题的活动都有一个 ActionBar 作为应用栏。然而,应用栏功能已逐渐添加到各种 Android 版本的原生 ActionBar 中。因此,本机 ActionBar 的行为会根据设备可能使用的 Android 系统版本而有所不同。相比之下,最新的功能被添加到支持库的工具栏版本中,并且可以在任何可以使用支持库的设备上使用。

出于这个原因,您应该使用支持库的 Toolbar 类来实现您的活动的应用栏。使用支持库的工具栏有助于确保您的应用在最广泛的设备上具有一致的行为。例如,工具栏小部件在运行 Android 2.1(API 级别 7)或更高版本的设备上提供材料设计体验,但原生操作栏不支持材料设计,除非设备运行 Android 5.0(API 级别 21)或更高版本。

添加工具栏的一般方向是

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

有关更多详细信息,请参阅文档说明。他们非常清楚和乐于助人。

于 2016-09-03T00:59:16.053 回答
50

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

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

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

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

您可以将其AppCompat用作您的 main Activity,然后可用于启动 Fragments 或其他活动(这取决于您正在构建的应用程序类型)。

BigNerdRanch 书是一个很好的资源,但是是的,它已经过时了。阅读它以获取有关 Android 工作原理的一般信息,但不要期望它们使用的特定类是最新的。

于 2015-07-08T15:38:58.430 回答
33

Activity类是基础类。(原文)支持Fragment管理(API 11起)。不再推荐它的纯粹使用,因为它的专业化要好得多。

ActionBarActivity很快就被替换为 Activity 类,因为它使在应用程序中处理 ActionBar 变得很容易。

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

于 2015-07-08T15:42:53.740 回答
13

这里有很多混乱,特别是如果您阅读过时的资源。

最基本的是Activity,它可以显示片段。如果您使用的是 Android 版本 > 4,则可以使用此组合。

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

最新的一个是AppCompat,另外两个是旧的。我使用的策略是始终使用AppCompat,这样应用程序就可以在未来版本的 Android 向后移植的情况下做好准备。

于 2015-07-08T15:38:47.120 回答
3

由于名称可能会在未来的 Android 版本中发生变化(目前是最新版本,但它可能会在某个时候发生变化),我相信拥有一个扩展AppCompatActivity的类是一件好事,然后您的所有活动都从该类扩展。如果明天,他们将名称更改为例如您将不得不在一个地方更改它。ActivityAppCompatActivityAppCompatActivity2

于 2016-01-05T13:23:24.727 回答