Ich bin neu in Android und ich versuche , den Unterschied zwischen zu verstehen getApplication()
, getApplicationContext(
) getBaseContext()
, getContext()
und someClass.this
insbesondere 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);
android
android-intent
this
toast
android-context
Pheonix7
quelle
quelle
Antworten:
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.
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 setzenIntent.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.quelle
Context
->ContextWrapper
-> 1.Application
& 2.ContextThemeWrapper
->Activity
; undgetBaseContext()
ist Methode vonContextWrapper
, sogetBaseContext() offers activity context.
wie auchApplication Context
... ist das nicht?Die Antwort von Waqas ist sehr klar und vollständig, ich möchte jedoch den Unterschied zwischen der Verwendung von
this
vs.getBaseContext()
odergetApplication()
vs. weiter verdeutlichengetApplicationContext()
. BeidesActivity
undApplication
erstrecken sich nichtContext
selbst, sondernContextWrapper
welches aDiesen "echten" Kontext erhalten Sie, wenn Sie ihn verwenden
getBaseContext()
.Also, obwohl
this
(fürActivity
) undgetBaseContext()
beide den Aktivitätskontext angeben, siethis != getBaseContext()
) undthis
ist 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()
.quelle
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 siethis
für Aktivitäten verwenden.getBaseContext
ich im Internet gefunden habe. Vielen Dank!!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.
Gleiches gilt für die Methode make text, die Context and Application selbst implementiert
Context
Dies ist die am meisten bevorzugte Methode, da diese
Context
bis zum Herunterfahren der Anwendung gültig ist.Dieser Kontext steht Widgets und Ansichten zur Verfügung.
Aber alle geben ein Kontextobjekt und sonst nichts.
quelle
getApplicationContext()
für alle Situationen verwenden, aber es ist vorzuziehen, dass Sie verwenden,this
wenn Sie Toast in einer Aktivität machen.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
quelle