To mnie zaskoczyło, korzystałem z tego w zestawie SDK Androida 2.1-r8:
ProgressDialog.show(getApplicationContext(), ....);
a także w
Toast t = Toast.makeText(getApplicationContext(),....);
używanie getApplicationContext()
awarii zarówno ProgressDialog
i Toast
...., które doprowadziły mnie do tego pytania:
Jakie są rzeczywiste różnice między kontekstem działania a kontekstem aplikacji, pomimo wspólnego sformułowania „Kontekst”?
android
android-context
t0mm13b
źródło
źródło
Odpowiedzi:
Oba są wystąpieniami kontekstu , ale wystąpienie aplikacji jest powiązane z cyklem życia aplikacji, podczas gdy wystąpienie działania jest powiązane z cyklem życia działania. Dzięki temu mają dostęp do różnych informacji o środowisku aplikacji.
Jeśli czytasz dokumenty w getApplicationContext , zauważa, że powinieneś używać tego tylko, jeśli potrzebujesz kontekstu, którego cykl życia jest inny niż bieżący kontekst. Nie dotyczy to żadnego z twoich przykładów.
Kontekst działania prawdopodobnie zawiera pewne informacje o bieżącym działaniu, które są niezbędne do wykonania tych połączeń. Jeśli wyświetli się dokładny komunikat o błędzie, być może uda się wskazać, czego dokładnie potrzebuje.
Ale ogólnie używaj kontekstu aktywności, chyba że masz dobry powód, aby tego nie robić.
źródło
getApplicationContext
, co ciekawe, kiedy zmieniłem nathis
, nie zawiesił się i nie działał zgodnie z oczekiwaniami ... więc jeśli oba są wystąpieniami kontekstu, dlaczego nie działa i drugi robi? Te informacje będą pomocne dla innych Mam nadzieję ... :) dzięki za szybką odpowiedź ...Uważam, że ta tabela jest bardzo przydatna przy podejmowaniu decyzji, kiedy używać różnych typów kontekstów:
Oryginalny artykuł tutaj .
źródło
Jest to oczywiście brak projektu interfejsu API. Po pierwsze, kontekst działania i kontekst aplikacji są całkowicie różnymi obiektami, więc parametry metody, w których stosuje się kontekst, powinny używać bezpośrednio
ApplicationContext
lubActivity
zamiast kontekstu klasy nadrzędnej. Po drugie, dokument powinien określać, którego kontekstu użyć, czy nie jawnie.źródło
Myślę, że jest
ProgressDialog
to związane z działaniem, które się podpiera,ProgressDialog
ponieważ okno dialogowe nie może pozostać po zniszczeniu działania, więc musi zostać przekazanethis
(ActivityContext), które również zostaje zniszczone przez działanie, podczas gdy ApplicationContext pozostaje nawet po tym, jak działanie zostanie pobrane zniszczony.źródło
Użyj getApplicationContext (), jeśli potrzebujesz czegoś powiązanego z kontekstem, który sam będzie miał zasięg globalny.
Jeśli użyjesz działania, nowa instancja działania będzie zawierała odwołanie, które zawiera niejawne odwołanie do starego działania, a starego działania nie można wyrzucać.
źródło
Myślę, że kiedy wszystko potrzebuje ekranu do wyświetlenia (przycisk, okno dialogowe, układ ...) musimy użyć działania kontekstu i wszystko nie potrzebuje ekranu do wyświetlenia lub przetworzenia (toast, telefon służbowy, kontakt ...) mógłby użyć kontekstu aplikacji
źródło
Możesz zobaczyć różnicę między tymi dwoma kontekstami, gdy uruchamiasz aplikację bezpośrednio z ekranu głównego, a kiedy aplikacja jest uruchamiana z innej aplikacji poprzez zamiar udostępniania.
Oto praktyczny przykład tego, co oznaczają „niestandardowe zachowania stosu wstecznego”, wspomniane przez @CommonSenseCode:
Załóżmy, że masz dwie aplikacje, które komunikują się ze sobą, App1 i App2 .
Uruchom App2: MainActivity z programu uruchamiającego. Następnie z MainActivity uruchom App2: SecondaryActivity . Tam, używając kontekstu działania lub kontekstu aplikacji, obie aktywności działają w tym samym zadaniu i jest to w porządku (biorąc pod uwagę, że używasz wszystkich standardowych trybów uruchamiania i flag intencji). Możesz wrócić do MainActivity, naciskając wstecz, aw najnowszych aplikacjach masz tylko jedno zadanie.
Załóżmy teraz, że jesteś w App1 i uruchom App2: MainActivity z intencją udostępniania (ACTION_SEND lub ACTION_SEND_MULTIPLE). Następnie spróbuj uruchomić App2: SecondaryActivity (zawsze ze wszystkimi standardowymi trybami uruchamiania i flagami intencji). Co się dzieje to:
jeśli uruchomisz App2: SecondaryActivity z kontekstem aplikacji na Androidzie <10 , nie możesz uruchomić wszystkich działań w tym samym zadaniu . Próbowałem z Androidem 7 i 8, a SecondaryActivity jest zawsze uruchamiane w nowym zadaniu (chyba dlatego, że App2: SecondaryActivity jest uruchamiany z kontekstem aplikacji App2, ale pochodzisz z App1 i nie uruchomiłeś aplikacji App2 bezpośrednio Być może pod maską android rozpozna to i użyje FLAG_ACTIVITY_NEW_TASK). Może to być dobre lub złe w zależności od potrzeb, ponieważ moja aplikacja była zła.
Na Androidzie 10 aplikacja ulega awarii z komunikatem
„Wywołanie startActivity () spoza kontekstu działania wymaga flagi FLAG_ACTIVITY_NEW_TASK. Czy to naprawdę tego chcesz?” .
Aby więc działało na Androidzie 10, musisz użyć FALG_ACTIVITY_NEW_TASK i nie możesz uruchomić wszystkich działań w tym samym zadaniu.
Jak widać, zachowanie różni się w zależności od wersji Androida, dziwne.
jeśli uruchomisz App2: SecondaryActivity z kontekstem działania, wszystko pójdzie dobrze i możesz uruchomić wszystkie działania w tym samym zadaniu, co spowoduje liniową nawigację po plecach.
Mam nadzieję, że dodałem kilka użytecznych informacji
źródło