Activity, AppCompatActivity, FragmentActivity i ActionBarActivity: kiedy używać którego?

266

Pochodzę z iOS, gdzie jest to łatwe, a ty po prostu używasz UIViewController. Jednak w Androidzie rzeczy wydają się znacznie bardziej skomplikowane, z pewnymi komponentami UIC dla określonych poziomów API. Czytam BigNerdRanch dla Androida (książka jest mniej więcej 2 lat) i sugerują używam Activitydo host mojej FragmentActivities. Myślałem jednak, że Activityjest przestarzały.

Zatem w przypadku API poziomu 22 (z minimalną obsługą API poziomu 15 lub 16), czego dokładnie powinienem używać zarówno do hostowania komponentów, jak i samych komponentów? Czy są zastosowania dla tych wszystkich, czy powinienem używać jednego lub dwóch prawie wyłącznie?

Jameson
źródło
1
Nie będziesz hostować FragmentActivityies. Jesteś tylko gospodarzem Fragment. W nowszych wersjach Androida Activitysama klasa została zaktualizowana, aby hostować je bezpośrednio. Do obsługi starszych wersji FragmentActivitywprowadzono.
Ravi Thapliyal
5
Podobnie, z API 11+ Activityies miały wsparcie dla ActionBar. To było obsługiwane w starszych wersjach do ActionBarActivitypierwszej, która teraz jest przestarzała i zastąpiona przez AppCompatActivity. Ponieważ obie te klasy rozszerzają się FragmentActivity, obsługują również hosting Fragment.
Ravi Thapliyal

Odpowiedzi:

327

Myślałem, że działalność była przestarzała

Nie.

Zatem w przypadku API poziomu 22 (z minimalną obsługą API poziomu 15 lub 16), czego dokładnie powinienem używać zarówno do hostowania komponentów, jak i samych komponentów? Czy są zastosowania dla tych wszystkich, czy powinienem używać jednego lub dwóch prawie wyłącznie?

Activityjest punktem odniesienia. Każde działanie dziedziczy Activitybezpośrednio lub pośrednio.

FragmentActivityjest przeznaczony do stosowania z backportem fragmentów znalezionych w bibliotekach support-v4i support-v13. Natywna implementacja fragmentów została dodana na poziomie API 11, który jest niższy niż proponowane minSdkVersionwartości. Jedynym powodem, dla którego należy rozważyć, FragmentActivityjest to, czy chcesz użyć zagnieżdżonych fragmentów (fragment zawierający inny fragment), ponieważ nie było to obsługiwane w fragmentach natywnych do poziomu API 17.

AppCompatActivityjest z appcompat-v7biblioteki. Zasadniczo oferuje to backport paska akcji. Ponieważ natywny pasek akcji został dodany na poziomie API 11, nie jest to konieczne AppCompatActivity. Jednak obecne wersje appcompat-v7dodają również ograniczone zaplecze estetyczne Material Design pod względem paska akcji i różnych widżetów. Istnieją zalety i wady korzystania appcompat-v7, znacznie wykraczające poza zakres tej konkretnej odpowiedzi na przepełnienie stosu.

ActionBarActivityto stara nazwa podstawowej czynności z appcompat-v7. Z różnych powodów chcieli zmienić nazwę. Chyba że niektóre biblioteki innej firmy używasz nalega ActionBarActivitypowinien wolisz AppCompatActivitynad ActionBarActivity.

Biorąc pod uwagę twoje minSdkVersionw zakresie 15-16:

  • Jeśli chcesz uzyskać wygląd projektowanego materiału, użyj AppCompatActivity

  • Jeśli nie, ale chcesz zagnieżdżonych fragmentów, użyj FragmentActivity

  • Jeśli nie, użyj Activity

Wystarczy dodać z komentarza jako notatkę: AppCompatActivityrozszerza FragmentActivity, aby każdy, kto musi korzystać z funkcji, FragmentActivitymoże korzystać AppCompatActivity.

