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 nach Möglichkeit einige einfache Beispiele an.
android
this
android-context
iCurious
quelle
quelle
Antworten:
View.getContext()
: Gibt den Kontext zurück, in dem die Ansicht gerade ausgeführt wird. Normalerweise die aktuell aktive Aktivität.Activity.getApplicationContext()
: Gibt den Kontext für die gesamte Anwendung zurück (der Prozess, in dem alle Aktivitäten ausgeführt werden). Verwenden Sie diese Option anstelle des aktuellen Aktivitätskontexts, wenn Sie einen Kontext benötigen, der an den Lebenszyklus der gesamten Anwendung gebunden ist, nicht nur an die aktuelle Aktivität.ContextWrapper.getBaseContext()
: Wenn Sie aus einem anderen Kontext heraus auf einen Kontext zugreifen müssen, verwenden Sie einen ContextWrapper. Auf den Kontext, auf den in diesem ContextWrapper verwiesen wird, wird über getBaseContext () zugegriffen.quelle
this
undgetContext()
sind nicht immer gleich, zB in der Aktivitätsklasse, die Sie verwenden können,this
weilActivity
erbt von,Context
aber die MethodegetContext()
ist nicht in derActivity
Klasse. @mikedroid @KCRajuDie meisten Antworten decken bereits ab
getContext()
undgetApplicationContext()
doch getBaseContext () wird selten erklärt.Die Methode
getBaseContext()
ist nur relevant, wenn Sie eine habenContextWrapper
. Android bietet eineContextWrapper
Klasse, die um eine vorhandeneContext
Verwendung erstellt wird:Der Vorteil der Verwendung von a
ContextWrapper
besteht darin, dass Sie das Verhalten ändern können, ohne den ursprünglichen Kontext zu ändern. Wenn Sie beispielsweise eine Aktivität namens aufgerufen haben,myActivity
können Sie eineView
mit einem anderen Thema erstellen alsmyActivity
:ContextWrapper
wirklich mächtig ist , weil es Ihnen , bereitgestellt durch die meisten Funktionen können außer Kraft setzen ,Context
einschließlich Code den Zugriff auf Ressourcen (zBopenFileInput()
,getString()
), die Interaktion mit anderen Komponenten (zBsendBroadcast()
,registerReceiver()
), Anfragen Berechtigungen (zBcheckCallingOrSelfPermission()
) und Auflösen von Dateisystem - Standorten (zBgetFilesDir()
).ContextWrapper
ist sehr nützlich, um geräte- / versionenspezifische Probleme zu umgehen oder einmalige Anpassungen auf Komponenten wie Ansichten anzuwenden, für die ein Kontext erforderlich ist.Die Methode getBaseContext () kann verwendet werden, um auf den Basiskontext zuzugreifen, den der
ContextWrapper
Wraps umgibt . Möglicherweise müssen Sie auf den Basiskontext zugreifen, wenn Sie beispielsweise überprüfen möchten, ob es sich um einen handeltService
,Activity
oderApplication
:Oder wenn Sie die "unverpackte" Version einer Methode aufrufen müssen:
quelle
ContextWrapper
eine der schlimmsten Entscheidungen ist, die Entwickler von Android Framework jemals getroffen haben. Als sie feststellten, dass sie eine ganze Familie von Gottobjekten erstellt hatten, anstatt das Richtige zu tun und den Code in Richtung Einzelverantwortung umzugestalten, fügten sie einen hässlichen Hack hinzu, der es ermöglichte, das Kontextverhalten durch Vertiefung des Vererbungsbaums zu ändern. Schlechtes Software-Engineering in seiner hässlichsten Form. Was uns Entwickler betrifft, sollte IMHO niemand jemals verwendengetBaseContext()
oderContextWrapper
. Wenn Sie dies tun, ist es ein riesiger "Code-Geruch".CustomToast
Code sehen. Ston :))quelle
Die Frage "Was ist der Kontext?" Ist eine der schwierigsten Fragen im Android-Universum.
Der Kontext definiert Methoden, die auf Systemressourcen zugreifen, statische Assets der Anwendung abrufen, Berechtigungen überprüfen, Benutzeroberflächenmanipulationen durchführen und vieles mehr. Im Wesentlichen,
Context
ist ein Beispiel für God Object Anti-Muster in der Produktion.Wenn es darum geht, welche Art von
Context
Verwendung wir verwenden sollen, wird es sehr kompliziert, da der Hierarchiebaum derContext
Unterklassen, abgesehen davon, dass er ein Gottobjekt ist, brutal gegen das Liskov-Substitutionsprinzip verstößt.In diesem Blogbeitrag wird versucht, die
Context
Anwendbarkeit von Klassen in verschiedenen Situationen zusammenzufassen.Lassen Sie mich der Vollständigkeit halber die Haupttabelle aus diesem Beitrag kopieren:
quelle
Context
bietet Informationen über dieActvity
oderApplication
zu neu erstellten Komponenten.Context
Neu erstellte Komponenten sollten relevant sein (egal ob Anwendungskontext oder Aktivitätskontext).Da
Activity
es sich um eine Unterklasse von handeltContext
, kannthis
der Kontext dieser Aktivität abgerufen werdenquelle
Aus diesen Dokumenten
Ich habe verstanden, dass Sie verwenden sollten:
quelle
getApplicationContext ()
getContext () und getBaseContext ()
diese
quelle
A
Context
ist:quelle