Eine sehr interessante Frage. Ich denke, es handelt sich hauptsächlich um eine semantische Bedeutung, die auch historisch bedingt sein kann.
Obwohl in aktuellen Android-Activity- und Service-Implementierungen, getApplication()
y getApplicationContext()
dasselbe Objekt zurückgeben, gibt es keine Garantie dafür, dass dies immer der Fall ist (z. B. bei einer bestimmten Herstellerimplementierung).
Wenn Sie also die Anwendungsklasse, die Sie im Manifest registriert haben, haben möchten, sollten Sie niemals aufrufen getApplicationContext()
und übertragen Sie es auf Ihre Anwendung, da es sich möglicherweise nicht um die Anwendungsinstanz handelt (was Sie offensichtlich mit dem Test-Framework erfahren haben).
Warum ist getApplicationContext()
überhaupt existieren?
getApplication()
ist nur in der Klasse Activity und der Klasse Service verfügbar, während getApplicationContext()
wird in der Context-Klasse deklariert.
Das bedeutet eigentlich nur eines: Wenn Sie Code in einem Broadcast-Empfänger schreiben, der kein Kontext ist, aber in seiner onReceive-Methode einen Kontext erhält, können Sie nur getApplicationContext()
. Das bedeutet auch, dass der Zugriff auf Ihre Anwendung in einem BroadcastReceiver nicht garantiert ist.
Wenn Sie sich den Android-Code ansehen, sehen Sie, dass eine Aktivität, wenn sie angehängt wird, einen Basiskontext und eine Anwendung erhält, und das sind unterschiedliche Parameter. getApplicationContext()
delegiert seine Aufforderung an baseContext.getApplicationContext()
.
Und noch etwas: In der Dokumentation steht, dass Sie in den meisten Fällen keine Unterklasse Application benötigen:
Normalerweise ist es nicht notwendig, die Unterklasse Application
. In den meisten Fällen, können statische Singletons die gleiche Funktionalität auf modularere Weise Weise bereitstellen. Wenn Ihr Singleton einen globalen Kontext benötigt (z.B. zur Registrierung von Broadcast-Empfänger), kann die Funktion, die ihn abruft, mit einem Context
die intern die Context.getApplicationContext()
wenn der ersten Konstruktion des Singletons.
Ich weiß, dass dies keine exakte und präzise Antwort ist, aber beantwortet das trotzdem Ihre Frage?