CommonsWare
źródło
Co jeśli chcę użyć wyglądu Material Design, a także chcę zagnieżdżonych fragmentów? Czy AppCompatActivity dziedziczy po FragmentActivity?
Orcun Sevsay,
4
@MiloRambaldi: Tak, FragmentActivityjest przodkiem AppCompatActivity. Chociaż nie zalecam używania zagnieżdżonych fragmentów, o ile w ogóle zagnieżdżone fragmenty będą działać, AppCompatActivitybędą obsługiwać zagnieżdżone fragmenty.
CommonsWare
Dzięki za szczegółową odpowiedź @CommonsWare. Czy możesz powiedzieć, który pakiet minSDK pozwoliłby na użycie Activitywiększości najnowszych bez support-v7np. Niesportowanego projektowania materiałów. Moim celem jest min. 19 cel 25
jugutier
1
@jugutier: Aby korzystać Theme.Material, potrzebujesz minSdkVersion21 lub więcej.
CommonsWare
83

Activityjest podstawową klasą wszystkich innych działań, nie sądzę, że będzie przestarzała. Relacja między nimi jest:

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

„<-” oznacza tutaj dziedzictwo. Odniesienie powiedział ActionBarActivityjest przestarzała, użyj AppCompatActivityzamiast tego.

Zasadniczo używanie AppCompatActivityzawsze jest właściwym wyborem. Różnice między nimi to:

  • Activity jest podstawowy.
  • W oparciu o Activity, FragmentActivityzapewnia możliwość korzystania Fragment.
  • W oparciu o FragmentActivity, AppCompatActivityzapewnia funkcje dla ActionBar.
Ted Yu
źródło
2
elegancka odpowiedź.
M.kazem Akhgary
69

2019: Użyj AppCompatActivity

W momencie pisania tego tekstu (sprawdź link, aby potwierdzić, że nadal jest to prawda), Dokumentacja Androida zaleca używanie, AppCompatActivityjeśli korzystasz z paska aplikacji.

To jest racjonalne dane:

Począwszy od Androida 3.0 (API poziom 11) wszystkie działania korzystające z domyślnego motywu mają pasek ActionBar jako pasek aplikacji. Jednak funkcje paska aplikacji były stopniowo dodawane do natywnego paska ActionBar w różnych wersjach Androida. W rezultacie rodzimy ActionBar zachowuje się inaczej w zależności od wersji systemu Android, z którego może korzystać urządzenie. Natomiast najnowsze funkcje są dodawane do wersji paska narzędzi biblioteki pomocy i są dostępne na każdym urządzeniu, które może korzystać z biblioteki pomocy.

Z tego powodu powinieneś użyć klasy Toolbar biblioteki wsparcia, aby zaimplementować paski aplikacji swoich działań. Korzystanie z paska narzędzi biblioteki pomocy pomaga zapewnić spójne działanie aplikacji na najszerszym zakresie urządzeń. Na przykład widget Pasek narzędzi zapewnia projektowanie materiałów na urządzeniach z Androidem 2.1 (API poziom 7) lub nowszym, ale natywny pasek akcji nie obsługuje projektowania materiałów, chyba że na urządzeniu działa Android 5.0 (API poziom 21) lub nowszy.

Ogólne wskazówki dotyczące dodawania paska narzędzi to

  1. Dodaj bibliotekę obsługi appcompat v7
  2. Rozwiń wszystkie swoje działania AppCompatActivity
  3. W Manifeście zadeklaruj, że chcesz NoActionBar.
  4. Dodaj ToolBarukład xml każdej czynności.
  5. Zdobądź ToolBarw każdej aktywności onCreate.

Aby uzyskać więcej informacji, zobacz instrukcje dotyczące dokumentacji . Są dość jasne i pomocne.

