Unterschied zwischen getContext() , getApplicationContext() , getBaseContext() und “this”

Lesezeit: 6 Minuten

Unterschied zwischen getContext getApplicationContext getBaseContext und this
iNeugierig

Was ist der Unterschied zwischen getContext() , getApplicationContext() , getBaseContext() und “this“?

Obwohl dies eine einfache Frage ist, kann ich den grundlegenden Unterschied zwischen ihnen nicht verstehen. Bitte geben Sie, wenn möglich, einige einfache Beispiele.

  • Die erste Antwort enthält eine hervorragende Beschreibung: stackoverflow.com/questions/1026973/…

    – ky1enamisch

    17. Mai 2012 um 18:10 Uhr

  • Mögliches Duplikat von Was ist der Unterschied zwischen den verschiedenen Methoden, um einen Kontext zu erhalten?

    – Ein Droide

    28. August 2017 um 21:18 Uhr

1646667792 221 Unterschied zwischen getContext getApplicationContext getBaseContext und this
Alexander Lukas

  • View.getContext(): Gibt den Kontext zurück, in dem die Ansicht derzeit ausgeführt wird. Normalerweise die derzeit aktive Aktivität.

  • Activity.getApplicationContext(): Gibt den Kontext für die gesamte Anwendung zurück (den Prozess, in dem alle Aktivitäten ausgeführt werden). Verwenden Sie dies anstelle des aktuellen Aktivitätskontexts, wenn Sie einen Kontext benötigen, der an den Lebenszyklus der gesamten Anwendung und nicht nur an die aktuelle Aktivität gebunden ist.

  • ContextWrapper.getBaseContext(): Wenn Sie Zugriff auf einen Kontext aus einem anderen Kontext heraus benötigen, verwenden Sie einen ContextWrapper. Auf den Kontext, auf den innerhalb dieses ContextWrappers verwiesen wird, wird über getBaseContext() zugegriffen.

  • +Cool i3oY dasselbe mit getContext

    – Mikey

    9. November 2012 um 8:38 Uhr

  • Eigentlich bin ich verwirrt, was die richtige Definition des Kontexts ist?

    – Ravi

    16. Januar 2013 um 11:04 Uhr

  • “this” und getContext() sind beide gleich

    – KCRaju

    24. August 2013 um 1:18 Uhr


  • this und getContext() nicht immer gleich sind, z. B. in der Aktivitätsklasse, können Sie verwenden this da Activity erbt von Context sondern Methode getContext() ist nicht dabei Activity Klasse. @mikedroid @KCRaju

    – Nadan

    7. Mai 2015 um 15:17 Uhr

  • this gibt eine Instanz der Klasse an, in der es sich befindet, wobei es sich um eine beliebige Klasse handeln kann, nicht unbedingt um einen Kontext. Wenn Sie es in einer Aktivitätsklasse verwenden, dann this wird eine Instanz von a sein Context.

    – LarsH

    2. Juli 2015 um 17:29 Uhr

Die meisten Antworten decken bereits ab getContext() und getApplicationContext() aber getBaseContext() wird selten erklärt.

Die Methode getBaseContext() ist nur relevant, wenn Sie eine haben ContextWrapper. Android bietet eine ContextWrapper Klasse, die um eine vorhandene herum erstellt wird Context mit:

ContextWrapper wrapper = new ContextWrapper(context);

Der Vorteil der Verwendung von a ContextWrapper ist, dass Sie damit „das Verhalten ändern können, ohne den ursprünglichen Kontext zu ändern“. Zum Beispiel, wenn Sie eine Aktivität mit dem Namen haben myActivity dann kann ein erstellen View mit einem anderen Thema als myActivity:

ContextWrapper customTheme = new ContextWrapper(myActivity) {
  @Override
  public Resources.Theme getTheme() { 
    return someTheme;
  }
}
View myView = new MyView(customTheme);

ContextWrapper ist wirklich leistungsfähig, weil Sie damit die meisten Funktionen überschreiben können, die von bereitgestellt werden Context einschließlich Code für den Zugriff auf Ressourcen (z openFileInput(), getString()), interagieren mit anderen Komponenten (z sendBroadcast(), registerReceiver()), fordert Berechtigungen an (z checkCallingOrSelfPermission()) und das Auflösen von Dateisystemspeicherorten (z getFilesDir()). ContextWrapper ist wirklich nützlich, um geräte-/versionsspezifische Probleme zu umgehen oder um einmalige Anpassungen auf Komponenten wie Ansichten anzuwenden, die einen Kontext erfordern.

Die Methode getBaseContext() kann verwendet werden, um auf den „Basis“-Kontext zuzugreifen, den die ContextWrapper umschlingt. Möglicherweise müssen Sie auf den „Basis“-Kontext zugreifen, wenn Sie beispielsweise überprüfen müssen, ob es sich um eine Service, Activity oder 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");
    }
    ...
  }
}

Oder wenn Sie die „ausgepackte“ Version einer Methode aufrufen müssen:

