web-dev-qa-db-fra.com

Obtention du contexte d'application

Cela pourrait être une question simple, mais je voulais juste m'assurer d'avoir raison.

Dans mon Android j'ai un constructeur qui utilise:

activity.getApplicationContext()

L'activité est transmise au constructeur en tant que paramètre.

Le problème est que j'appelle cette classe à partir d'un service. Si je crée un deuxième constructeur qui accepte le service comme paramètre et utilise service.getApplicationContext? Vais-je obtenir le même contexte d'application?

24
gtdevel

Vais-je obtenir le même contexte d'application?

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

 getApplicationContext()

Retourne le contexte de l'objet Application global unique du processus en cours.

Il ne doit donc pas être modifié pour l'ensemble du processus de candidature.

Veuillez également en prendre note:

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

Corrige moi si je me trompe.

Merci

8
bHaRaTh

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

Créez une classe App qui étend Android.app.Application

public class App extends Application {
    public static Context context;

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

Modifiez votre AndroidManifest.xml's <application> tag pour avoir l'attribut Android:name="your.package.name.App".

Chaque fois que vous avez besoin du contexte d'application, obtenez-le simplement à partir de App.context.

Application est toujours initialisé en premier, que votre processus s'exécute, que ce soit une activité, un service ou autre chose. Vous aurez toujours accès au contexte de l'application.

56

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

2
Nikolay Elenkov

Vous pouvez opter pour getApplicationContext() si vous voulez obtenir le contexte de l'application entière. Si vous souhaitez obtenir le contexte de la classe actuelle, vous pouvez utiliser getBaseContext() à la place.

1
Android Killer

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

Créez une classe domain.company.pseudo.ApplicationName Qui étendAndroid.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, mon nom de package d'application complet est hypersoft.systems.Android.starbox.

Maintenant, modifiez votre balise AndroidManifest.xml <application> Pour avoir attributAndroid:name="hypersoft.systems.Android.Starbox", Et assurez-vous que le fichier de classe Starbox.Java Se trouve dans le composant de projet répertoire: Android plutôt que 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 les outils de construction 26 et api 26 (Android 8.0) avec la version min sdk 14 (4.0).

1
Hypersoft Systems