Różnica między kontekstem aktywności a kontekstem aplikacji

To mnie zaskoczyło, używałem tego w Android 2.1-R8 SDK:

ProgressDialog.show(getApplicationContext(), ....);

A także w

Toast t = Toast.makeText(getApplicationContext(),....);

Użycie getApplicationContext() powoduje awarie zarówno ProgressDialog, jak i Toast .... które prowadzą mnie do tego pytania:

Jakie są rzeczywiste różnice między kontekstem działania a kontekstem aplikacji, pomimo dzielenia się sformułowaniem "kontekst"?

Author: Brian Tompsett - 汤莱恩, 2010-11-09

7 answers

Oba są instancjami kontekstu, ale instancja aplikacji jest powiązana z cyklem życia aplikacji, podczas gdy instancja aktywności jest powiązana z cyklem życia aktywności. Dzięki temu mają dostęp do różnych informacji o środowisku aplikacji.

Jeśli czytasz dokumenty pod adresem getApplicationContext zauważa, że powinieneś używać tego kontekstu tylko wtedy, gdy potrzebujesz kontekstu, którego cykl życia jest oddzielony od bieżącego kontekstu. Nie dotyczy to żadnego z Twoich przykłady.

Kontekst aktywności prawdopodobnie zawiera pewne informacje o bieżącej aktywności, które są niezbędne do zakończenia tych wywołań. Jeśli pokażesz dokładny komunikat o błędzie, może być w stanie wskazać, czego dokładnie potrzebuje.

Ale ogólnie, używaj kontekstu aktywności, chyba że masz dobry powód, aby tego nie robić.

 206
Author: Cheryl Simon,
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
2010-11-08 22:33:52

Uważam, że ta tabela jest bardzo przydatna przy podejmowaniu decyzji, kiedy używać różnych kontekstów:

Tutaj wpisz opis obrazka

  1. Aplikacja może rozpocząć działanie stąd, ale wymaga utworzenia nowego zadania. Może to pasować do konkretnych przypadków użycia, ale może tworzyć niestandardowe zachowania stosu wstecznego w aplikacji i na ogół nie jest to zalecane lub uważane za dobrą praktykę.
  2. to jest legalne, ale inflacja zostanie wykonana z domyślnym motywem dla systemu, na którym ty są uruchomione, a nie zdefiniowane w aplikacji.
  3. dozwolone, jeśli odbiornik ma wartość null, która jest używana do uzyskania bieżącej wartości lepkiej transmisji, na Androidzie 4.2 i nowszych.

Oryginalny artykuł tutaj .

 117
Author: commonSenseCode,
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
2016-11-25 13:58:52

Jest to oczywiście niedobór projektu API. Po pierwsze, kontekst aktywności i kontekst aplikacji są zupełnie innymi obiektami, więc parametry metody, w której używany jest kontekst, powinny używać bezpośrednio ApplicationContext lub Activity, zamiast używać kontekstu klasy nadrzędnej. Po drugie, dokument powinien określać, którego kontekstu użyć, a którego nie używać.

 23
Author: lucas,
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
2014-06-30 09:52:52

Myślę, że powodem jest to, że ProgressDialog jest dołączone do aktywności, która wspiera ProgressDialog, ponieważ okno dialogowe nie może pozostać po zniszczeniu aktywności, więc musi zostać przekazane this (ActivityContext), które również zostanie zniszczone wraz z aktywnością, podczas gdy ApplicationContext pozostaje nawet po zniszczeniu aktywności.

 11
Author: user2779311,
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-11-11 10:59:52

Myślę, że gdy wszystko wymaga wyświetlenia ekranu (przycisk, okno, układ...) musimy korzystać z aktywności kontekstowej, a wszystko nie wymaga ekranu do wyświetlania lub przetwarzania (toast, telefon serwisowy,kontakt...) we could use a application context

 1
Author: Dmobile,
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-04 06:03:44

Nie można wyświetlić okna/okna aplikacji w kontekście, który nie jest aktywnością. Spróbuj przekazać poprawne odniesienie do aktywności

 0
Author: Xar E Ahmer,
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-07-09 12:06:10

Użyj getApplicationContext (), jeśli potrzebujesz czegoś związanego z kontekstem, który sam będzie miał zasięg globalny.

Jeśli używasz Activity, wtedy nowa instancja Activity będzie miała odniesienie, które ma ukryte odniesienie do starej aktywności, a stara aktywność nie może zostać usunięta.

 0
Author: Dhiraj Himani,
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
2016-03-04 05:59:44