Sehr interessante Frage. Ich denke, es ist hauptsächlich eine semantische Bedeutung und kann auch historische Gründe haben.
Obwohl in aktuellen Implementierungen Android Aktivität und Dienstleistung, getApplication()
und getApplicationContext()
das gleiche Objekt zurück, gibt es keine Garantie , dass dies immer der Fall sein (beispielsweise in einer bestimmten Lieferanten - Implementierung).
Wenn Sie also die Anwendungsklasse möchten, die Sie im Manifest registriert haben, sollten Sie sie niemals aufrufen getApplicationContext()
und in Ihre Anwendung umwandeln, da es sich möglicherweise nicht um die Anwendungsinstanz handelt (die Sie offensichtlich mit dem Testframework erlebt haben).
Warum gibt getApplicationContext()
es überhaupt?
getApplication()
ist nur in der Activity-Klasse und der Service-Klasse verfügbar, während sie getApplicationContext()
in der Context-Klasse deklariert ist.
Das bedeutet tatsächlich eines: Wenn Sie Code in einen Rundfunkempfänger schreiben, der kein Kontext ist, sondern in seiner onReceive-Methode einen Kontext erhält, können Sie nur aufrufen getApplicationContext()
. Dies bedeutet auch, dass Sie in einem BroadcastReceiver nicht garantiert Zugriff auf Ihre Anwendung haben.
Wenn Sie sich den Android-Code ansehen, sehen Sie, dass eine Aktivität im Anhang einen Basiskontext und eine Anwendung erhält. Dies sind unterschiedliche Parameter. getApplicationContext()
delegiert den Anruf an baseContext.getApplicationContext()
.
Eine weitere Sache: Die Dokumentation besagt, dass Sie in den meisten Fällen keine Unterklasse für die Anwendung benötigen sollten:
Normalerweise ist keine Unterklasse erforderlich Application
. In den meisten Situationen können statische Singletons dieselbe Funktionalität auf modularere Weise bereitstellen. Wenn Ihr Singleton einen globalen Kontext benötigt (zum Beispiel zum Registrieren von Rundfunkempfängern), kann der Funktion zum Abrufen eine gegeben werden,
Context
die Context.getApplicationContext()
beim ersten Erstellen des Singletons intern verwendet wird .
Ich weiß, dass dies keine genaue und präzise Antwort ist, aber beantwortet das trotzdem Ihre Frage?
Application
Objekt explizit erstellen .