Activity、AppCompatActivity、FragmentActivity 和 ActionBarActivity:啥时候使用?

Posted

技术标签:

【中文标题】Activity、AppCompatActivity、FragmentActivity 和 ActionBarActivity:啥时候使用?【英文标题】:Activity, AppCompatActivity, FragmentActivity, and ActionBarActivity: When to Use Which?Activity、AppCompatActivity、FragmentActivity 和 ActionBarActivity:什么时候使用? 【发布时间】:2015-09-26 15:12:42 【问题描述】:

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

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

【问题讨论】:

您不会托管FragmentActivityies。你只主持Fragments。在较新的 Android 版本上,Activity 类本身已更新为直接托管它们。为了支持旧版本,引入了FragmentActivity 类似地,API 11+ Activityies 支持 ActionBar。旧版本通过 ActionBarActivity 首先支持此功能,现在已弃用并替换为 AppCompatActivity。因为,这两个类都扩展了FragmentActivity,它们也支持托管Fragments。 【参考方案1】:

我认为 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

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

【讨论】:

如果我想使用 Material Design 外观并且还想要嵌套片段怎么办? AppCompatActivity 是否继承自 FragmentActivity? @MiloRambaldi:是的,FragmentActivityAppCompatActivity 的祖先。虽然我不建议使用嵌套片段,但在嵌套片段完全可以工作的范围内,AppCompatActivity 将支持嵌套片段。 感谢@CommonsWare 的详细回答。你能说一下哪个 minSDK 允许只使用 Activity 在没有 support-v7 的情况下获得大部分最新信息,即非向后移植的材料设计。我的目标是 19 分钟目标 25 @jugutier:要使用Theme.Material,您需要minSdkVersion 21 或更高。【参考方案2】:

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

Activity FragmentActivity AppCompatActivity ActionBarActivity

'reference 表示 ActionBarActivity 已弃用,请改用 AppCompatActivity

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

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

【讨论】:

实际上 FragmentActivity 扩展了 ComponentActivity 进而扩展了 Activity【参考方案3】:

2019:使用AppCompatActivity

在撰写本文时(检查链接以确认它仍然是真实的),Android Documentation 建议使用 AppCompatActivity 如果您使用的是应用栏。

这是给定的理性:

从 Android 3.0(API 级别 11)开始,所有使用 默认主题有一个 ActionBar 作为应用栏。但是,应用栏 功能已经逐渐被添加到原生的 ActionBar 之上 各种安卓版本。结果,本机 ActionBar 的行为 根据设备的 Android 系统版本而有所不同 可能正在使用。相比之下,最新的功能被添加到 支持库的工具栏版本,它们可在任何 可以使用支持库的设备。

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

添加工具栏的一般方向是

    添加 v7 appcompat 支持库 让你的所有活动都延伸AppCompatActivity 在 Manifest 中声明你想要NoActionBar。 在每个活动的 xml 布局中添加 ToolBar。 在每个活动的onCreate 中获取ToolBar

有关详细信息,请参阅documentation directions。它们非常清晰且乐于助人。

【讨论】:

嗨@Suragch,谢谢。假设我今天正在制作一个仅支持 21 的应用程序。事实上,碰巧我不想要操作栏或应用栏(更多的是全屏应用)。 Studio 建议(11 月 16 日)我可能会使用 "Backwards compatability (AppCompat)"。我的直觉是不要使用 AppCompat。你的专家意见是什么?我只能谢谢你,谢谢。 我不是专家,所以我不能给你专家意见,但文档建议支持尽可能多的设备,这就是我所做的。我将 AppCompat 与我的所有应用程序一起使用,到目前为止它运行良好。我想如果你真的不想支持 pre 21 那么你可以忽略 Studio 的建议。【参考方案4】:

对于 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 用作您的主要Activity,然后可以使用它来启动片段或其他活动(这取决于您正在构建的应用类型)。

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

【讨论】:

好的,我的 gradle.build 文件中确实有这个依赖项。因此,例如,如果我正在制作一个包含一堆行的表格(就像任何 Notes 应用程序一样),我的主屏幕将是 AppCompat,而其他任何主机也将是 AppCompat?我基本上只需要使用 AppCompat 吗? 因此您的 AppCompat 将膨胀一些指定设计的布局资源(带有一堆行的表格)。但是,假设您想在单击一行时打开一个新页面。您可以设置一个 onClickListener 来打开一个新的 AppCompat Activity 或一个 Fragment。 自 8 月 3 日起,BigNerdRanch 有了新版本:amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/… @adao7000 伙伴,它提到对于 15 或更高版本,您可以使用 AppCompatActivity - 我认为 android.support.v7.app 中的 v7 所需的最低 sdk 为 7。 @codebased android.support.v7 可以从 API 级别 9 开始使用。来源:developer.android.com/topic/libraries/support-library/…【参考方案5】:

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

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

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

【讨论】:

"ActionBar 现已弃用" -- 操作栏未弃用。 “你需要改用工具栏”——应用不需要使用Toolbar @CommonsWare 好的,它没有被弃用,但不再鼓励以更纯粹的形式(旧的形式)使用它。现在,如果你想在你的应用中拥有一个操作栏,你应该使用 Toolbar 手动添加它。 “不再鼓励以更纯粹的形式使用它”——我在文档或官方博客文章中没有看到任何可以证明您的主张的内容。有链接吗? @CommonsWare 你是这里的佼佼者,你是对的。只有材料设计指南建议使用工具栏作为操作栏。也许我应该删除我的答案,因为它不准确。谢谢 从支持库版本 26.0.0(2017 年 7 月发布)开始,所有支持库包的最低支持 API 级别已更改为 Android 4.0(API 级别 14)。 来源:developer.android.com/topic/libraries/support-library/…【参考方案6】:

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

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

但是,还有一个支持库,其中包含您提到的其他类:FragmentActivityActionBarActivityAppCompat。最初它们用于支持 Android 版本

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

【讨论】:

谢谢!好的,所以我可以使用 AppCompat 代替 Activity 来托管...什么?为了托管其他 AppCompats?还是为了托管 FragmentActivity? 一个活动通常只承载其他片段......而且不用担心 FragmentActivity,它更像是一个“基”类,所有其他花哨的 XXXActivity 都派生自它。 但是我的 AppCompat 应该托管哪个类?另一个 AppCompat,还是别的什么? 这里你只需要了解一件事:活动宿主片段。顺便说一句,活动不由其他任何东西托管,它们不能嵌套。 Appcompat 只是另一种活动。之后,您可以继续嵌套片段,但这开始变得难以管理。 不,您使用 appcompat 作为 Activity 并托管 Fragment,而不是 FragmentActivity。【参考方案7】:

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

【讨论】:

以上是关于Activity、AppCompatActivity、FragmentActivity 和 ActionBarActivity:啥时候使用?的主要内容,如果未能解决你的问题,请参考以下文章

Android Kotlin API 请求 | gson进程后访问列表

android中 activity1中启动了activity2, activity2中启动了activity3,怎么把activity3中的值直接返回给

什么是Activity,详细介绍Activity

Android Activity生命周期解析

activity的启动流程(三)

Android之Activity系列总结--Activity概览