Suragch
źródło
Cześć @Suragch, dzięki za to. Powiedzmy, że tworzę dzisiaj aplikację, która obsługuje TYLKO 21 lat. Rzeczywiście, jak to się dzieje, nie chcę nigdy paska akcji ani paska aplikacji (więcej aplikacji na pełnym ekranie). Studio sugeruje (16 listopada), że mogę użyć „Zgodności wstecznej (AppCompat)” . Mój instynkt jelitowy NIE używa AppCompat. Jaka jest twoja opinia eksperta? Mogę ci tylko podziękować, dzięki.
Fattie
Nie jestem ekspertem, więc nie mogę dać ci opinii eksperta, ale dokumentacja sugeruje obsługę jak największej liczby urządzeń, więc to właśnie robię. Używam AppCompat ze wszystkimi moimi aplikacjami i do tej pory działało dobrze. Podejrzewam, że jeśli naprawdę nie chcesz obsługiwać wersji wcześniejszej niż 21, możesz zignorować sugestię Studio.
Suragch
50

Dla minimalnego poziomu interfejsu API 15, chcesz użyć AppCompatActivity. Na przykład MainActivitywyglądałoby to tak:

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

Aby z niego skorzystać AppCompatActivity, upewnij się, że masz pobraną bibliotekę pomocy Google (możesz to sprawdzić w Narzędziach -> Android -> Menedżer SDK). Następnie po prostu uwzględnij zależność stopni w pliku gradle.build aplikacji:

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

Możesz użyć tego AppCompatjako głównego Activity, którego można następnie użyć do uruchomienia Fragmentów lub innych działań (zależy to od rodzaju tworzonej aplikacji).

Książka BigNerdRanch jest dobrym źródłem, ale tak, jest przestarzała. Przeczytaj to, aby uzyskać ogólne informacje o tym, jak działa Android, ale nie oczekuj, że określone klasy będą aktualne.

adao7000
źródło
OK, mam tę zależność w moim pliku gradle.build. Na przykład, jeśli tworzę tabelę z wieloma wierszami (jak każda aplikacja programu Notes), moim głównym ekranem będzie AppCompat, a także cokolwiek innego, co hosty również będą AppCompat? Czy w zasadzie muszę tylko używać AppCompat?
Jameson
Tak więc Twój AppCompat nadmuchuje niektóre zasoby układu, które określają projekt (tabela z dużą ilością wierszy). Powiedzmy, że chcesz otworzyć nową stronę po kliknięciu wiersza. Możesz ustawić onClickListener, aby otworzyć nową aktywność AppCompat lub fragment.
adao7000,
Od 3 sierpnia BigNerdRanch ma nowe wydanie swojej książki: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/…
bryant1410 10.0915
1
@ kolega adao7000 którym wspomniał, że za 15 lat lub powyżej można użyć AppCompatActivity - Myślałem v7 w android.support.v7.app jest dla minimalnej SDK wymagane jest 7.
codebased
1
@codebased android.support.v7 może być używany rozpoczęty na poziomie API 9. Źródło: developer.android.com/topic/libraries/support-library/...
adao7000
30

Activityklasa jest klasą podstawową. (Oryginał) Obsługuje zarządzanie fragmentami (od API 11). Nie jest już zalecane jego czyste użycie, ponieważ jego specjalizacje są znacznie lepsze.

ActionBarActivitybył w chwili zamiennik do klasy Aktywny ponieważ łatwa do obsługi ActionBar w aplikacji.

AppCompatActivityjest nowa droga, ponieważ ActionBar nie zachęca już i należy użyć zamiast Toolbar (to obecnie wymiana ActionBar). AppCompatActivity dziedziczy po FragmentActivity, więc jeśli chcesz obsłużyć Fragmenty, możesz (za pomocą Menedżera fragmentów). AppCompatActivity jest dla KAŻDEGO API, nie tylko 16+ (kto to powiedział?). Możesz go użyć, dodając plik Gradle. Używam go w API 10 i działa idealnie.compile 'com.android.support:appcompat-v7:24:2.0'

