Діяльність, AppCompatActivity, FragmentActivity та ActionBarActivity: коли використовувати який?


266

Я приїжджаю з iOS, де це легко, і ви просто використовуєте UIViewController. Однак в Android речі здаються набагато складнішими, з певними UIComponents для конкретних рівнів API. Я читаю BigNerdRanch для Android (книзі приблизно 2 роки), і вони пропонують мені використовувати Activityдля розміщення свого FragmentActivities. Однак я вважав, що Activityзастарів.

Отже, для API рівня 22 (з мінімальною підтримкою для рівня 15 чи 16), що саме я повинен використовувати як для розміщення компонентів, так і для самих компонентів? Чи є вживання для всього цього, або я повинен використовувати одне чи два майже виключно?


1
Ви не будете приймати FragmentActivityies. Ви лише хостинг Fragments. У нових версіях Android сам Activityклас було оновлено для їх прямого розміщення. Для підтримки старих версій FragmentActivityбуло введено.
Раві Тапліял

5
Аналогічно, з API 11+ Activityроків була підтримка для ActionBar. Це було підтримано на старих версіях, через ActionBarActivityпершу, які тепер застаріли і замінені на AppCompatActivity. Оскільки обидва ці класи також розширюють FragmentActivityпідтримку хостингу Fragment.
Раві Тапліял

Відповіді:


327

Я вважав, що активність застаріла

Немає.

Отже, для API рівня 22 (з мінімальною підтримкою для рівня 15 чи 16), що саме я повинен використовувати як для розміщення компонентів, так і для самих компонентів? Чи є вживання для всього цього, або я повинен використовувати одне чи два майже виключно?

Activityє базовою лінією. Кожна діяльність успадковується від Activity, прямо чи опосередковано.

FragmentActivityпризначений для використання з репортажем фрагментів, знайдених у бібліотеках support-v4та support-v13. Наладна реалізація фрагментів була додана в API рівня 11, що нижче запропонованих minSdkVersionзначень. Єдина причина, з якої вам потрібно було б розглянути FragmentActivityконкретно, це якщо ви хочете використовувати вкладені фрагменти (фрагмент, що містить інший фрагмент), оскільки це не підтримувалося в нативних фрагментах до рівня API 17.

AppCompatActivityє з appcompat-v7бібліотеки. В основному, це підтримує панель дій. Оскільки рідна панель дій була додана в API рівня 11, для цього вам не потрібно AppCompatActivity. Однак, поточні версії appcompat-v7також додають обмеженого кодексу естетичного матеріалу в плані дії та різних віджетів. Існують плюси і мінуси використання appcompat-v7, що виходять за рамки цієї конкретної відповіді на переповнення стека.

ActionBarActivity- стара назва базової діяльності від appcompat-v7. З різних причин вони хотіли змінити назву. Якщо якась - то третя сторона бібліотеки ви використовуєте не наполягає на ActionBarActivity, слід віддавати перевагу AppCompatActivityбільш ActionBarActivity.

Отже, враховуючи ваші minSdkVersionв діапазоні 15-16:

  • Якщо ви хочете, щоб підтримуваний дизайн матеріалу виглядав, використовуйте AppCompatActivity

  • Якщо ні, але ви хочете вкладені фрагменти, використовуйте FragmentActivity

  • Якщо ні, використовуйте Activity

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


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

4
@MiloRambaldi: Так, FragmentActivityє родоначальником AppCompatActivity. Хоча я не рекомендую використовувати вкладені фрагменти, наскільки вкладені фрагменти взагалі працюють, AppCompatActivityпідтримуватимуть вкладені фрагменти.
CommonsWare

Дякуємо за детальну відповідь @CommonsWare. Не могли б ви сказати, який minSDK дозволить просто використовувати Activityотримання більшості останніх даних, support-v7тобто без непідтримуваного дизайну матеріалів. Моя мета - min 19 target 25
jugutier

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 (рівень 11 API), усі дії, які використовують тему за замовчуванням, мають панель ActionBar як панель додатків. Однак функції панелі додатків поступово додаються до рідного ActionBar через різні версії Android. Як результат, вродний 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 пізніше. Дійсно, як це буває, я не хочу ніколи, панелі дій чи панелі додатків (більше на повноекранному додатку). Студія пропонує (16 листопада), я можу використати "Зворну сумісність (AppCompat)" . Мій інстинкт кишки - НЕ використовувати AppCompat. Яка ваша думка експертів? Можу лише подякувати, дякую.
Fattie

Я не фахівець, тому не можу дати вам експертну думку, але документація пропонує підтримувати якомога більше пристроїв, так що я роблю. Я використовую 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.
codebased

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, тому якщо вам потрібно обробити фрагменти, ви можете (через Менеджер фрагментів). AppCompatActivity призначений для будь-якого API, а не лише 16+ (хто це сказав?). Ви можете використовувати його, додавши у свій файл Gradle. Я використовую його в API 10, і він працює ідеально.compile 'com.android.support:appcompat-v7:24:2.0'


1
"тепер застарілий ActionBar" - панель дій не застаріла. "замість вас потрібно використовувати Панель інструментів" - додатки не потрібно використовувати Toolbar.
CommonsWare

@CommonsОбережно, це не застаріло, але його використання вже не рекомендується в чистому вигляді (старий). Тепер, якщо ви хочете, щоб у вашому додатку була панель дій, слід додати її вручну за допомогою Панелі інструментів.
Хоакін Юрчук

"його використання вже не рекомендується в більш чистому вигляді" - я не бачив нічого в документації чи офіційних дописах блогу, що могло б виправдати вашу претензію. У вас є посилання?
CommonsWare

@CommonsWare Ви тут високі, і ви маєте рацію. Тільки вказівки щодо дизайну матеріалів пропонують використовувати панель інструментів як панель дій. Можливо, я повинен видалити свою відповідь, оскільки вона не є точною. Спасибі
Хоакін Юрчук

2
Починаючи з Бібліотеки підтримки версії 26.0.0 (випущена в липні 2017 року), мінімальний підтримуваний рівень API змінився на Android 4.0 (рівень API 14) для всіх пакетів бібліотеки підтримки. Джерело: developer.android.com/topic/libraries/support-library/…
Andrea Leganza

12

Тут багато плутанини, особливо якщо ви читаєте застарілі джерела.

Основним є те Activity, що може показати фрагменти. Ви можете використовувати цю комбінацію, якщо ви користуєтеся версією Android> 4.

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

Останній - AppCompatінші 2 старіші. Стратегія, яку я використовую, - це завжди використовувати AppCompat, щоб додаток було готове у випадку зворотного зв'язку з майбутніми версіями Android.


Дякую! Гаразд, тому я можу використовувати AppCompat замість діяльності, щоб розмістити ... що? Для того, щоб розмістити інші 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 і є частиною Активності за замовчуванням (залежно від фактично теми). На відміну від ActionBar на старих платформах немає. Таким чином, бібліотека підтримки додає дочірній клас діяльності ( 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 розширює активність

Тож активність швидша за всіх, а AppCompatActivity - найкраща з усіх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.