różnica i kiedy używać getApplication (), getApplicationContext (), getBaseContext () i someClass.this

122

Jestem nowy na Androida i próbuję zrozumieć różnicę między getApplication(), getApplicationContext() getBaseContext(), getContext()a someClass.thiszwłaszcza, gdy do korzystania z tych metod w następujących linii kodu:

Kiedy wznoszę toast, jaka jest różnica między nimi iw jakich przypadkach ich używam?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

to samo z intencjami:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);
Pheonix7
źródło
obsługują tylko kontekst i baseContext. ale chciałbym zrozumieć wszystkie ich zastosowania w 2 kontekstach. dzięki
Pheonix7

Odpowiedzi:

216

Toast i Intent , oba wymagają odniesienia do kontekstu . I getApplication , getApplicationContext , LoginActivity.this i getBaseContext , wszystkie oferują odniesienie do kontekstu.

Teraz niejasne jest deklarowanie różnych kontekstów i ich specyficznego zastosowania. Aby uprościć sprawę, należy policzyć dwa typy kontekstów dostępne w ramach systemu Android.

  1. Kontekst aplikacji
  2. Kontekst działania

Kontekst aplikacji jest powiązany z cyklem życia aplikacji i zawsze będzie taki sam przez cały okres jej istnienia. Więc jeśli używasz Toast , możesz użyć kontekstu aplikacji, a nawet kontekstu aktywności (obu), ponieważ toast może zostać podniesiony z dowolnego miejsca w aplikacji i nie jest dołączony do okna.

Kontekst działania jest powiązany z cyklem życia działania i może zostać zniszczony, jeśli onDestroy()zostanie podniesiony. Jeśli chcesz uruchomić nowe działanie, musisz użyć kontekstu działania w jego intencji, tak aby nowe działanie uruchamiające było połączone z bieżącym działaniem (pod względem stosu działań). Możesz jednak użyć kontekstu aplikacji również do uruchomienia nowej aktywności, ale wtedy musisz ustawić flagę, Intent.FLAG_ACTIVITY_NEW_TASKaby traktować ją jako nowe zadanie.

Teraz odnosząc się do twoich spraw:

LoginActivity.this chociaż odnosi się do twojej własnej klasy, która rozszerza klasę Activity, ale klasa bazowa (Activity) również rozszerza klasę Context, więc może być używana do oferowania kontekstu działania.

getApplication() chociaż odwołuje się do obiektu Application, ale klasa Application rozszerza klasę Context, dzięki czemu może być używana do oferowania kontekstu aplikacji.

getApplicationContext() oferuje kontekst aplikacji.

getBaseContext() oferuje kontekst działania.

Wskazówki: Ilekroć musisz manipulować, Viewsprzejdź do kontekstu działania , w przeciwnym razie wystarczyłby kontekst aplikacji .

waqaslam
źródło
11
więc jeśli dobrze rozumiem, someClass.this, getBaseContext i getContext () są kontekstami aktywności, podczas gdy getApplicationContext () i getApplication () są kontekstami aplikacji?
Pheonix7
kontekst to tylko informacja o środowisku, prawda?
popełnionyandroider
Tak, to jest jak piaskownica, w której znajduje się aplikacja
waqaslam
@committedandroider, ponieważ kontekst działania zawiera dodatkowe informacje dla wybranego motywu, więc gdy widoki są tworzone w kodzie, właściwy motyw zostanie zastosowany automatycznie. Aby uzyskać więcej informacji, możesz przeczytać to
waqaslam
@waqaslam odnoszący się do klas android sdk, Context-> ContextWrapper-> 1. Applicationi 2. ContextThemeWrapper-> Activity; i getBaseContext()jest metoda ContextWrapper, tak getBaseContext() offers activity context.jak i Application Contextzbyt ... jest nie tak?
Bhuro,
26

Odpowiedź przez Waqas jest bardzo jasne i kompletne, jednak chciałbym, aby dokładniej wyjaśnić różnicę pomiędzy użyciem thisVs. getBaseContext()lub getApplication()Vs. getApplicationContext(). Obie Activityi Applicationnie rozszerzają się Contextsame, ale ContextWrapperktóre są

„Proxing implementacji Contexttego po prostu przekazuje wszystkie swoje wywołania innemu Context”.

Ten „prawdziwy” kontekst jest tym, co otrzymujesz, używając getBaseContext().

Więc chociaż this(dla Activity) i getBaseContext()oba podają kontekst działania, one

  • (a) nie odnoszą się do tego samego obiektu ( this != getBaseContext()) i
  • (b) wywołanie kontekstu przez thisjest nieco mniej wydajne, ponieważ połączenia przechodzą przez dodatkowy poziom pośredni. Jednak wątpię, czy ma to jakiekolwiek praktyczne znaczenie.

Ta sama logika dotyczy getApplication()vs. getApplicationContext().

AlexR
źródło
Jeśli chodzi o getBaseContext()problem, programiści Google dla Androida zasugerowali: „Nie używaj metody getBaseContext (), po prostu użyj kontekstu, który masz”. W efekcie sugerują użycie thisdo działań.
ChuongPham,
jest to najbardziej jasne wyjaśnienie, getBaseContextjakie znalazłem w Internecie. Dzięki!!
q126y
6
LoginActivity.this 

powyższa linia jest działaniem, które oczywiście jest kontekstem ... jest używane podczas tworzenia niektórych AlertDialogs ... W niektórych miejscach obowiązkowe jest użycie kontekstu działania ...

getApplication()

To samo tutaj metoda make text wymaga implementacji kontekstu i aplikacji Context

getApplicationContext()

jest to najbardziej preferowany sposób, ponieważ Contexttrwa do momentu wyłączenia aplikacji.

getBaseContext()

ten kontekst jest dostępny dla widżetów i widoków.

Ale wszystkie z nich dają obiekt Context i nic więcej ...

ngesh
źródło
więc w wyskakującej wiadomości lub podczas tworzenia intencji wszystkie mają ten sam efekt, chociaż użycie metody getApplicationContext () jest najbardziej poprawne?
Pheonix7
1
@Hassan Samii: W przypadku Toast możesz używać getApplicationContext()w każdej sytuacji, ale najlepiej jest używać go thispodczas tworzenia Toast w działaniu.
ChuongPham,
0

Class.this jest używany, jeśli twoja klasa rozszerza Działanie getapplication () używane odwołuje się do aplikacji, a aplikacja rozszerza kontekst aplikacji getbasecontext () odwołuje się do kontekstu kontekstu działania odwołuje się do kontekstu cyklu życia działania applicationcontext odwołuje się do cyklu życia aplikacji

chandrakant Chaturvedi
źródło