Wann wird getApplicationContext () der Application-Klasse aufgerufen?

8

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

%Vor%

getApplicationContext() ist eine abstrakte Methode in Context class, die in ContextWrapper class überschrieben wird.

%Vor%

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 .

%Vor%

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.

    
CodeWarrior 22.07.2014, 09:40
quelle

3 Antworten

16

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:

%Vor%

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:

%Vor%

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. :)

    
matiash 25.07.2014, 03:25
quelle
6

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

    
Manish Mulimani 24.07.2014 12:16
quelle
0
%Vor%     
Kamlesh 31.07.2014 10:47
quelle

Tags und Links