web-dev-qa-db-fra.com

Meilleure façon d'obtenir un contexte d'application dans une méthode statique dans Android

Je travaille sur une application Android qui a plusieurs activités. J'y ai une classe avec plusieurs méthodes statiques. J'aimerais pouvoir appeler ces méthodes à partir des différentes activités. Je ' m en utilisant les méthodes statiques pour charger des données à partir d'un fichier xml via un XmlResourceParser. Pour créer un XmlResourceParser nécessite un appel sur le contexte d'application. Donc ma question est, quelle est la meilleure façon d'obtenir une référence au contexte d'application dans les méthodes statiques ? Demandez à chaque activité de l'obtenir et de le transmettre? Stockez-le en quelque sorte dans une variable globale?

32
Slapout

La meilleure façon serait de passer l'objet Activity en paramètre aux fonctions statiques.

AFAIK, il n'y a pas une telle méthode qui vous donnera le contexte de l'application dans la méthode statique.

23
Karan

Je ne suis pas sûr que cela fonctionnera tout le temps, mais cela fonctionne pour moi maintenant:

public class myActivity extends ListActivity
{
    public static Context baseContext;

    public void onCreate(Bundle savedInstanceState) 
    {
        baseContext = getBaseContext();
    }

Ensuite, vous pouvez utiliser la statique dans votre package:

myApplication.baseContext
3
gjpc

Cela devrait vous permettre d'accéder à applicationContext de n'importe où, vous permettant d'obtenir applicationContext partout où vous pouvez l'utiliser; Toast, getString(), sharedPreferences, etc. J'ai utilisé cela pour obtenir applicationContext plusieurs fois à l'intérieur des méthodes statiques.

The Singleton:

package com.domain.packagename;

import Android.content.Context;

/**
 * Created by Versa on 10.09.15.
 */
public class ApplicationContextSingleton {
    private static PrefsContextSingleton mInstance;
    private Context context;

    public static ApplicationContextSingleton getInstance() {
        if (mInstance == null) mInstance = getSync();
        return mInstance;
    }

    private static synchronized ApplicationContextSingleton getSync() {
        if (mInstance == null) mInstance = new PrefsContextSingleton();
        return mInstance;
    }

    public void initialize(Context context) {
        this.context = context;
    }

    public Context getApplicationContext() {
        return context;
    }

}

Initialisez le singleton dans votre sous-classe Application:

package com.domain.packagename;

import Android.app.Application;

/**
 * Created by Versa on 25.08.15.
 */
public class mApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        ApplicationContextSingleton.getInstance().initialize(this);
    }
}

Si je ne me trompe pas, cela vous donne un crochet à applicationContext partout, appelez-le avec ApplicationContextSingleton.getInstance.getApplicationContext(); Vous ne devriez pas avoir besoin d'effacer cela à tout moment, car lorsque l'application se ferme, cela va de toute façon avec elle.

N'oubliez pas de mettre à jour AndroidManifest.xml Pour utiliser cette sous-classe Application:

<?xml version="1.0" encoding="utf-8"?>

<manifest
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.domain.packagename"
    >

<application
    Android:allowBackup="true"
    Android:name=".mApplication" <!-- This is the important line -->
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme"
    Android:icon="@drawable/app_icon"
    >

S'il vous plaît faites le moi savoir si vous voyez quelque chose de mal ici, merci. :)

2
Versa

Il y a un article dans le blog Sane Tricks For InsaneWorld avec une réponse. Il indique que vous pouvez remplacer l'objet Application par votre propre sous-classe, puis y conserver le contexte de l'application de manière statique. Vous pouvez trouver un exemple de code dans la publication.

L'article de blog d'origine - http://uquery.blogspot.co.il/2011/08/how-to-get-application-context.html

1
Tom Susel