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

Jam*_*son 246 android android-fragments android-activity android-actionbaractivity appcompatactivity

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

因此,对于API级别22(对API级别15或16的最低支持),我应该使用什么来托管组件以及组件本身?是否有所有这些用途,或者我应该几乎完全使用一两个?

Com*_*are 309

我认为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,你应该更喜欢AppCompatActivityActionBarActivity.

所以,鉴于你minSdkVersion在15-16范围内:

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

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

  • 如果没有,请使用 Activity

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

  • @MiloRambaldi:是的,`FragmentActivity`是`AppCompatActivity`的祖先.虽然我不建议使用嵌套片段,但就嵌套片段的工作原理而言,"AppCompatActivity"将支持嵌套片段. (4认同)

Ted*_* Yu 71

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

Activity< - FragmentActivity< - AppCompatActivity< -ActionBarActivity

'< - '表示继承.该基准ActionBarActivity已过时,使用AppCompatActivity来代替.

所以基本上,使用AppCompatActivity总是正确的选择.他们之间的差异:

  • Activity 是基本的.
  • 基于Activity,FragmentActivity提供使用的能力Fragment.
  • 基于FragmentActivity,AppCompatActivity提供功能ActionBar.

  • 优雅的回答。 (4认同)

Sur*_*gch 64

2018年:使用 AppCompatActivity

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

这是理性的:

从Android 3.0(API级别11)开始,使用默认主题的所有活动都将ActionBar作为应用栏.但是,app bar功能已逐渐添加到本机ActionBar中,而不是各种Android版本.因此,本机ActionBar的行为会有所不同,具体取决于设备可能使用的Android系统版本.相比之下,最新功能已添加到支持库的Toolbar版本中,并且可以在任何可以使用支持库的设备上使用.

因此,您应该使用支持库的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.

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


ada*_*000 49

对于最低API级别15,您需要使用AppCompatActivity.例如,您的MainActivity样子如下:

public class MainActivity extends AppCompatActivity {
    ....
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

compile 'com.android.support:appcompat-v7:22:2.0'
Run Code Online (Sandbox Code Playgroud)

您可以将其AppCompat用作主要内容Activity,然后可以使用它来启动片段或其他活动(这取决于您正在构建的应用程序类型).

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


Joa*_*huk 29

Activityclass是基本类.(原文)它支持Fragment管理(自API 11起).不推荐它的纯粹用途,因为它的专业化要好得多.

ActionBarActivity很快就成了Activity类替代品,因为它很容易在应用程序中处理ActionBar.

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

  • _从支持库版本 26.0.0(2017 年 7 月发布)开始,所有支持库包的最低支持 API 级别已更改为 Android 4.0(API 级别 14)。_来源:https://developer.android.com/topic /libraries/support-library/index.html (2认同)

flo*_*een 12

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

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

然而,也有它包括你提到的其他类一个支持库:FragmentActivity,ActionBarActivityAppCompat.最初它们用于支持Android版本<4的片段,但实际上它们也用于从较新版本的Android(例如材料设计)中移植功能.

最新的一个AppCompat,其他2个更老.我使用的策略是始终使用AppCompat,以便在未来Android版本的后端运行时应用程序就绪.


Far*_*ana 6

如果您谈谈ActivityAppcompactActivityActionBarActivity等等等等。

我们需要谈论它们正在扩展的基类,首先,我们必须了解超类的层次结构。

所有事情都是从Context开始的,它是所有这些类的超类。

Context是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及对应用程序级操作(如启动活动,广播和接收意图等)的调用

Context 后跟或扩展 ContextWrapper

ContextWrapper是扩展类的上下文类,仅代表其所有调用另一个上下文。可以子类化以修改行为,而无需更改原始上下文。

现在我们到达 Activity

活动是一个延伸的类ContextThemeWrapper这是一个单一的,集中的一点是,用户可以做。几乎所有活动都与用户互动,因此Activity类负责为您创建一个窗口

以下类被限制为扩展,但它们由其内部的下级扩展,并为特定的Api提供支持

所述SupportActivity是一类,其延伸的活动,是用于构成一起兼容性功能的基类

所述BaseFragmentActivityApi14是一类,其延伸SupportActivity 即一个基类它被限制类,但它是由延伸 BaseFragmentActivityApi16支持的功能V14

所述 BaseFragmentActivityApi16是其延伸的一类 BaseFragmentActivityApi14即对于{@code基类 FragmentActivity },以便能够使用V16的API。但是它也是受限制的类,但是它被FragmentActivity扩展以支持V16的功能。

现在为FragmentActivty

FragmentActivity是延伸的一类 BaseFragmentActivityApi16并希望使用基于支持片段和装载机的API。

当使用此类而不是新平台的内置片段和加载程序支持时,必须分别使用getSupportFragmentManager()getSupportLoaderManager()方法来访问这些功能。

ActionBarActivity是支持库的一部分。支持库用于在旧平台上提供新功能。例如,ActionBar是在API 11中引入的,默认情况下是Activity的一部分(实际取决于主题)。相反,旧平台上没有ActionBar。因此,支持库添加了Activity(ActionBarActivity)的子类,该子类提供ActionBar的功能和用户界面

2015年,支持库的版本22.1.0中弃用了ActionBarActivity。应该改用AppCompatActivity

AppcompactActivity是延伸的一类 FragmentActivity是对于使用支持库操作栏功能活动的基类。

您可以在API级别7或更高级别上运行时将ActionBar添加到活动中,方法是扩展活动的此类并将活动主题设置为Theme.AppCompat或类似主题

这里

我指的是这两个