Joaquin Iurchuk
źródło
1
„Pasek akcji jest teraz przestarzały” - pasek akcji nie jest przestarzały. „zamiast tego musisz użyć paska narzędzi” - aplikacje nie muszą używać Toolbar.
CommonsWare
@CommonsWare Ok, to nie jest przestarzałe, ale jego użycie nie jest już zalecane w jego bardziej czystej formie (starej). Teraz, jeśli chcesz mieć pasek akcji w swojej aplikacji , powinieneś dodać go ręcznie za pomocą paska narzędzi.
Joaquin Iurchuk
„nie zachęca się już do korzystania z niego w bardziej czystej formie” - w dokumentacji lub oficjalnych postach na blogu nie widziałem niczego, co uzasadniałoby twoje roszczenie. Czy masz link?
CommonsWare
@CommonsWare Jesteś tutaj najważniejszy i masz rację. Jedynie wytyczne dotyczące projektowania materiałów sugerują użycie paska narzędzi jako paska akcji. Może powinienem usunąć swoją odpowiedź, ponieważ nie jest ona precyzyjna. Dzięki
Joaquin Iurchuk
2
Począwszy od wersji 26.0.0 biblioteki pomocy technicznej (wydanej w lipcu 2017 r.) Minimalny obsługiwany poziom interfejsu API zmienił się na Androida 4.0 (poziom interfejsu API 14) dla wszystkich pakietów bibliotek wsparcia. źródło: developer.android.com/topic/libraries/support-library/…
Andrea Leganza
12

Jest tu wiele zamieszania, szczególnie jeśli czytasz nieaktualne źródła.

Podstawowym jest Activity, który może pokazywać Fragmenty. Możesz użyć tej kombinacji, jeśli masz wersję Androida> 4.

Jednak istnieje również biblioteka wsparcie, które obejmuje innych klas pan wspomniał: FragmentActivity, ActionBarActivityi AppCompat. Początkowo były one używane do obsługi fragmentów w wersjach Androida <4, ale w rzeczywistości są one również używane do backportowania funkcjonalności z nowszych wersji Androida (na przykład projektowanie materiałów).

Najnowszym jest AppCompat, pozostałe 2 są starsze. Zawsze używam strategii AppCompat, aby aplikacja była gotowa w przypadku backportów z przyszłych wersji Androida.

kwiat_zielony
źródło
Dziękuję Ci! OK, więc mogę użyć AppCompat zamiast Activity w celu hostowania ... co? Aby hostować inne AppCompats? Lub w celu hostowania FragmentActivities?
Jameson
Aktywność zwykle obsługuje tylko inne fragmenty ... I nie martw się o FragmentActivity, jest to raczej klasa „podstawowa”, z której wywodzą się wszystkie inne fantazyjne XXXActivity.
Mehdi
Ale którą klasę powinien obsługiwać mój AppCompat? Kolejny AppCompat, czy coś jeszcze?
Jameson
Musisz tylko zrozumieć jedną rzecz: fragmenty gospodarza. Nawiasem mówiąc, działania nie są hostowane przez nic innego, nie można ich zagnieżdżać. Appcompat to po prostu kolejny rodzaj aktywności. Następnie możesz kontynuować i zagnieżdżać fragmenty, ale zarządzanie nimi staje się skomplikowane.
flower_green
1
Nie, używasz appcompat jako działania i hostujesz fragmenty, a nie fragmentacje.
flower_green
7

Jeśli mówić o Activity, AppcompactActivity, ActionBarActivityetc etc ..

Musimy porozmawiać o klasach podstawowych, które rozszerzają. Najpierw musimy zrozumieć hierarchię superklas.

Wszystkie rzeczy zaczynają się od kontekstu, który jest super klasą dla wszystkich tych klas.

Kontekst jest klasą abstrakcyjną, której implementację zapewnia system Android. Umożliwia dostęp do zasobów i klas specyficznych dla aplikacji, a także wezwań do wykonywania operacji na poziomie aplikacji, takich jak uruchamianie działań, nadawanie i przyjmowanie zamiarów itp.

Context następuje lub jest przedłużany przez ContextWrapper

