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 simples si possible.
android
this
android-context
iCurious
la source
la source
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 dans lequel toutes les activités s'exécutent). Utilisez-le à la place du contexte d'activité actuel si vous avez besoin d'un contexte lié au cycle de vie de l'application entière, et pas seulement de l'activité en cours.ContextWrapper.getBaseContext()
: Si vous avez besoin d'accéder à un contexte à partir d'un autre contexte, vous utilisez un ContextWrapper. Le contexte auquel l'intérieur de ContextWrapper fait référence est accessible via getBaseContext ().la source
this
etgetContext()
ne sont pas toujours les mêmes, par exemple dans la classe Activity, vous pouvez utiliserthis
carActivity
hérite deContext
mais la méthodegetContext()
n'est pas dans laActivity
classe. @mikedroid @KCRajuLa plupart des réponses couvrent déjà
getContext()
etgetApplicationContext()
mais getBaseContext () est rarement expliqué.La méthode
getBaseContext()
n'est pertinente que si vous en avez unContextWrapper
. Android fournit uneContextWrapper
classe qui est créée autour d'un existant enContext
utilisant: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, vousmyActivity
pouvez en créer unView
avec un thème différent de celui-cimyActivity
:ContextWrapper
est vraiment puissant , car il vous permet de passer outre la plupart des fonctions fournies parContext
y compris le code d'accès aux ressources (par exempleopenFileInput()
,getString()
), interagir avec d' autres composants (par exemplesendBroadcast()
,registerReceiver()
), les autorisations des demandes (par exemplecheckCallingOrSelfPermission()
) et la résolution des emplacements du système de fichiers (par exemplegetFilesDir()
).ContextWrapper
est très utile pour contourner les problèmes spécifiques à l'appareil / à la version ou pour appliquer des personnalisations ponctuelles à des composants tels que des vues qui nécessitent un contexte.La méthode getBaseContext () peut être utilisée pour accéder au contexte «de base» qui
ContextWrapper
entoure. Si vous avez besoin, par exemple, vérifier si elle est un que vous pourriez avoir besoin d'accéder au contexte « de base »Service
,Activity
ouApplication
:Ou si vous devez appeler la version «déballée» d'une méthode:
la source
ContextWrapper
est l'une des pires décisions jamais prises par les développeurs de framework Android. Quand ils ont réalisé qu'ils avaient créé une famille entière d'objets divins, au lieu de faire la bonne chose et de refactoriser le code vers la responsabilité unique, ils ont ajouté un hack laid qui a permis de changer le comportement du contexte en approfondissant l'arbre d'héritage. Mauvaise ingénierie logicielle à son plus laid. Quant à nous, développeurs, à mon humble avis, personne ne devrait jamais utilisergetBaseContext()
ouContextWrapper
. Si vous le faites, c'est une énorme "odeur de code".CustomToast
code complet . THANKS :)))la source
La question «quel est le contexte» est l'une des questions les plus difficiles de l'univers Android.
Le contexte définit des 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 d'interface utilisateur et bien d'autres. Essentiellement,
Context
est un exemple d'anti-modèle de Dieu Objet en production.Quand il s'agit de savoir quel type d'
Context
utilisation devons-nous utiliser, cela devient très compliqué car, à l'exception d'être Dieu Objet, l'arborescence hiérarchique desContext
sous - classes viole brutalement le principe de substitution de Liskov.Ce billet de blog tente de résumer l'
Context
applicabilité des classes dans différentes situations.Permettez-moi de copier le tableau principal de ce message pour être complet:
la source
Context
fournit des informations sur leActvity
ouApplication
sur les composants nouvellement créés.Des informations pertinentes
Context
doivent être fournies pour les composants nouvellement créés (que ce soit le contexte d'application ou le contexte d'activité)Étant donné qu'il
Activity
s'agit d'une sous-classe deContext
, on peut utiliserthis
pour obtenir le contexte de cette activitéla source
De cette documentation
J'ai compris que vous devez utiliser:
la source
getApplicationContext ()
getContext () et getBaseContext ()
cette
la source
A
Context
est:la source