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

我来自iOS,它很容易,你只需使用UIViewController。 然而,在Android中,事情似乎要复杂得多,某些UIComponents对于特定的API级别。 我正在阅读Android的BigNerdRanch(这本书大约2岁),他们build议我使用Activity来托pipe我的FragmentActivities 。 不过,我认为Activity已经被弃用了。

因此,对于API级别22(对API级别15或16的最小支持),我究竟应该使用哪一个来托pipe这些组件以及组件本身? 有没有使用所有这些,或者我应该使用一两个几乎完全?

我认为活动已被弃用

没有。

因此,对于API级别22(对API级别15或16的最小支持),我究竟应该使用哪一个来托pipe这些组件以及组件本身? 有没有使用所有这些,或者我应该使用一两个几乎完全?

Activity是基准。 每个活动都直接或间接地从Activityinheritance。

FragmentActivity用于在support-v4support-v13库中find的片段的backport。 API级别11中添加了片段的本机实现,该级别低于您提出的minSdkVersion值。 你需要特别考虑FragmentActivity的唯一原因是,如果你想使用嵌套片段(一个片段持有另一个片段),因为直到API 17级,在本地片段中不支持。

AppCompatActivity来自appcompat-v7库。 原则上,这提供了一个行动栏的回溯。 由于本机操作栏已添加到API级别11中,因此您不需要AppCompatActivity 。 然而,当前版本的appcompat-v7在操作栏和各种小部件方面也增加了Material Design审美的有限回溯。 有使用appcompat-v7优点和缺点,远远超出了这个特定的堆栈溢出的答案的范围。

ActionBarActivity是来自appcompat-v7的基本活动的旧名称。 由于各种原因,他们想改变名字。 除非你使用的第三方库坚持使用ActionBarActivity ,否则你应该更喜欢AppCompatActivity不是ActionBarActivity

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

  • 如果你想要后端的Material Design外观,请使用AppCompatActivity

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

  • 如果没有,使用Activity

只需从注释中添加注意事项:AppCompatActivity扩展FragementActivity,所以任何人都需要使用FragmentActivity的function,然后可以使用AppCompatActivity。

对于最低的API级别15,您需要使用AppCompatActivity 。 例如,你的MainActivity看起来像这样:

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

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

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

您可以使用这个AppCompat作为您的主要Activity ,然后可以用它来启动碎片或其他活动(这取决于您正在构build什么样的应用程序)。

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

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

Activity < – FragmentActivity < – AppCompatActivity < – ActionBarActivity

“< – ”表示inheritance。 该引用表示ActionBarActivity不推荐使用,而是使用AppCompatActivity

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

  • Activity是基本的。
  • 基于ActivityFragmentActivity提供了使用Fragment的能力。
  • 基于FragmentActivityAppCompatActivityActionBar提供了一些function。

2017:使用AppCompatActivity

在撰写本文时(检查链接以确认它仍然是true), Android文档build议使用AppCompatActivity如果您正在使用应用程序栏。

这是理性的给予:

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

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

添加工具栏的一般方向是

  1. 添加v7 appcompat支持库
  2. 让所有的活动扩展AppCompatActivity
  3. 在清单声明你想要NoActionBar
  4. 为每个活动的xml布局添加一个ToolBar
  5. 获取每个活动的onCreateToolBar

请参阅文档说明了解更多详情。 他们非常清楚和有帮助。

Activity课是基础课。 (原文)它支持片段pipe理(自API 11以来)。 不推荐它的纯粹用途,因为它的专业化要好得多。

ActionBarActivity是在Activity类替代,因为它很容易处理应用程序中的ActionBar。

AppCompatActivity是新的方法,因为不再鼓励ActionBar,而应该使用Toolbar(目前 ActionBar的替代品)。 AppCompatActivity从FragmentActivityinheritance,所以如果你需要处理碎片,你可以(通过碎片pipe理器)。 AppCompatActivity适用于任何API,不仅16+(谁说的?)。 你可以在你的Gradle文件中joincompile 'com.android.support:appcompat-v7:24:2.0'来使用它。 我在API 10中使用它,它工作完美。

这里有很多困惑,尤其是如果你读了过时的消息。

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

不过,还有一个支持库,其中包括您提到的其他类: FragmentActivityActionBarActivityAppCompat 。 最初他们被用来支持Android版本<4的片段,但实际上它们也用于从新版本的Android(例如,材料devise)向后移植function。

最近的一个是AppCompat ,另外两个比较老。 我使用的策略是始终使用AppCompat ,以便应用程序将来自未来版本的Android的backports。

由于这个名字很可能会在未来的Android版本中改变(目前最新的版本是AppCompatActivity但它可能会在某些时候改变),我相信一个好的事情是一个类Activity ,它扩展了AppCompatActivity ,然后所有的活动从那里延伸一。 如果明天,他们更改名称为AppCompatActivity2 ,例如,你将不得不在一个地方改变它。