różnica i kiedy użyć getApplication (), getApplicationContext (), getBaseContext () i someClass.to
Jestem nowy w Androidzie i staram się zrozumieć różnicę między getApplication()
, getApplicationContext(
), getBaseContext()
, getContext()
i someClass.this
, a zwłaszcza kiedy należy używać tych metod w następujących liniach kodu:
Kiedy wznoszę toast jaka jest różnica między tymi i w 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);
4 answers
Toast i Intent , oba wymagają odniesienia do kontekstu. I getApplication, getapplicationkontekst, LoginActivity.to i getBaseContext , wszystkie oferują odniesienie do kontekstu.
Teraz rzeczą mylącą jest deklaracja różnych kontekstów i ich specyficznego użycia. Aby wszystko było proste, należy policzyć dwa typy kontekstu dostępne w ramach Androida.
- zastosowanie Context
- Kontekst Aktywności
Application kontekst jest dołączony do cyklu życia aplikacji i zawsze będzie taki sam przez cały okres użytkowania aplikacji. Więc jeśli używasz Toast , możesz użyć kontekstu aplikacji, a nawet kontekstu aktywności (obu), ponieważ toast może być podniesiony z dowolnego miejsca w aplikacji i nie jest dołączony do okna.
Aktywność kontekst jest dołączony do cyklu życia aktywności i może zostać zniszczony, jeśli aktywność onDestroy()
jest podniesiona. Jeśli chcesz uruchomić nową aktywność, musisz użyć kontekstu aktywności w jej intencji , aby nowa aktywność była połączona z bieżącą aktywnością (pod względem stosu aktywności). Możesz jednak użyć kontekstu aplikacji do uruchomienia nowej aktywności, ale następnie musisz ustawić flagę Intent.FLAG_ACTIVITY_NEW_TASK
w celu potraktowania jej jako nowego zadania.
teraz odnosząc się do Twoich spraw:
LoginActivity.this
choć odnosi się do własnej klasy, która rozszerza klasę Activity, ale klasa bazowa (Activity) rozszerza również klasę Context, więc może być używana do oferowania kontekstu activity.
getApplication()
chociaż odnosi się do obiektu aplikacji, ale Klasa aplikacji rozszerza klasę Context, więc może być używana do oferowania kontekstu aplikacji.
getApplicationContext()
oferuje kontekst aplikacji.
getBaseContext()
oferuje kontekst aktywności.
porady: gdy trzeba manipulować
Views
to idź do Activity-Context, else Application-Context wystarczy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-24 14:09:56
Odpowiedź Waqasa jest bardzo jasna i kompletna, jednak chciałbym jeszcze bardziej wyjaśnić różnicę między używaniem this
vs. getBaseContext()
, lub getApplication()
vs. getApplicationContext()
. Zarówno Activity
jak i Application
rozciągają się nie Context
, lecz ContextWrapper
, czyli
"Proxying implementation of
Context
that simply delegates all of its calls to anotherContext
".
Ten "prawdziwy" kontekst jest tym, co otrzymujesz za pomocą getBaseContext()
.
Więc chociaż this
(dla Activity
) i getBaseContext()
oba dają aktywność context, they
- (a) nie odnoszą się do tego samego obiektu (
this != getBaseContext()
) i - (b) wywołanie kontekstu przez
this
jest nieco mniej efektywne, ponieważ wywołania przechodzą przez dodatkowy poziom indrection. Wątpię, żeby to miało jakąś praktyczną różnicę.
Ta sama logika dotyczy getApplication()
vs. getApplicationContext()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-17 20:16:17
LoginActivity.this
Powyższa linia jest działaniem, które jest obeveously kontekstem.. jest to używane podczas tworzenia niektórych AlertDialogs... W niektórych miejscach obowiązkowe jest używanie kontekstu aktywności...
getApplication()
To samo tutaj metoda make text wymaga kontekstu, a sama aplikacja implementuje Context
getApplicationContext()
Jest to najbardziej preferowany sposób, ponieważ ta Context
żyje, dopóki aplikacja nie zostanie zamknięta.
getBaseContext()
Ten kontekst jest dostępny dla widżetów i widoków..
Ale wszystkie one dają kontekst obiekt i nic więcej..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-27 08:32:10
Klasa.jest to używane, jeśli twoja klasa rozszerza aktywność getapplication () używana Referer application i aplikacja rozszerza kontekst aplikacji getbasecontext () referuje kontekst Twojej aktywności kontekst zapoznaj się z kontekstem cyklu życia Twojej aktywności applicationcontext odnoszą się do cyklu życia aplikacji
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-24 05:30:41