Jestem nowy na Androida i próbuję zrozumieć różnicę między getApplication()
, getApplicationContext(
) getBaseContext()
, getContext()
a someClass.this
zwł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);
android
android-intent
this
toast
android-context
Pheonix7
źródło
źródło
Odpowiedzi:
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.
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_TASK
aby 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.źródło
Context
->ContextWrapper
-> 1.Application
i 2.ContextThemeWrapper
->Activity
; igetBaseContext()
jest metodaContextWrapper
, takgetBaseContext() offers activity context.
jak iApplication Context
zbyt ... jest nie tak?Odpowiedź przez Waqas jest bardzo jasne i kompletne, jednak chciałbym, aby dokładniej wyjaśnić różnicę pomiędzy użyciem
this
Vs.getBaseContext()
lubgetApplication()
Vs.getApplicationContext()
. ObieActivity
iApplication
nie rozszerzają sięContext
same, aleContextWrapper
które sąTen „prawdziwy” kontekst jest tym, co otrzymujesz, używając
getBaseContext()
.Więc chociaż
this
(dlaActivity
) igetBaseContext()
oba podają kontekst działania, onethis != getBaseContext()
) ithis
jest 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()
.źródł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życiethis
do działań.getBaseContext
jakie znalazłem w Internecie. Dzięki!!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 ...
To samo tutaj metoda make text wymaga implementacji kontekstu i aplikacji
Context
jest to najbardziej preferowany sposób, ponieważ
Context
trwa do momentu wyłączenia aplikacji.ten kontekst jest dostępny dla widżetów i widoków.
Ale wszystkie z nich dają obiekt Context i nic więcej ...
źródło
getApplicationContext()
w każdej sytuacji, ale najlepiej jest używać gothis
podczas tworzenia Toast w działaniu.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
źródło