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


266

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

因此,对于API级别22(对API级别15或16的最低支持),我到底应该使用什么来托管组件以及组件本身?所有这些都有用途吗,还是我应该只使用一两个?


1
您将不会托管FragmentActivityies。您仅托管Fragment。在较新的Android版本上,Activity类本身已更新为直接托管它们。为了支持较旧的版本FragmentActivity而引入。
拉维·萨普利雅尔

5
同样,对于API 11+,Activityies支持ActionBar。从一开始就支持较早版本ActionBarActivity,现在已弃用并替换为AppCompatActivity。因为这两个类都扩展了FragmentActivity它们,所以它们也支持hosting Fragment
拉维·萨普利雅尔

Answers:


327

我以为活动已过时

没有。

因此,对于API级别22(对API级别15或16的最低支持),我到底应该使用什么来托管组件以及组件本身?所有这些都有用途吗,还是我应该只使用一两个?

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

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

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

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

因此,根据您minSdkVersion的15-16范围:

  • 如果要向后移植的材料设计外观,请使用 AppCompatActivity

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

  • 如果没有,请使用 Activity

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


如果我想使用Material Design外观并且还需要嵌套片段怎么办?AppCompatActivity是否从FragmentActivity继承?
Orcun Sevsay 2015年

4
@MiloRambaldi:是的,FragmentActivity是的祖先AppCompatActivity。尽管我不建议使用嵌套片段,但就嵌套片段完全起作用的程度而言,AppCompatActivity它将支持嵌套片段。
CommonsWare,2015年

感谢您提供@CommonsWare的详细答案。您能说说哪一个minSDK允许只使用Activity最新的版本而无需support-v7非移植材料设计。我的目标是
至少

1
@jugutier:要使用Theme.Material,您需要minSdkVersion21或更高。
CommonsWare

83

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

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

“ <-”在这里表示继承。说的参考ActionBarActivity已弃用,AppCompatActivity改为使用。

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

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

2
优雅的答案。
M.kazem Akhgary

69

2019:使用 AppCompatActivity

在撰写本文时(查看链接以确认它仍然为真),如果您正在使用应用栏,则Android文档建议使用AppCompatActivity

这是合理的:

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

因此,您应该使用支持库的工具栏类来实现活动的应用栏。使用支持库的工具栏有助于确保您的应用在各种设备上都具有一致的行为。例如,“工具栏”小部件在运行Android 2.1(API级别7)或更高版本的设备上提供了物料设计体验,但是本机操作栏不支持物料设计,除非设备运行的是Android 5.0(API级别21)或更高版本。

添加工具栏的一般说明是

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

有关更多详细信息,请参见文档说明。他们很清楚而且很有帮助。


@Suragch,您好,谢谢。假设我今天制作的应用程序仅支持21以上版本。确实,碰巧的是,我永远不需要动作栏或应用栏(更多的是全屏应用)。Studio建议(11月16日)使用“向后兼容性(AppCompat)”。我的直觉是不要使用AppCompat。您的专家意见是什么?我只能谢谢你,谢谢。
Fattie

我不是专家,所以无法给您专家意见,但是文档建议尽可能多地支持设备,这就是我的工作。我将AppCompat与所有我的应用程序一起使用,到目前为止效果很好。我想如果您真的不想支持21之前的版本,那么您可以忽略Studio的建议。
Suragch

50

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

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

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

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

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

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


好的,我的gradle.build文件中确实存在该依赖项。因此,例如,如果我要创建一个包含一堆行的表(像任何Notes应用程序一样),我的主屏幕将是一个AppCompat,而托管的其他任何东西也将是一个AppCompat?我基本上只需要使用AppCompat吗?
Jameson

因此,您的AppCompat将填充一些用于指定设计的布局资源(带有一排行的表)。但是,假设您要在单击一行时打开一个新页面。您可以设置onClickListener来打开新的AppCompat活动或片段。
adao7000

