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.

Author: N J, 2012-05-17

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

 462
Author: Alexander 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
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();
    }
  }
}
 57
Author: Mike Laren,
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.

 38
Author: Jay Patel,
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

 28
Author: tez,
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               |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
  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 zazwyczaj nie jest to zalecane lub uznane za dobre praktyki.
  2. 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.
  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.

- zrzut ekranu

 13
Author: Vasiliy,
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

Fragment diagramu UML kontekstu

Tutaj wpisz opis obrazka

 4
Author: yoAlex5,
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

 1
Author: mehmet,
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.

 1
Author: Jatin Bansal,
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