Activity, AppCompatActivity, FragmentActivity и ActionBarActivity: когда использовать какую?


266

Я пришел из iOS, где это легко, а вы просто используете UIViewController. Однако в Android все выглядит намного сложнее, с определенными компонентами UIC для определенных уровней API. Я читаю BigNerdRanch для Android (книге примерно 2 года), и они предлагают использовать ее Activityдля размещения FragmentActivities. Тем не менее, я думал, что Activityустарела.

Так что для API уровня 22 (с минимальной поддержкой API уровня 15 или 16), что именно я должен использовать как для размещения компонентов, так и для самих компонентов? Есть ли применение для всех этих, или я должен использовать один или два почти исключительно?


1
Вы не будете принимать гостей FragmentActivity. Вы только хозяин Fragmentс. В новых версиях Android сам Activityкласс был обновлен для непосредственного размещения их. Для поддержки старых версий FragmentActivityбыла введена.
Рави Таплиял,

5
Точно так же с API 11+ Activityбыла поддержка ActionBar. Это было поддержано на более старых версиях до ActionBarActivityпервой, которая теперь устарела и заменена на AppCompatActivity. Поскольку оба эти класса расширяются, FragmentActivityони также поддерживают хостинг Fragment.
Рави Таплиял

Ответы:


327

Я думал, что активность устарела

Нет.

Так что для API уровня 22 (с минимальной поддержкой API уровня 15 или 16), что именно я должен использовать как для размещения компонентов, так и для самих компонентов? Есть ли применение для всех этих, или я должен использовать один или два почти исключительно?

Activityэто базовая линия. Любая деятельность наследуется Activityпрямо или косвенно.

FragmentActivityдля использования с Backport фрагментов найдены в support-v4и support-v13библиотеках. В API Level 11 была добавлена ​​нативная реализация фрагментов, которая ниже предложенных вами minSdkVersionзначений. Единственная причина, по которой вам нужно было бы рассмотреть FragmentActivityконкретно, это если вы хотите использовать вложенные фрагменты (фрагмент, содержащий другой фрагмент), поскольку это не поддерживалось в собственных фрагментах до API уровня 17.

AppCompatActivityэто из appcompat-v7библиотеки. Как правило, это предлагает бэкпорт панели действий. Поскольку встроенная панель действий была добавлена ​​в API Level 11, вам это не нужно AppCompatActivity. Тем не менее, в текущих версиях appcompat-v7также добавлен ограниченный бэкпорт эстетики Material Design с точки зрения панели действий и различных виджетов. Есть плюсы и минусы использования appcompat-v7, выходящие далеко за рамки этого конкретного ответа о переполнении стека.

ActionBarActivityстарое имя базовой активности от appcompat-v7. По разным причинам они хотели сменить имя. Если какая-либо сторонняя библиотека, которую вы используете, настаивает на ActionBarActivity, вы должны предпочесть AppCompatActivityболее ActionBarActivity.

Итак, учитывая ваш minSdkVersionв 15-16 диапазоне:

  • Если вы хотите, чтобы внешний вид Material Design, используйте AppCompatActivity

  • Если нет, но вы хотите вложенные фрагменты, используйте FragmentActivity

  • Если нет, используйте Activity

Просто добавив из комментария как примечание: AppCompatActivityрасширяет FragmentActivity, так что любой, кто должен использовать функции FragmentActivityмогут использовать AppCompatActivity.


Что, если я хочу использовать внешний вид Material Design, а также хотеть вложенные фрагменты? AppCompatActivity наследует от FragmentActivity?
Оркун Севсай

4
@MiloRambaldi: Да, FragmentActivityявляется предком AppCompatActivity. Хотя я не рекомендую использовать вложенные фрагменты, поскольку вложенные фрагменты работают вообще, они AppCompatActivityбудут поддерживать вложенные фрагменты.
CommonsWare

Спасибо за подробный ответ @CommonsWare. Не могли бы вы сказать, какой minSDK позволил бы просто использовать Activityполучение самой последней версии, support-v7то есть не поддерживающего конструкцию материала. Моя цель - мин 19, цель 25
югутер

1
@jugutier: чтобы использовать Theme.Material, вам нужно minSdkVersion21 или выше.
CommonsWare

