Unterschied und wann getApplication (), getApplicationContext (), getBaseContext () und someClass.this verwendet werden sollen


121

Ich bin neu in Android und ich versuche , den Unterschied zwischen zu verstehen getApplication(), getApplicationContext() getBaseContext(), getContext()und someClass.thisinsbesondere dann , wenn die diesen Methoden in den folgenden Codezeilen verwenden:

Wenn ich einen Toast starte, was ist der Unterschied zwischen diesen und in welchen Fällen verwende ich sie?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

Gleiches gilt für Absichten:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);


Sie behandeln nur den Kontext und baseContext. aber ich möchte alle ihre Verwendungen in den 2 Kontexten verstehen. danke
Pheonix7

Antworten:


215

Toast und Intent erfordern beide einen Verweis auf den Kontext . Und getApplication , getApplicationContext , LoginActivity.this und getBaseContext bieten alle Verweise auf den Kontext.

Verwirrend ist nun die Deklaration verschiedener Kontexte und deren spezifische Verwendung. Zur Vereinfachung sollten Sie zwei im Android-Framework verfügbare Kontexttypen zählen.

  1. Anwendungskontext
  2. Aktivitätskontext

Der Anwendungskontext ist an den Lebenszyklus der Anwendung gebunden und bleibt während der gesamten Lebensdauer der Anwendung gleich. Wenn Sie also Toast verwenden , können Sie den Anwendungskontext oder sogar den Aktivitätskontext (beide) verwenden, da ein Toast von überall in Ihrer Anwendung ausgelöst werden kann und nicht an ein Fenster angehängt ist.

Der Aktivitätskontext hängt mit dem Lebenszyklus der Aktivität zusammen und kann zerstört werden, wenn die Aktivität ausgelöst onDestroy()wird. Wenn Sie eine neue Aktivität starten möchten, müssen Sie den Kontext der Aktivität in ihrer Absicht verwenden, damit die neue Startaktivität mit der aktuellen Aktivität verbunden ist (in Bezug auf den Aktivitätsstapel). Sie können jedoch auch den Kontext der Anwendung verwenden, um eine neue Aktivität zu starten. Anschließend müssen Sie das Flag setzen Intent.FLAG_ACTIVITY_NEW_TASK, um sie als neue Aufgabe zu behandeln.

Beziehen Sie sich nun auf Ihre Fälle:

LoginActivity.this Es bezieht sich zwar auf Ihre eigene Klasse, die die Aktivitätsklasse erweitert, aber die Basisklasse (Aktivität) erweitert auch die Kontextklasse, sodass sie zum Anbieten von Aktivitätskontext verwendet werden kann.

getApplication() Es bezieht sich zwar auf das Anwendungsobjekt, aber die Anwendungsklasse erweitert die Kontextklasse, sodass sie zum Anbieten des Anwendungskontexts verwendet werden kann.

getApplicationContext() bietet Anwendungskontext.

getBaseContext() bietet Aktivitätskontext.

Tipps: Wenn Sie manipulieren , müssen Viewsdann für Activity-Kontext , sonst Anwendungskontext wäre genug.


11
Wenn ich es richtig mache, sind someClass.this, getBaseContext und getContext () Aktivitätskontexte, während getApplicationContext () und getApplication () Anwendungskontexte sind?
Pheonix7

Kontext ist nur Information über eine Umgebung, oder?
committedandroider

Ja, es ist wie die Sandbox, die die Anwendung hostet
waqaslam

@committedandroider, da der Aktivitätskontext zusätzliche Informationen für das ausgewählte Thema enthält. Wenn also Ansichten im Code erstellt werden, wird das richtige Thema automatisch angewendet. Für weitere Informationen können Sie lesen dieses
waqaslam

@waqaslam unter Bezugnahme auf Android SDK-Klassen, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; und getBaseContext()ist Methode von ContextWrapper, so getBaseContext() offers activity context.wie auch Application Context... ist das nicht?
Bhuro

26

Die Antwort von Waqas ist sehr klar und vollständig, ich möchte jedoch den Unterschied zwischen der Verwendung von thisvs. getBaseContext()oder getApplication()vs. weiter verdeutlichen getApplicationContext(). Beides Activityund Applicationerstrecken sich nicht Contextselbst, sondern ContextWrapperwelches a

"Durch die Proxy-Implementierung werden Contexteinfach alle Aufrufe an einen anderen delegiert Context."

Diesen "echten" Kontext erhalten Sie, wenn Sie ihn verwenden getBaseContext().

Also, obwohl this(für Activity) und getBaseContext()beide den Aktivitätskontext angeben, sie

  • (a) beziehen sich nicht auf dasselbe Objekt ( this != getBaseContext()) und
  • (b) Das Durchrufen des Kontexts thisist etwas weniger effizient, da die Aufrufe eine zusätzliche Indirektionsebene durchlaufen. Ich bezweifle jedoch, dass dies einen praktischen Unterschied macht.

Die gleiche Logik gilt für getApplication()vs. getApplicationContext().


Soweit getBaseContext()betrifft, Android Entwickler von Google vorgeschlagen dies: „Verwenden Sie getBaseContext nicht (), benutzen Sie einfach den Kontext Sie haben.“ Tatsächlich schlagen sie vor, dass Sie sie thisfür Aktivitäten verwenden.
ChuongPham

Dies ist die klarste Erklärung, die getBaseContextich im Internet gefunden habe. Vielen Dank!!
Q126y

6
LoginActivity.this 

Die obige Zeile ist eine Aktivität, bei der es sich offensichtlich um einen Kontext handelt. Diese wird verwendet, wenn Sie einige AlertDialogs erstellen. An einigen Stellen ist die Verwendung des Aktivitätskontexts obligatorisch.

getApplication()

Gleiches gilt für die Methode make text, die Context and Application selbst implementiert Context

getApplicationContext()

Dies ist die am meisten bevorzugte Methode, da diese Contextbis zum Herunterfahren der Anwendung gültig ist.

getBaseContext()

Dieser Kontext steht Widgets und Ansichten zur Verfügung.

Aber alle geben ein Kontextobjekt und sonst nichts.


In einer Toastnachricht oder beim Erstellen einer Absicht haben alle den gleichen Effekt, obwohl die Verwendung von getApplicationContext () am korrektesten ist.
Pheonix7

1
@ Hassan Samii: Für Toast können Sie getApplicationContext()für alle Situationen verwenden, aber es ist vorzuziehen, dass Sie verwenden, thiswenn Sie Toast in einer Aktivität machen.
ChuongPham

0

Class.this wird verwendet, wenn Ihre Klasse Activity getapplication () verwendet. Verweisen Sie auf Anwendung und Anwendung erweitert Anwendungskontext. Getbasecontext () Verweisen Sie auf Ihren Aktivitätskontext. Kontext beziehen Sie sich auf Ihren Aktivitätslebenszykluskontext

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.