La maggior parte delle app che desiderano un metodo conveniente per ottenere il contesto dell'applicazione creano la propria classe che si estende android.app.Application
.
GUIDA
Puoi farlo creando prima una classe nel tuo progetto come la seguente:
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;
}
}
Quindi, nel tuo AndroidManifest devi specificare il nome della tua classe nel tag di AndroidManifest.xml:
<application
...
android:name="com.example.App" >
...
</application>
È quindi possibile recuperare il contesto dell'applicazione in qualsiasi metodo statico utilizzando quanto segue:
public static void someMethod() {
Context context = App.getContext();
}
AVVERTIMENTO
Prima di aggiungere qualcosa come sopra al tuo progetto, dovresti considerare cosa dice la documentazione:
Normalmente non è necessario sottoclassare l'Applicazione. Nella maggior parte dei casi, i singoli statici possono fornire la stessa funzionalità in un modo più modulare. Se il tuo singleton necessita di un contesto globale (ad esempio per registrare i ricevitori di trasmissione), alla funzione per recuperarlo può essere assegnato un contesto che utilizza internamente Context.getApplicationContext () quando costruisce il singleton per la prima volta.
RIFLESSIONE
C'è anche un altro modo per ottenere il contesto dell'applicazione usando reflection. La riflessione viene spesso trascurata su Android e personalmente penso che questo non debba essere usato in produzione.
Per recuperare il contesto dell'applicazione, è necessario richiamare un metodo su una classe nascosta ( ActivityThread ) che è disponibile dall'API 1:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.ActivityThread")
.getMethod("currentApplication").invoke(null, (Object[]) null);
}
Esiste un'altra classe nascosta ( AppGlobals ) che fornisce un modo per ottenere il contesto dell'applicazione in modo statico. Ottiene il contesto usando ActivityThread
quindi non c'è davvero alcuna differenza tra il seguente metodo e quello pubblicato sopra:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.AppGlobals")
.getMethod("getInitialApplication").invoke(null, (Object[]) null);
}
Buona programmazione!