Jaka jest różnica między getContext()
, getApplicationContext()
, getBaseContext()
, i " this
„?
Chociaż jest to proste pytanie, nie jestem w stanie zrozumieć podstawowej różnicy między nimi. Proszę podać kilka prostych przykładów, jeśli to możliwe.
android
this
android-context
iCurious
źródło
źródło
Odpowiedzi:
View.getContext()
: Zwraca kontekst, w którym widok jest obecnie uruchomiony. Zwykle aktywna aktywność.Activity.getApplicationContext()
: Zwraca kontekst dla całej aplikacji (proces, w którym działają wszystkie działania). Użyj tego zamiast bieżącego kontekstu działania, jeśli potrzebujesz kontekstu związanego z cyklem życia całej aplikacji, a nie tylko bieżącego działania.ContextWrapper.getBaseContext()
: Jeśli potrzebujesz dostępu do kontekstu z innego kontekstu, użyj ContextWrapper. Dostęp do kontekstu, do którego odwołuje się ten ContextWrapper, jest uzyskiwany za pośrednictwem getBaseContext ().źródło
this
igetContext()
nie zawsze są takie same, np. w klasie Activity, możesz użyć,this
ponieważActivity
dziedziczy,Context
ale metodagetContext()
nie jest wActivity
klasie. @mikedroid @KCRajuWiększość odpowiedzi już pokryć
getContext()
igetApplicationContext()
ale getBaseContext () jest rzadko wyjaśnione.Ta metoda
getBaseContext()
jest ważna tylko wtedy, gdy maszContextWrapper
. Android zapewniaContextWrapper
klasę utworzoną wokół istniejącejContext
za pomocą:Zaletą używania a
ContextWrapper
jest to, że pozwala „modyfikować zachowanie bez zmiany oryginalnego kontekstu”. Na przykład, jeśli masz aktywność o nazwie,myActivity
możesz utworzyćView
z innym motywem niżmyActivity
:ContextWrapper
jest naprawdę potężny, ponieważ pozwala zastąpić większość funkcji oferowanych przezContext
tym kod dostępu do zasobów (npopenFileInput()
,getString()
), interakcje z innymi składnikami (npsendBroadcast()
,registerReceiver()
), żądania uprawnienia (npcheckCallingOrSelfPermission()
) i lokalizacje rozwiązywania systemie plików (npgetFilesDir()
).ContextWrapper
jest naprawdę przydatny do obejścia problemów specyficznych dla urządzenia / wersji lub zastosowania jednorazowych dostosowań do komponentów takich jak Widoki, które wymagają kontekstu.Metodę getBaseContext () można wykorzystać do uzyskania dostępu do „podstawowego” kontekstu, który jest
ContextWrapper
zawijany. Konieczne może być uzyskanie dostępu do kontekstu „podstawowego”, jeśli chcesz na przykład sprawdzić, czy jest toService
,Activity
czyApplication
:Lub jeśli chcesz wywołać „nieopakowaną” wersję metody:
źródło
ContextWrapper
jest jedną z najgorszych decyzji, jakie kiedykolwiek podjęli twórcy frameworka Android. Kiedy zdali sobie sprawę, że stworzyli całą rodzinę Boskich Przedmiotów, zamiast zrobić właściwą rzecz i zmienić kod na Pojedynczą Odpowiedzialność, dodali brzydkiego hacka, który pozwolił zmienić zachowanie Kontekstu poprzez pogłębienie drzewa dziedziczenia. Zła inżynieria oprogramowania w najbrzydszym stanie. Jeśli chodzi o nas, programistów, IMHO nikt nigdy nie powinien używaćgetBaseContext()
aniContextWrapper
. Jeśli tak, to ogromny zapach kodu.CustomToast
kod. ) :)))źródło
Pytanie „czym jest kontekst” jest jednym z najtrudniejszych pytań we wszechświecie Androida.
Kontekst definiuje metody dostępu do zasobów systemowych, pobierania statycznych zasobów aplikacji, sprawdzania uprawnień, wykonywania operacji interfejsu użytkownika i wielu innych. Zasadniczo
Context
jest przykładem anty-wzoru God Object w produkcji.Jeśli chodzi o to, jakiego rodzaju
Context
powinniśmy użyć, staje się bardzo skomplikowane, ponieważ z wyjątkiem bycia Bogiem Obiektem drzewo hierarchiiContext
podklas brutalnie narusza Zasadę podstawienia Liskowa.Ten post na blogu próbuje podsumować
Context
zastosowanie klas w różnych sytuacjach.Pozwól mi skopiować główną tabelę z tego postu dla kompletności:
źródło
Context
dostarcza informacji oActvity
lubApplication
do nowo utworzonych elementów.Odpowiednie informacje
Context
należy podać w nowo utworzonych komponentach (niezależnie od tego, czy kontekst aplikacji czy kontekst działania)Ponieważ
Activity
jest to podklasaContext
, można użyćthis
do uzyskania kontekstu tego działaniaźródło
Z tego dokumentu
Zrozumiałem, że powinieneś użyć:
źródło
getApplicationContext ()
getContext () i getBaseContext ()
to
źródło
A
Context
to:źródło