ContextWrapper jest klasa, które rozciągają Context klasę, która po prostu delegaci wszystkich swoich połączeń z innym kontekście. Można go podklasować, aby zmodyfikować zachowanie bez zmiany oryginalnego kontekstu.

Teraz sięgamy do Activity

Aktywny jest klasa, która rozciąga ContextThemeWrapper że to pojedynczy, skupiony rzeczą, że użytkownik może zrobić. Prawie wszystkie działania współdziałają z użytkownikiem, więc klasa Activity zajmuje się tworzeniem dla ciebie okna

Poniższe klasy są ograniczone do rozszerzenia, ale są one rozszerzane przez ich zstępującego wewnętrznie i zapewniają wsparcie dla konkretnego interfejsu API

SupportActivity jest grupa, która rozciąga się aktywność, która jest klasą bazowa komponować razem funkcję zgodności

BaseFragmentActivityApi14 to klasa, która rozciąga SupportActivity że to klasa bazowa jest ograniczona klasa ale jest przedłużenie o BaseFragmentActivityApi16 wspierać funkcjonalność V14

BaseFragmentActivityApi16 jest klasa która rozciąga BaseFragmentActivityApi14 która to klasa bazowa {@code FragmentActivity }, aby móc korzystać z V16 API. Ale jest to również klasa ograniczona, ale jest rozszerzana przez FragmentActivity, aby obsługiwać funkcjonalność V16.

teraz FragmentActivty

FragmentActivity to klasa, która rozciąga BaseFragmentActivityApi16 i że chce skorzystać z pomocy opartej fragmentem i Loader API.

Korzystając z tej klasy w przeciwieństwie do wbudowanej obsługi fragmentów i modułów ładujących nowej platformy, należy użyć odpowiednio metod getSupportFragmentManager()i getSupportLoaderManager(), aby uzyskać dostęp do tych funkcji.

ActionBarActivity jest częścią Biblioteki wsparcia. Biblioteki pomocy służą do dostarczania nowszych funkcji na starszych platformach. Na przykład pasek Actionbar został wprowadzony w API 11 i domyślnie jest częścią działania (w zależności od motywu). Natomiast na starszych platformach nie ma paska ActionBar . Tak więc biblioteka obsługi dodaje klasę potomną Activity ( ActionBarActivity ), która zapewnia funkcjonalność i interfejs ActionBar

W 2015 ActionBarActivity jest przestarzałe w wersji 22.1.0 Biblioteki pomocy technicznej. Zamiast tego należy użyć AppCompatActivity .

AppcompactActivity to klasa, która rozciąga FragmentActivity który jest klasa bazowa dla działań, które należy użyć paska działanie funkcji bibliotecznych wsparcie.

Możesz dodać pasek ActionBar do swojej aktywności, gdy działa on na poziomie API 7 lub wyższym, rozszerzając tę ​​klasę dla swojej aktywności i ustawiając motyw aktywności na Theme.AppCompatlub podobny motyw

Tutaj

Odnoszę te dwa jeden , dwa

Farhana
źródło
3

Ponieważ nazwa prawdopodobnie zmieni się w przyszłych wersjach Androida (obecnie najnowsza jest, AppCompatActivityale prawdopodobnie zmieni się w pewnym momencie), uważam, że dobrą rzeczą jest posiadanie klasy, Activityktóra rozszerza się, AppCompatActivitya następnie wszystkie twoje działania zaczynają się od tej. Jeśli jutro zmienią nazwę, AppCompatActivity2na przykład będziesz musiał ją zmienić tylko w jednym miejscu.

Drogi brzuch
źródło
0

AppCompatActivity rozszerza FragmentActivity rozszerza BaseFragmentActivityApi16 rozszerza BaseFragmentActivityApi14 rozszerza SupportActivity rozszerza aktywność

Aktywność jest więc szybsza niż wszystko, a AppCompatActivity jest najlepsza ze wszystkich.

Ahamadullah Saikat
źródło