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);
Author: Brian Tompsett - 汤莱恩, 2012-04-27

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.

  1. zastosowanie Context
  2. 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.

 221
Author: waqaslam,
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 another Context".

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().

 26
Author: AlexR,
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..

 6
Author: ngesh,
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

 0
Author: chandrakant Chaturvedi,
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