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"?
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.
J'ai trouvé ce tableau très utile pour décider quand utiliser différents types de contextes:
Article d'origine ici .
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.
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é.
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
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.