55 votes

Android : comment utiliser getApplication et getApplicationContext à partir d'une classe autre qu'une classe d'activité ou de service ?

J'utilise une classe d'application étendue sur Android pour partager mes données dans l'ensemble de l'application.

Je peux utiliser getApplication() de toutes mes activités.

Cependant, j'ai créé certaines classes d'aide personnalisées ; par exemple, une classe de type XMLHelper qui n'hérite d'aucune classe d'activité ou de service.

Ici, le getApplication() n'est pas disponible.

Comment faire le tri et quelles sont les meilleures pratiques de conception pour résoudre ce problème ?

60voto

mgv Points 4250

El getApplication() se trouve dans le fichier Activity c'est pourquoi vous ne pouvez pas y accéder depuis votre classe d'aide.

Si vous avez vraiment besoin d'accéder à votre contexte d'application à partir de votre aide, vous devez conserver une référence au contexte de l'activité et la transmettre à l'aide lors de son invocation.

1 votes

J'ai des tonnes de flux xml différents à analyser et à mettre à jour les variables globales OU à insérer dans sqlite en fonction de différents scénarios... donc au lieu de créer une nouvelle classe d'analyseur xml, j'ai pensé que pour des raisons de simplicité, le meilleur moyen et le plus simple était de créer une seule classe d'analyseur xml qui s'occupe de toute la logique d'analyse xml pour tous les scénarios. j'ai des variables globales partagées via la classe d'application et pour sqlite j'ai une classe d'aide de données singleton (également exposée via la classe d'application) et donc le besoin de getApplication() ou getApplicationContext() dans les classes d'aide

0 votes

Il suffit ensuite de transmettre le contexte de votre activité aux assistants. Notez qu'en partageant tout à plusieurs endroits, vous créez une conception étroitement couplée.

3 votes

Ce n'est pas une bonne façon de divulguer le contexte de l'activité en dehors du cycle de vie de l'activité. Vous devriez utiliser quelque chose comme WeakReference pour le contexte que vous envoyez à tous les objets d'aide en dehors de votre activité.

27voto

Chirag Raval Points 25721

El getApplication() se trouve dans le fichier Activity de sorte que chaque fois que vous voulez getApplication() dans une classe de non activité, vous devez passer une Activity au constructeur de cette classe de non-activité.

suppose que ce test est ma classe de non activité :

Test test = new Test(this);

Dans cette classe, j'ai créé un constructeur :

 public Class Test
 {
    public Activity activity;
    public Test (Activity act)
    {
         this.activity = act;
         // Now here you can get getApplication()
    }
 }

22voto

Some Noob Student Points 2832

Le transfert d'un objet Context vers un objet Activity se compile bien.

Essayez ça :

((Activity) mContext).getApplication(...)

4 votes

Est-ce que c'est sûr ? Il n'y aura pas d'exception ? J'ai toujours peur des castings

0 votes

@MarcoCastanho yep, il échoue lorsque le contexte est un service. Mais vous devriez généralement savoir au moment de l'invocation quel contexte vous allez utiliser.

0 votes

Cela fonctionne vraiment, la plupart du temps, lors du casting du contexte, nous saurons quel contexte vous utilisez.

9voto

dcart1234 Points 78

Tout d'abord, étendez la classe d'application et renvoyez le contexte dans une méthode statique

public class App extends Application {
    private static Context mContext;

    public void onCreate(){
        super.onCreate();
        this.mContext = this;
    }

    public static Context getContext(){
        return mContext;
   }
}

Ensuite, obtenez le contexte en appelant la méthode statique "getContext" et en l'intégrant à l'extension "Application".

    Application application = (Application)App.getContext();
    App app = (App)application;

4voto

Lapenkov Vladimir Points 991

Afin d'éviter de passer cet argument, j'utilise une classe dérivée d'Application

public class MyApplication extends Application {

private static Context sContext;

@Override
public void onCreate() {
    super.onCreate();
    sContext=   getApplicationContext();

}

public static Context getContext() {
    return sContext;
}

et invoquer MyApplication.getContext() dans les classes Helper.

N'oubliez pas de mettre à jour le manifeste.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example"> 
      <application 
       android:name=".MyApplication"
       android:allowBackup="true" 
       android:icon="@mipmap/ic_launcher" 
       android:label="@string/app_name"> 
         <activity....>
            ......
         </activity>
     </application> 
</manifest>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X