Ich habe eine Klasse Application
, in der ich getApplicationContext()
überschreibe.
Ich habe im Android-Quellcode nachgesehen und kann nicht herausfinden, wo er heißt?
Die Vererbungshierarchie lautet:
Application -> ContextWrapper -> Context
getApplicationContext()
ist eine abstrakte Methode in Context
class, die in ContextWrapper
class überschrieben wird.
mBase
ist ein Verweis auf ein Objekt vom Typ Context
, das in ContextWrappers Konstruktor initialisiert wird, aber nach dem Code der Klassenkonstruktor der Anwendung übergibt NULL an den Konstruktor von super()
, also Konstruktor von ContextWrapper
.
Die einzige Möglichkeit, den Kontext zu übergeben, ist jetzt:
%Vor% Aber es gibt auch keinen Aufruf zu dieser Methode. Bitte hilf mir das herauszufinden wo von getApplicationContext()
dann heißt?
HINWEIS: Bitte posten Sie keine Links zu solchen Fragen, da ich jede einzelne von ihnen durchgelesen habe, aber immer noch keine konkrete Antwort.
Ich denke, die Frage ist eher "Wo wird attachBaseContext()
für das Objekt Application
aufgerufen?"
Siehe Application.java :
%Vor% Wenn Sie ein wenig weiter oben in der Anrufkette gehen, finden Sie Instrumentation.newApplication()
( Instrumentation.java ) und schließlich LoadedApk.makeApplication()
( LoadedApk.java ), die aufgerufen werden, wenn die Anwendung gestartet wird:
Kurz gesagt, der Basiskontext, der der Klasse Application
bereitgestellt wird, ist ContextImpl
Instanz, die direkt in dieser Methode erstellt wurde.
Und wenn Sie ContextImpl.getApplicationContext()
überprüfen:
Sie werden sehen, dass es tatsächlich LoadedApk.getApplication()
aufruft (da mPackageInfo
die LoadedApk
-Instanz ist), was das mApplication
-Feld ist, das durch die zuvor erwähnte Methode makeApplication()
festgelegt wurde.
Kurz gesagt, nachdem all dies eingerichtet ist, endet Application.getApplicationContext()
und gibt die gleiche Application
-Instanz zurück. :)
Context
wird über die Methode setBaseContext
festgelegt, wenn eine Activity / Service / Receiver-Instanz zum ersten Mal erstellt wird. Hier ist die Aufrufliste:
ContextWrapper :: attachBaseContext & lt; - Anwendung :: attach & lt; - Instrumentierung :: newApplication - LoadedApk :: makeApplication & lt; - - ActivityThread :: performLaunchActivity || ActivityThread: : handleReceiver || ActivityThread: : handleCreateService || ActivityThread: : handleBindApplication
Tags und Links android android-context