Obtenir le contexte de L'Application

<!-C'est peut-être une question simple, mais je voulais m'assurer d'avoir raison.

Dans mon application android, j'ai un constructeur qui utilise:

activity.getApplicationContext()

l'activité est transmise au constructeur comme paramètre.

le problème est que j'appelle cette classe à partir d'un Service. Si je fais un second constructeur qui accepte le service comme paramètre et utilise service.getApplicationContext? Est-ce que j'aurai le même contexte d'application?

24
demandé sur Brian Tompsett - 汤莱恩 2011-08-22 11:12:00

6 réponses

est-ce que j'aurai le même contexte d'application?

Oui. Vous pouvez consulter la documentation android, ils ont fourni

 getApplicationContext()

renvoie le contexte de l'Application globale unique du processus courant.

Donc il ne devrait pas être modifié pour l'ensemble du processus de demande.

Veuillez également prendre note de ceci:

getApplicationContext() généralement ne doit être utilisé que si vous avez besoin d'un Contexte dont le cycle de vie est distinct du contexte actuel, qui est lié à la durée du processus plutôt qu'à la composante actuelle.

corrigez-moi si je me trompe.

Merci

8
répondu bHaRaTh 2018-02-15 19:05:46

la façon la plus simple d'obtenir le contexte de l'application est:

Créer une classe App qui s'étend android.app.Application

public class App extends Application {
    public static Context context;

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

Modifier AndroidManifest.xml<application> balise pour avoir l'attribut android:name="your.package.name.App".

chaque fois que vous avez besoin du contexte de l'application, Obtenez-le de App.context.

Application est toujours initialisé d'abord que votre processus s'exécute, qu'il s'agisse d'une activité, d'un service ou d'autre chose. Vous aurez toujours accès à l'application cadre.

55
répondu Randy Sugianto 'Yuku' 2011-08-22 08:08:47

il n'y a qu'un seul contexte d'application, donc vous devriez obtenir le même. Vous pouvez avoir juste un constructeur qui prend un Context, vous n'avez pas vraiment besoin de deux. Ou si vous voulez vous assurer que vous obtenez le contexte d'application, et pas, disons, une activité, vous pouvez faire prendre votre constructeur Application comme paramètre qui est un Context.

2
répondu Nikolay Elenkov 2011-08-22 07:21:42

Vous pouvez aller pour getApplicationContext() si tu veux les mettre en contexte d'ensemble de l'application. Si vous souhaitez obtenir contexte de la classe, vous pouvez utiliser getBaseContext() à la place.

1
répondu Android Killer 2015-07-14 06:48:52

j'ai adapté la réponse de yuku avec une référence de contexte directe non statique.

Créer une classe domain.company.pseudo.ApplicationNameextendsandroid.app.Application.

package hypersoft.systems.android;

import android.app.Application;

public class Starbox extends Application {

  public static Starbox instance;

  @Override
  public void onCreate() {
    super.onCreate();
    instance = this;
  }

}

dans cet exemple, le nom de ma trousse de demande complète est hypersoft.systems.android.starbox.

maintenant, modifiez votre AndroidManifest.xml <application> balise l'attributandroid:name="hypersoft.systems.android.Starbox", et s'assurer que l' Starbox.java fichier de classe est situé dans la composante du projet de répertoire: android plutôt que de starbox.

Avec tout cela fait, vous pouvez maintenant import hypersoft.systems.android.Starbox, et dans votre code, vous pouvez obtenir le ApplicationContext en appelant Starbox.instance.getApplicationContext()

compilation réussie avec build tools 26 et api 26 (Android 8.0) avec min sdk version 14 (4.0).

0
répondu Hypersoft Systems 2017-09-10 00:18:48

contexte de L'Application Ajouter contexte de l'activité les deux sont différents.Passer est risqué .Utilisez ce code pour utiliser l'objet contextuel .

public class App extends Application {
public static Context context;

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

dans vos activités et dans la classe des fragments:

Conetext context=App.context;

-2
répondu Ashish Saini 2014-03-31 08:30:53