Die meisten Apps, die eine bequeme Methode zum Abrufen des Anwendungskontexts wünschen, erstellen eine eigene Klasse, die erweitert wird android.app.Application
.
LEITEN
Sie können dies erreichen, indem Sie zuerst eine Klasse in Ihrem Projekt wie folgt erstellen:
import android.app.Application;
import android.content.Context;
public class App extends Application {
private static Application sApplication;
public static Application getApplication() {
return sApplication;
}
public static Context getContext() {
return getApplication().getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
sApplication = this;
}
}
Dann sollten Sie in Ihrem AndroidManifest den Namen Ihrer Klasse im Tag von AndroidManifest.xml angeben:
<application
...
android:name="com.example.App" >
...
</application>
Anschließend können Sie den Anwendungskontext in einer beliebigen statischen Methode wie folgt abrufen:
public static void someMethod() {
Context context = App.getContext();
}
WARNUNG
Bevor Sie Ihrem Projekt etwas Ähnliches hinzufügen, sollten Sie überlegen, was in der Dokumentation steht:
Normalerweise muss die Anwendung nicht in Unterklassen unterteilt werden. 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 um Registrierungsempfänger zu registrieren), kann der Funktion zum Abrufen ein Kontext zugewiesen werden, der beim erstmaligen Erstellen des Singletons intern Context.getApplicationContext () verwendet.
BETRACHTUNG
Es gibt auch eine andere Möglichkeit, den Anwendungskontext mithilfe von Reflection abzurufen. Reflexion wird in Android oft herabgesetzt und ich persönlich denke, dass dies nicht in der Produktion verwendet werden sollte.
Um den Anwendungskontext abzurufen, müssen wir eine Methode für eine versteckte Klasse ( ActivityThread ) aufrufen, die seit API 1 verfügbar ist:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.ActivityThread")
.getMethod("currentApplication").invoke(null, (Object[]) null);
}
Es gibt noch eine versteckte Klasse ( AppGlobals ), mit der der Anwendungskontext statisch abgerufen werden kann. Der Kontext wird verwendet, ActivityThread
sodass es wirklich keinen Unterschied zwischen der folgenden und der oben angegebenen Methode gibt:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.AppGlobals")
.getMethod("getInitialApplication").invoke(null, (Object[]) null);
}
Viel Spaß beim Codieren!