随着8月3日的,BigNerdRanch有其书的新版本:amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/...
bryant1410

1
@ adao7000伴侣提到了15或更高版本,您可以使用AppCompatActivity-我认为android.support.v7.app中的v7要求的最低sdk是
7。–基于代码的

1
@codebased android.support.v7可以在API级别9开始使用。来源:developer.android.com/topic/libraries/support-library/…–
adao7000

30

Activity班级是基础班。(原始)它支持片段管理(自API 11开始)。不再推荐使用它,因为它的专业性更好。

ActionBarActivity在片刻更换,以Activity类,因为它使易于处理的动作条中的应用程序。

AppCompatActivity去,因为在ActionBar不再被鼓励新的方式,你应该使用工具栏,而不是(这是目前动作条更换)。AppCompatActivity继承自FragmentActivity,因此,如果需要处理片段,则可以(通过片段管理器)进行处理。AppCompatActivity适用于ANY API,不仅16岁以上(谁这么说?)。您可以通过添加compile 'com.android.support:appcompat-v7:24:2.0'Gradle文件来使用它。我在API 10中使用了它,效果很好。


1
“现在不推荐使用ActionBar”-不推荐使用操作栏。“您需要使用工具栏” –应用程序不需要使用Toolbar
CommonsWare 2015年

@CommonsWare好吧,它不被弃用,但不再鼓励以更纯净的形式(旧的形式)使用它。现在,如果您想在应用程序中添加一个操作栏,则应该使用工具栏手动添加它。
Joaquin Iurchuk

“不再鼓励以更纯净的形式使用它” –我在文档或官方博客文章中没有发现任何可以证明您的主张合理的东西。你有链接吗?
CommonsWare 2015年

@CommonsWare您是这里的佼佼者,您是对的。仅材料设计准则建议将工具栏用作操作栏。也许我应该删除答案,因为它不准确。谢谢
Joaquin Iurchuk 2015年

2
从支持库版本26.0.0(于2017年7月发布)开始,所有支持库程序包的最低受支持API级别已更改为Android 4.0(API级别14)。来源:developer.android.com/topic/libraries/support-library/...
安德烈Leganza

12

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

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

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

最新的是AppCompat,其他2个较旧。我使用的策略是始终使用AppCompat,以便在将来的Android版本向后移植的情况下可以使用该应用程序。


谢谢!好的,因此我可以使用AppCompat代替Activity来托管...什么?为了托管其他AppCompats?还是为了托管FragmentActivities?
Jameson

一个活动通常只托管其他片段...不用担心FragmentActivity,它更多是一个“基本”类,所有其他花哨的XXXActivity都源自该类。
Mehdi

但是我的AppCompat应该托管哪个类?另一个AppCompat,还是其他?
Jameson

您在这里只需要了解一件事:活动托管片段。顺便说一下,活动不能由其他任何东西托管,它们不能嵌套。Appcompat只是另一种活动。之后,您可以继续并嵌套片段,但是管理起来变得很复杂。
flower_green

1
不,您将appcompat用作活动,并且托管片段而不是fragmentactivities。
flower_green

7

如果您谈谈ActivityAppcompactActivityActionBarActivity等等等等。

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

所有事物都是从上下文开始的,它是所有这些类的超类。

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或类似主题

这里

我把这两个


3

由于名称可能会在Android的未来版本中更改(当前是最新名称,AppCompatActivity但可能会在某个时候更改),所以我认为拥有一个很好的东西是Activity扩展了一个类,AppCompatActivity然后所有活动都从该类扩展。如果明天,他们将名称更改AppCompatActivity2为例如您将只能在一个地方更改它。


0

AppCompatActivity扩展FragmentActivity扩展BaseFragmentActivityApi16扩展BaseFragmentActivityApi14扩展SupportActivity扩展Activity

因此,Activity比所有功能都快,而AppCompatActivity是最好的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.