Question Différence entre getContext (), getApplicationContext (), getBaseContext () et "this"


Quelle est la différence entre getContext() , getApplicationContext() , getBaseContext() , et "this"?

Bien que ce soit une question simple, je suis incapable de comprendre la différence fondamentale entre eux. Veuillez donner quelques exemples faciles si possible.


451
2018-05-17 18:07


origine


Réponses:


  • View.getContext(): Renvoie le contexte dans lequel la vue est en cours d'exécution. Habituellement, l'activité actuellement active.

  • Activity.getApplicationContext(): Renvoie le contexte de l'application entière (le processus que toutes les activités exécutent à l'intérieur de). Utilisez ceci à la place du contexte d'activité actuel si vous avez besoin d'un contexte lié au cycle de vie de l'ensemble de l'application, pas seulement activité actuel.

  • ContextWrapper.getBaseContext(): Si vous avez besoin d'accéder à un contexte depuis un autre contexte, vous utilisez un ContextWrapper. le Contexte visé de l'intérieur que ContextWrapper est accessible via getBaseContext ().


449
2018-05-17 18:15



La plupart des réponses couvrent déjà getContext() et getApplicationContext() mais getBaseContext () est rarement expliqué.

La méthode getBaseContext() est seulement pertinent lorsque vous avez un ContextWrapper. Android fournit un ContextWrapper classe qui est créée autour d'un existant Context en utilisant:

ContextWrapper wrapper = new ContextWrapper(context);

L'avantage d'utiliser un ContextWrapper est qu'il vous permet de "modifier le comportement sans changer le contexte d'origine". Par exemple, si vous avez une activité appelée myActivity alors peut créer un View avec un thème différent de myActivity:

ContextWrapper customTheme = new ContextWrapper(myActivity) {
  @Override
  public Resources.Theme getTheme() { 
    return someTheme;
  }
}
View myView = new MyView(customTheme);

ContextWrapper est vraiment puissant car il vous permet de remplacer la plupart des fonctions fournies par Context y compris le code pour accéder aux ressources (par ex. openFileInput(), getString()), interagissent avec d'autres composants (par ex. sendBroadcast(), registerReceiver()), demande des autorisations (par ex. checkCallingOrSelfPermission()) et la résolution des emplacements de système de fichiers (par ex. getFilesDir()). ContextWrapper est vraiment utile pour contourner les problèmes spécifiques aux périphériques / versions ou pour appliquer des personnalisations ponctuelles à des composants tels que les vues nécessitant un contexte.

La méthode getBaseContext () peut être utilisé pour accéder au contexte "base" que le ContextWrapper s'enroule autour. Vous devrez peut-être accéder au contexte "base" si vous devez, par exemple, vérifier s'il s'agit d'un Service, Activity ou Application:

public class CustomToast {
  public void makeText(Context context, int resId, int duration) {
    while (context instanceof ContextWrapper) {
      context = context.baseContext();
    }
    if (context instanceof Service)) {
      throw new RuntimeException("Cannot call this from a service");
    }
    ...
  }
}

Ou si vous avez besoin d'appeler la version "sans emballage" d'une méthode:

class MyCustomWrapper extends ContextWrapper {
  @Override
  public Drawable getWallpaper() {
    if (BuildInfo.DEBUG) {
      return mDebugBackground;
    } else {
      return getBaseContext().getWallpaper();
    }
  }
}

54
2018-02-13 18:24



getApplicationContext () - Renvoie le contexte pour toutes les activités s'exécutant dans l'application.

getBaseContext () - Si vous voulez accéder au contexte à partir d'un autre contexte dans l'application, vous pouvez accéder.

getContext () - Retourne la vue contextuelle uniquement l'activité en cours d'exécution.


38
2018-03-10 08:51



Context fournit des informations sur le Actvity ou Application aux composants nouvellement créés.

Pertinent Context doit être fourni aux composants nouvellement créés (que ce soit le contexte d'application ou le contexte d'activité)

Depuis Activity est une sous-classe de Context, on peut utiliser this pour obtenir le contexte de cette activité


28
2018-03-02 13:28



La question "qu'est-ce que le Contexte" est l'une des questions les plus difficiles dans l'univers Android.

Contexte définit les méthodes qui accèdent aux ressources système, récupèrent les actifs statiques de l'application, vérifient les autorisations, effectuent des manipulations de l'interface utilisateur et bien d'autres. En substance, Context est un exemple de Dieu Objet anti-pattern dans la production.

Quand il s'agit de quel type de Context Devons-nous utiliser, il devient très compliqué parce que, sauf pour être Dieu Objet, l'arbre de la hiérarchie de Context les sous-classes violent brutalement le principe de substitution de Liskov.

Ce blog tente de résumer Context classes d'applicabilité dans différentes situations.

Permettez-moi de copier la table principale de cet article pour être complet:

+----------------------------+-------------+----------+---------+-----------------+-------------------+
|                            | Application | Activity | Service | ContentProvider | BroadcastReceiver |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
| Show a Dialog              | NO          | YES      | NO      | NO              | NO                |
| Start an Activity          | NO¹         | YES      | NO¹     | NO¹             | NO¹               |
| Layout Inflation           | NO²         | YES      | NO²     | NO²             | NO²               |
| Start a Service            | YES         | YES      | YES     | YES             | YES               |
| Bind to a Service          | YES         | YES      | YES     | YES             | NO                |
| Send a Broadcast           | YES         | YES      | YES     | YES             | YES               |
| Register BroadcastReceiver | YES         | YES      | YES     | YES             | NO³               |
| Load Resource Values       | YES         | YES      | YES     | YES             | YES               |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
  1. Une application peut démarrer une activité à partir d'ici, mais elle nécessite la création d'une nouvelle tâche. Cela peut convenir à des cas d'utilisation spécifiques, mais peut créer des comportements de pile arrière non standard dans votre application et n'est généralement pas recommandé ou considéré comme une bonne pratique.
  2. C'est légal, mais l'inflation sera faite avec le thème par défaut pour le système sur lequel vous travaillez, et non ce qui est défini dans votre application.
  3. Autorisé si le destinataire est nul, ce qui est utilisé pour obtenir la valeur actuelle d'une diffusion collante, sur Android 4.2 et au-dessus.

- capture d'écran


11
2018-03-09 16:31



De cette docs

J'ai compris que vous devriez utiliser:

Essayez d'utiliser l'application contextuelle au lieu d'une activité contextuelle


1
2018-04-15 06:54



getApplicationContext () 

Ceci est utilisé pour le niveau d'application et se réfère à toutes les activités.

getContext () et getBaseContext () 

est probablement le même que ceux-ci sont mentionnés seulement l'activité actuelle qui est en direct.

ce

est de se référer à l'objet de classe actuel toujours.


1
2017-08-11 11:46



Un morceau de diagramme UML du contexte

enter image description here


1
2018-06-12 09:46