83

Activityявляется базовым классом для всех других видов деятельности, я не думаю, что это будет устаревшим. Отношения между ними:

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

«<-» означает наследование здесь. Ссылка сказала ActionBarActivityосуждается, используйте AppCompatActivityвместо этого.

Таким образом, использование AppCompatActivityвсегда является правильным выбором. Различия между ними:

  • Activity является основным.
  • На основании Activity, FragmentActivityпредоставляет возможность использования Fragment.
  • На основе FragmentActivity, AppCompatActivityпредоставляет функции для ActionBar.

2
элегантный ответ.
М.Казем Ахгари

69

2019: использование AppCompatActivity

На момент написания этой статьи (проверьте ссылку, чтобы подтвердить, что она по-прежнему верна), документация Android рекомендует использовать, AppCompatActivityесли вы используете панель приложений.

Это рациональная данность:

Начиная с Android 3.0 (уровень API 11), все действия, использующие тему по умолчанию, имеют панель действий в качестве панели приложения. Однако функции панели приложений постепенно добавляются в родную панель ActionBar по сравнению с различными версиями Android. В результате нативный ActionBar ведет себя по-разному в зависимости от того, какую версию системы Android может использовать устройство. Напротив, самые последние функции добавлены в версию панели инструментов библиотеки поддержки и доступны на любом устройстве, которое может использовать библиотеку поддержки.

По этой причине вам следует использовать класс панели инструментов библиотеки поддержки для реализации панелей приложений вашей деятельности. Использование панели инструментов библиотеки поддержки помогает обеспечить согласованное поведение вашего приложения на самых разных устройствах. Например, виджет «Панель инструментов» позволяет создавать материалы на устройствах под управлением Android 2.1 (уровень API 7) или более поздней версии, но встроенная панель действий не поддерживает оформление материала, если на устройстве не установлена ​​ОС Android 5.0 (уровень API 21) или более поздней версии.

Основные инструкции по добавлению панели инструментов:

  1. Добавьте библиотеку поддержки app7 для v7
  2. Расширьте всю свою деятельность AppCompatActivity
  3. В Манифесте заявляй, что хочешь NoActionBar.
  4. Добавьте a ToolBarк макету xml каждого действия.
  5. Получить ToolBarв каждой деятельности onCreate.

Смотрите инструкции по документации для более подробной информации. Они довольно понятны и полезны.


Привет @Suragch, спасибо за это. Скажем, сегодня я делаю приложение, которое поддерживает ТОЛЬКО 21 год. На самом деле, так получилось, что я никогда не хочу панель действий или панель приложений (больше полноэкранного приложения). Студия предлагает (16 ноября) я мог бы использовать «Обратную совместимость (AppCompat)» . Мой инстинкт инстинкта не использует AppCompat. Каково ваше мнение эксперта? Я могу только поблагодарить вас, спасибо.
Толстяк

Я не эксперт, поэтому я не могу дать вам экспертное мнение, но документация предлагает поддержку как можно большего количества устройств, поэтому я так и делаю. Я использую AppCompat со всеми своими приложениями, и до сих пор это работало хорошо. Я полагаю, если вы действительно не хотите поддерживать до 21, тогда вы можете проигнорировать предложение Studio.
Сурагч

50

Для минимального уровня API 15, вы бы хотели использовать AppCompatActivity. Так, например, ваш MainActivityбудет выглядеть так:

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

Чтобы использовать его AppCompatActivity, убедитесь, что у вас есть загруженная библиотека поддержки Google (это можно проверить в меню «Инструменты» -> «Android» -> «Менеджер SDK»). Затем просто включите зависимость gradle в файл gradle.build вашего приложения:

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

Вы можете использовать его в AppCompatкачестве основного Activity, который затем можно использовать для запуска фрагментов или других операций (это зависит от того, какое приложение вы создаете).

Книга BigNerdRanch - хороший ресурс, но да, он устарел. Прочитайте его для получения общей информации о том, как работает Android, но не ожидайте, что конкретные классы, которые они используют, будут обновлены.


Хорошо, у меня есть эта зависимость в моем файле gradle.build. Так, например, если я создаю таблицу с кучей строк (как любое приложение Notes), моим главным экраном будет AppCompat, а также все остальное, что хосты также будут AppCompat? Мне нужно только использовать AppCompat?
Джеймсон