class MyCustomWrapper extends ContextWrapper {
  @Override
  public Drawable getWallpaper() {
    if (BuildInfo.DEBUG) {
      return mDebugBackground;
    } else {
      return getBaseContext().getWallpaper();
    }
  }
}

  • Ich würde sagen, das ist die wichtigste Antwort nach einer akzeptierten.

    – 0bein

    31. März 2017 um 8:21 Uhr

  • Ich würde sagen, dass die Existenz von ContextWrapper ist eine der schlechtesten Entscheidungen, die jemals von Entwicklern des Android-Frameworks getroffen wurden. Als sie erkannten, dass sie eine ganze Familie von Gottobjekten erstellt hatten, fügten sie einen hässlichen Hack hinzu, der es ermöglichte, das Kontextverhalten durch Vertiefung des Vererbungsbaums zu ändern, anstatt das Richtige zu tun und den Code in Richtung Single Responsibility umzugestalten. Schlechtes Software-Engineering in seiner hässlichsten Form. Was uns Entwickler betrifft, sollte IMHO niemand jemals verwenden getBaseContext() oder ContextWrapper. Wenn Sie dies tun – es ist ein riesiger “Code-Geruch”.

    – Wassilij

    23. November 2017 um 16:53 Uhr

  • Ich möchte das komplette sehen CustomToast Code. THANKS:)))

    – Alston

    29. September 2019 um 4:34 Uhr

  • Vielen Dank für diese Antwort, mir war nicht bewusst, dass ContextWrapper so verwendet werden sollte!! Ich dachte immer, es wäre etwas Internes vom Android-Team. In meinem Sinne ist dies die erwartete Antwort. DANKE !!!

    – Bawender Yandra

    2. Juli 2020 um 17:27 Uhr

Unterschied zwischen getContext getApplicationContext getBaseContext und this
Wassilij

Die Frage „What the Context is“ ist eine der schwierigsten Fragen im Android-Universum.

Kontext definiert Methoden, die auf Systemressourcen zugreifen, statische Assets der Anwendung abrufen, Berechtigungen prüfen, UI-Manipulationen durchführen und vieles mehr. Im Wesentlichen, Context ist ein Beispiel für God Object Anti-Pattern in der Produktion.

Wenn es um welche Art geht Context sollten wir verwenden, wird es sehr kompliziert, denn abgesehen davon, dass es Gottobjekt ist, ist der Hierarchiebaum von Context Unterklassen verletzt das Liskov-Substitutionsprinzip brutal.

Dieser Blogbeitrag (jetzt von Wayback Machine) versucht zusammenzufassen Context Klassen Anwendbarkeit in verschiedenen Situationen.

Lassen Sie mich der Vollständigkeit halber die Haupttabelle aus diesem Beitrag kopieren:

+----------------------------+-------------+----------+---------+-----------------+-------------------+
|                            | 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. Eine Anwendung KANN von hier aus eine Aktivität starten, erfordert jedoch, dass eine neue Aufgabe erstellt wird. Dies kann für bestimmte Anwendungsfälle geeignet sein, kann jedoch zu einem nicht standardmäßigen Backstack-Verhalten in Ihrer Anwendung führen und wird im Allgemeinen nicht empfohlen oder als bewährte Methode angesehen.
  2. Dies ist legal, aber die Inflation wird mit dem Standarddesign für das System durchgeführt, auf dem Sie ausgeführt werden, und nicht mit dem, was in Ihrer Anwendung definiert ist.
  3. Zulässig, wenn der Empfänger null ist, was zum Abrufen des aktuellen Werts einer Sticky-Übertragung unter Android 4.2 und höher verwendet wird.

Bildschirmfoto

1646667794 88 Unterschied zwischen getContext getApplicationContext getBaseContext und this
Jaykumar Patel

getApplicationContext() – Gibt den Kontext für alle Aktivitäten zurück, die in der Anwendung ausgeführt werden.

getBaseContext() – Wenn Sie von einem anderen Kontext innerhalb der Anwendung auf Kontext zugreifen möchten, können Sie darauf zugreifen.

getContext() – Gibt in der Kontextansicht nur die aktuelle laufende Aktivität zurück.

Context gibt Auskunft über die Actvity oder Application zu neu erstellten Komponenten.

Relevant Context sollen neu erstellten Komponenten bereitgestellt werden (egal ob Anwendungskontext oder Aktivitätskontext)

Seit Activity ist eine Unterklasse von Contextkann man verwenden this um den Kontext dieser Aktivität zu erhalten

1646667795 700 Unterschied zwischen getContext getApplicationContext getBaseContext und this
Jatin Bansal

getApplicationContext()

dies wird für die Anwendungsebene verwendet und bezieht sich auf alle Aktivitäten.

getContext() und getBaseContext()

ist höchstwahrscheinlich gleich. Diese beziehen sich nur auf aktuelle Aktivitäten, die live sind.

Das

bezieht sich immer auf das aktuelle Klassenobjekt.

1646667796 413 Unterschied zwischen getContext getApplicationContext getBaseContext und this
Abole

this: aktuelles Klassenobjekt

getContext(): Gibt den Kontext für die aktuelle Live-Aktivität zurück

getApplicationContext(): gibt alle Aktivitäten zurück, die in der Anwendung ausgeführt werden

967370cookie-checkUnterschied zwischen getContext() , getApplicationContext() , getBaseContext() und “this”

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy