Różnica między getContext (), getApplicationContext (), getBaseContext () i " this"
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.
8 answers
View.getContext()
: zwraca kontekst, w którym widok jest aktualnie uruchomiony. Zazwyczaj jest to aktualnie aktywna aktywność.Activity.getApplicationContext()
: zwraca kontekst dla całej aplikacji (proces, w którym są uruchomione wszystkie działania z). Użyj tego zamiast kontekstu bieżącej aktywności, jeśli potrzebujesz kontekst związany z cyklem życia całej aplikacji, a nie tylko aktualna aktywność.ContextWrapper.getBaseContext()
: Jeśli potrzebujesz dostępu do kontekstu z innego kontekstu korzystasz z programu ContextWrapper. Na Kontekst, do którego odwołuje się z wnętrza tego programu ContextWrapper, jest dostępny za pośrednictwem getBaseContext().
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-04-01 15:10:06
Większość odpowiedzi obejmuje już getContext()
i getApplicationContext()
, ale getBaseContext() jest rzadko wyjaśniane.
Metoda getBaseContext()
ma znaczenie tylko wtedy, gdy masz ContextWrapper
.
Android udostępnia klasę ContextWrapper
, która jest tworzona wokół istniejącej Context
używając:
ContextWrapper wrapper = new ContextWrapper(context);
Zaletą używania ContextWrapper
jest to, że pozwala "modyfikować zachowanie bez zmiany pierwotnego kontekstu". Na przykład, jeśli masz aktywność o nazwie myActivity
, możesz utworzyć View
z innym motywem niż myActivity
:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
jest naprawdę potężny, ponieważ pozwala zastąpić większość funkcji dostarczanych przez Context
, w tym kod dostępu do zasobów (np. openFileInput()
, getString()
), współdziałać z innymi komponentami (np. sendBroadcast()
, registerReceiver()
), żądania uprawnień (np. checkCallingOrSelfPermission()
) i rozwiązywania lokalizacji systemu plików (np. getFilesDir()
). {[7] } jest naprawdę przydatny do obejścia problemów związanych z urządzeniem/wersją lub do jednorazowego dostosowania komponentów, takich jak widoki, które wymagają kontekstu.
Metoda getBaseContext () może być użyty do uzyskania dostępu do kontekstu "bazowego", wokół którego zawija się ContextWrapper
. Być może będziesz musiał uzyskać dostęp do kontekstu "podstawowego", jeśli na przykład musisz sprawdzić, czy jest to Service
, Activity
lub Application
:
public class CustomToast {
public void makeText(Context context, int resId, int duration) {
while (context instanceof ContextWrapper) {
context = context.baseContext();
}
if (context instanceof Service)) {
throw new RuntimeException("Cannot call this from a service");
}
...
}
}
Lub jeśli chcesz wywołać wersję "unwrapped"metody:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}
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-02-13 18:24:07
GetApplicationContext () - zwraca kontekst dla wszystkich działań uruchomionych w aplikacji.
GetBaseContext() - Jeśli chcesz uzyskać dostęp do kontekstu z innego kontekstu w aplikacji, możesz uzyskać dostęp.
GetContext () - zwraca tylko bieżącą bieżącą aktywność w widoku kontekstowym.
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-03-31 06:50:31
Context
dostarcza informacje o Actvity
lub Application
do nowo utworzonych komponentów.
Odpowiednie Context
powinny być dostarczone do nowo utworzonych komponentów (czy to kontekstu aplikacji, czy kontekstu aktywności)
Ponieważ Activity
jest podklasą Context
, można użyć this
, aby uzyskać kontekst tej aktywności
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
2013-03-02 13:28:01
Pytanie "Jaki jest kontekst" jest jednym z najtrudniejszych pytań w uniwersum Androida.
Kontekst definiuje metody, które uzyskują dostęp do zasobów systemowych, odzyskują zasoby statyczne aplikacji, sprawdzają uprawnienia, wykonują manipulacje UI i wiele innych. W istocie, Context
jest przykładem Boga obiektu anty-wzór w produkcji.
Jeśli chodzi o to, jakiego rodzaju {[1] } powinniśmy użyć, staje się to bardzo skomplikowane, ponieważ poza byciem obiektem Boga, drzewo hierarchii Context
podklasy brutalnie naruszają zasadę substytucji Liskowa.
Ten wpis na blogu próbuje podsumować Context
przydatność klas w różnych sytuacjach.
Pozwól mi skopiować główną tabelę z tego posta dla kompletności:
+----------------------------+-------------+----------+---------+-----------------+-------------------+ | | Application | Activity | Service | ContentProvider | BroadcastReceiver | +----------------------------+-------------+----------+---------+-----------------+-------------------+ | Show a Dialog | NO | YES | NO | NO | NO | | Start an Activity | NO¹ | YES | NO¹ | NO¹ | NO¹ | | Layout Inflation | NO² | YES | NO² | NO² | NO² | | Start a Service | YES | YES | YES | YES | YES | | Bind to a Service | YES | YES | YES | YES | NO | | Send a Broadcast | YES | YES | YES | YES | YES | | Register BroadcastReceiver | YES | YES | YES | YES | NO³ | | Load Resource Values | YES | YES | YES | YES | YES | +----------------------------+-------------+----------+---------+-----------------+-------------------+
- 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 zazwyczaj nie jest to zalecane lub uznane za dobre praktyki.
- to jest legalne, ale inflacja zostanie wykonana z domyślnym motywem dla systemu, na którym jesteś uruchomiony, a nie tym, co jest zdefiniowane w Twojej aplikacji.
- 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.
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-09 10:52:00
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
2018-06-12 09:46:02
From this docs
Zrozumiałem, że powinieneś używać:
Spróbuj użyć context-application zamiast context-activity
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-04-15 06:54:34
Getapplicationkontekst()
Jest to używane na poziomie aplikacji i odnosi się do wszystkich działań.
GetContext () i getBaseContext()
To najprawdopodobniej to samo .są one odbierane tylko bieżącej działalności, która jest na żywo.
This
Jest zawsze obiektem bieżącej klasy.
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-08-11 11:46:13