Таким образом, ваш AppCompat будет раздувать некоторый ресурс макета, который определяет дизайн (таблица с кучей строк). Но скажем, вы хотите открыть новую страницу, когда нажимаете на строку. Вы можете настроить onClickListener для открытия нового действия AppCompat или фрагмента.
adao7000

По состоянию на 3 августа у BigNerdRanch вышло новое издание книги: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/…
bryant1410,

1
@ adao7000 приятель, где он упомянул, что для 15 или выше вы можете использовать AppCompatActivity - я думал, что v7 в android.support.v7.app для минимального требуемого SDK - 7.
Основан на

1
@codebased android.support.v7 может быть использован начал на уровне API 9. Источник: developer.android.com/topic/libraries/support-library/...
adao7000

30

Activityкласс является основным классом. (Оригинал) Поддерживает управление фрагментами (начиная с API 11). Больше не рекомендуется его чистое использование, потому что его специализации намного лучше.

ActionBarActivityбыла в момент замены к классу активности , потому что легко обрабатывать ActionBar в приложении.

AppCompatActivityэто новый путь , потому что ActionBar не рекомендуется больше , и вы должны использовать панель инструментов вместо (что в настоящее время замена ActionBar). AppCompatActivity наследует от FragmentActivity, поэтому, если вам нужно обработать фрагменты, вы можете (через Fragment Manager). AppCompatActivity предназначена для ЛЮБОГО API, а не только для 16+ (кто это сказал?). Вы можете использовать его, добавив в свой файл Gradle. Я использую его в API 10, и он отлично работает.compile 'com.android.support:appcompat-v7:24:2.0'


1
«Панель действий теперь не рекомендуется» - панель действий не рекомендуется. «Вам нужно использовать панель инструментов» - приложения не нужно использовать Toolbar.
CommonsWare

@CommonsWare Хорошо, это не устарело, но его использование больше не поощряется в его более чистой форме (старой). Теперь, если вы хотите, чтобы в вашем приложении была панель действий, вы должны добавить ее вручную с помощью панели инструментов.
Хоакин Иурчук

«его использование больше не поощряется в более чистом виде», - я не видел в документации или официальных сообщениях блога ничего, что могло бы оправдать ваши претензии. У вас есть ссылка?
CommonsWare

@CommonsWare Вы выдающийся здесь, и вы правы. Только в рекомендациях по дизайну материалов предлагается использовать панель инструментов в качестве панели действий. Возможно я должен удалить свой ответ, поскольку это не точно. Спасибо
Хоакин Иурчук

2
Начиная с версии 26.0.0 библиотеки поддержки (выпущена в июле 2017 года) минимальный поддерживаемый уровень API был изменен на Android 4.0 (уровень API 14) для всех пакетов библиотек поддержки. источник: developer.android.com/topic/libraries/support-library/…
Андреа

12

Здесь много путаницы, особенно если вы читаете устаревшие источники.

Основным является то Activity, что может показать фрагменты. Вы можете использовать эту комбинацию, если у вас версия Android> 4.

Тем не менее, есть также библиотека поддержки , которая включает в себя другие классы , которые вы упомянули: FragmentActivity, ActionBarActivityи AppCompat. Первоначально они использовались для поддержки фрагментов в версиях Android <4, но на самом деле они также использовались для поддержки функциональности из более новых версий Android (например, дизайн материала).

Самый последний AppCompat, остальные 2 старше. Стратегия, которую я использую, состоит в том, чтобы использовать всегда AppCompat, чтобы приложение было готово в случае бэкпортов из будущих версий Android.


Спасибо! ОК, так что я могу использовать AppCompat вместо Activity для размещения ... что? Для того, чтобы разместить другие AppCompats? Или для размещения FragmentActivities?
Джеймсон

Деятельность обычно содержит только другие фрагменты ... И не беспокойтесь о FragmentActivity, это скорее "базовый" класс, из которого вытекают все другие причудливые XXXActivity.
Мехди

Но какой класс должен использовать мой хост AppCompat? Еще один AppCompat или что-то еще?
Джеймсон

