web-dev-qa-db-fra.com

Différence entre le contexte d'activité et le contexte d'application

Cela me laisse perplexe, je l'utilisais dans Android 2.1-r8 SDK:

ProgressDialog.show(getApplicationContext(), ....);

et aussi dans

Toast t = Toast.makeText(getApplicationContext(),....);

utiliser getApplicationContext() bloque à la fois ProgressDialog et Toast .... ce qui m'amène à cette question:

Quelles sont les différences réelles entre un contexte d'activité et un contexte d'application, malgré le libellé "Contexte"?

219
t0mm13b

Ce sont deux instances de Context , mais l'instance d'application est liée au cycle de vie de l'application, tandis que l'instance d'activité est liée au cycle de vie d'une activité. Ainsi, ils ont accès à différentes informations sur l'environnement de l'application.

Si vous lisez la documentation à l'adresse getApplicationContext , vous remarquerez que vous ne devez l'utiliser que si vous avez besoin d'un contexte dont le cycle de vie est distinct du contexte actuel. Cela ne s'applique dans aucun de vos exemples.

Le contexte d'activité contient probablement des informations sur l'activité en cours nécessaires à la réalisation de ces appels. Si vous affichez le message d'erreur exact, vous pourrez peut-être indiquer exactement ce dont il a besoin.

Mais en général, utilisez le contexte d'activité à moins que vous n'ayez une bonne raison de ne pas le faire.

231
Cheryl Simon

J'ai trouvé ce tableau très utile pour décider quand utiliser différents types de contextes:

enter image description here

  1. Une application PEUT démarrer une activité à partir d'ici, mais cela 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 de retour non standard dans votre application et n'est généralement pas recommandé ni considéré comme une bonne pratique.
  2. C’est légal, mais l’inflation se fera avec le thème par défaut du système sur lequel vous exécutez, et non selon ce qui est défini dans votre application.
  3. Autorisé si le récepteur est nul, utilisé pour obtenir la valeur actuelle d'une diffusion persistante, sur Android 4.2 et versions ultérieures.

Article d'origine ici .

156
CommonSenseCode

Ceci est évidemment un défaut de la conception de l'API. En premier lieu, le contexte d'activité et le contexte d'application sont des objets totalement différents. Par conséquent, les paramètres de méthode dans lesquels le contexte est utilisé doivent utiliser directement ApplicationContext ou Activity, au lieu d'utiliser le contexte parent de la classe parente. En second lieu, le document devrait spécifier quel contexte utiliser ou non explicitement.

30
lucas

Je pense que la raison en est que ProgressDialog est associé à l'activité qui soutient la ProgressDialog car le dialogue ne peut pas rester après la destruction de l'activité, il doit donc être transmis this (ActivityContext) qui est également détruit avec l'activité alors que le contexte d'application reste même après la destruction de l'activité.

11
user2779311

Je pense que lorsque tout a besoin d'un écran pour afficher (bouton, boîte de dialogue, mise en page ...), nous devons utiliser une activité contextuelle, et tout n'a pas besoin d'un écran pour afficher ou traiter (pain grillé, service téléphone téléphonique, contact ...) nous pourrait utiliser un contexte d'application

1
Dmobile

Utilisez getApplicationContext () si vous avez besoin de quelque chose lié à un contexte qui aura lui-même une portée globale.

Si vous utilisez Activity, la nouvelle instance Activity aura une référence, qui comporte une référence implicite à l'ancienne Activity, et l'ancienne Activity ne peut pas être nettoyée.

0
Dhiraj Himani