Здесь вам нужно понять только одно: фрагменты действий. Между прочим, действия не размещаются, они не могут быть вложенными. Appcompat - это просто еще один вид деятельности. После этого вы можете продолжать и вкладывать фрагменты, но это становится сложным в управлении.
flower_green

1
Нет, вы используете appcompat в качестве действия и размещаете фрагменты, а не фрагментированность.
flower_green

7

Если вы говорите Activity, AppcompactActivityи ActionBarActivityт.д и т.д ..

Нам нужно поговорить о базовых классах, которые они расширяют. Сначала мы должны понять иерархию суперклассов.

Все вещи запускаются из контекста, который является суперклассом для всех этих классов.

Контекст - это абстрактный класс, реализация которого обеспечивается системой Android. Он позволяет получить доступ к ресурсам и классам, относящимся к конкретному приложению, а также к дополнительным вызовам для операций на уровне приложения, таких как запуск, широковещание и получение и т. Д.

Context сопровождается или продлен ContextWrapper

ContextWrapper класс , который распространяется Контекстное класс , который просто делегирует все ее звонки в другой контекст. Может быть разделено на подклассы для изменения поведения без изменения исходного контекста.

Теперь мы достигаем Activity

Активность представляет собой класс , который расширяет ContextThemeWrapper , что представляет собой единый, целенаправленный вещь , что пользователь может сделать. Почти все действия взаимодействуют с пользователем, поэтому класс Activity позаботится о создании окна для вас.

Ниже классы ограничены в расширении, но они расширяются внутренним наследником и обеспечивают поддержку определенных API

SupportActivity это класс , который расширяет активность , что является Базовым классом для составления функциональных совместимости вместе

BaseFragmentActivityApi14 класс , который расширяет SupportActivity , что это базовый класс Он ограничен классом , но она распространяется на BaseFragmentActivityApi16 для поддержки функциональности V14

BaseFragmentActivityApi16 это класс , который расширяет BaseFragmentActivityApi14 , что является Базовым классом для {@code FragmentActivity } , чтобы иметь возможность использовать V16 API. Но это также ограниченный класс, но он расширен FragmentActivity для поддержки функциональности V16.

сейчас FragmentActivty

FragmentActivity класс , который расширяет BaseFragmentActivityApi16 и хочет использовать поддержку на основе фрагмента и Loader API.

При использовании этого класса , в отличие от новой платформы встроенного фрагмента и загрузчиком поддержки, вы должны использовать getSupportFragmentManager()и getSupportLoaderManager()методы соответственно для доступа к этим функциям.

ActionBarActivity является частью библиотеки поддержки. Библиотеки поддержки используются для предоставления новых функций на старых платформах. Например, ActionBar был представлен в API 11 и по умолчанию является частью Activity (в зависимости от темы). В отличие от этого нет ActionBar на старых платформах. Таким образом, библиотека поддержки добавляет дочерний класс Activity ( ActionBarActivity ), который обеспечивает функциональность ActionBar и пользовательский интерфейс.

В 2015 году ActionBarActivity устарела в редакции 22.1.0 библиотеки поддержки. Вместо этого следует использовать AppCompatActivity .

AppcompactActivity класс , который расширяет FragmentActivity , что является базовым классом для деятельности , которые используют действие штриховых функции библиотеки поддержки.

Вы можете добавить ActionBar к своей деятельности при работе на уровне API 7 или выше, расширив этот класс для своей деятельности и установив тему деятельности на Theme.AppCompatаналогичную тему.

Вот

Я имею в виду эти два один , два


3

Поскольку имя, вероятно, изменится в будущих версиях Android (в настоящее время последняя версия есть, AppCompatActivityно в какой-то момент оно, вероятно, изменится), я считаю, что хорошо иметь класс, Activityкоторый расширяется, AppCompatActivityа затем все ваши действия расширяются от этой. Если завтра они меняют имя, AppCompatActivity2например, вам придется изменить его только в одном месте.


0

AppCompatActivity расширяет FragmentActivity расширяет BaseFragmentActivityApi16 расширяет BaseFragmentActivityApi14 расширяет SupportActivity расширяет Activity

Так что активность быстрее, чем все, и AppCompatActivity лучше всех.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.