Dans divers morceaux de code Android, j'ai vu:
public class MyActivity extends Activity {
public void method() {
mContext = this; // since Activity extends Context
mContext = getApplicationContext();
mContext = getBaseContext();
}
}
Cependant, je ne trouve aucune explication décente de ce qui est préférable, et dans quelles circonstances qui devraient être utilisées.
Des conseils sur la documentation à ce sujet et des conseils sur ce qui pourrait se casser si le mauvais est choisi seraient très appréciés.
android
android-context
Alnitak
la source
la source
Réponses:
Je conviens que la documentation est rare en ce qui concerne les contextes dans Android, mais vous pouvez rassembler quelques faits provenant de diverses sources.
Ce billet de blog sur le blog officiel des développeurs Google Android a été écrit principalement pour aider à résoudre les fuites de mémoire, mais fournit également de bonnes informations sur les contextes:
En lisant l'article un peu plus loin, vous découvrirez la différence entre les deux et quand vous voudrez peut-être envisager d'utiliser l'application Context (
Activity.getApplicationContext()
) plutôt que d'utiliser le contexte Activitythis
). Fondamentalement, le contexte de l'application est associé à l'application et sera toujours le même tout au long du cycle de vie de votre application, alors que le contexte d'activité est associé à l'activité et peut éventuellement être détruit plusieurs fois car l'activité est détruite lors des changements d'orientation de l'écran et tel.Je ne pouvais pas vraiment trouver quoi que ce soit sur l'utilisation de getBaseContext () autre qu'un article de Dianne Hackborn, l'une des ingénieurs de Google travaillant sur le SDK Android:
Cela provenait d'un message sur le groupe de discussion des développeurs Android , vous voudrez peut-être également y poser votre question, car une poignée de personnes travaillant sur Android surveillent ce groupe de discussion et répondent aux questions.
Donc, dans l'ensemble, il semble préférable d'utiliser le contexte d'application global lorsque cela est possible.
la source
Don't use getBaseContext()
. Quelqu'un pourrait-il clarifier cela?Voici ce que j'ai trouvé concernant l'utilisation de
context
:1) . Dans un
Activity
lui-même, utilisezthis
pour gonfler des dispositions et des menus, enregistrer des menus contextuels, instancier des widgets, démarrer d'autres activités, créer de nouveauxIntent
dans unActivity
, instancier des préférences ou d'autres méthodes disponibles dans unActivity
.Gonfler la disposition:
Gonfler le menu:
Enregistrer le menu contextuel:
Widget d'instanciation:
Lancer un
Activity
:Instancier les préférences:
2). Pour la classe à l'échelle de l'application, utilisez
getApplicationContext()
ce contexte pour la durée de vie de l'application.Récupérez le nom du package Android actuel:
Liez une classe à l'échelle de l'application:
3). Pour les écouteurs et autres types de classes Android (par exemple ContentObserver), utilisez une substitution de contexte comme:
où
this
oucontext
est le contexte d'une classe (Activité, etc.).Activity
substitution de contexte:Substitution du contexte d'écoute:
ContentObserver
substitution de contexte:4). Pour
BroadcastReceiver
(y compris le récepteur intégré / intégré), utilisez le propre contexte du récepteur.Externe
BroadcastReceiver
:Inline / Embedded
BroadcastReceiver
:5). Pour les services, utilisez le propre contexte du service.
6). Pour Toasts, utilisez généralement
getApplicationContext()
, mais si possible, utilisez le contexte transmis à partir d'une activité, d'un service, etc.Utilisez le contexte de l'application:
Utilisez le contexte transmis depuis une source:
Et enfin, n'utilisez pas
getBaseContext()
comme conseillé par les développeurs de framework Android.MISE À JOUR: Ajoutez des exemples d'
Context
utilisation.la source
OuterClass.this
; voir les commentaires dans stackoverflow.com/questions/9605459/…J'ai lu ce fil il y a quelques jours en me posant la même question. Ma décision après avoir lu ceci était simple: utilisez toujours applicationContext.
Cependant, j'ai rencontré un problème avec cela, j'ai passé quelques heures pour le trouver, et quelques secondes pour le résoudre ... (changer un mot ...)
J'utilise un LayoutInflater pour gonfler une vue contenant un Spinner.
Voici donc deux possibilités:
1)
2)
Ensuite, je fais quelque chose comme ça:
Ce que j'ai remarqué: si vous avez instancié votre linearLayout avec l'applicationContext, alors lorsque vous cliquez sur le spinner dans votre activité, vous aurez une exception non interceptée, provenant de la machine virtuelle dalvik (pas de votre code, c'est pourquoi j'ai dépensé beaucoup de temps pour trouver où était mon erreur ...).
Si vous utilisez le baseContext, alors ça va, le menu contextuel s'ouvrira et vous pourrez choisir parmi vos choix.
Voici donc ma conclusion: je suppose (je ne l'ai pas testé plus loin) que le baseContext est requis pour traiter contextMenu dans votre Activity ...
Le test a été fait en codant avec l'API 8, et testé sur un HTC Desire, android 2.3.3.
J'espère que mon commentaire ne vous a pas ennuyé jusqu'à présent et je vous souhaite le meilleur. Bon codage ;-)
la source
Tout d'abord, je conviens que nous devrions utiliser appcontext chaque fois que possible. puis "ceci" en activité. je n'ai jamais eu besoin de contexte de base.
Dans mes tests, dans la plupart des cas, ils peuvent être échangés. Dans la plupart des cas, la raison pour laquelle vous souhaitez saisir un contexte est d'accéder aux fichiers, aux préférences, à la base de données, etc. Ces données sont finalement reflétées sous forme de fichiers dans le dossier de données privé de votre application (/ data / data /). Quel que soit le contexte que vous utilisez, ils seront mappés sur le même dossier / fichier, donc vous êtes OK.
Voilà ce que j'ai observé. Il y a peut-être des cas où vous devriez les distinguer.
la source
Dans certains cas, vous pouvez utiliser le contexte d'activité sur le contexte d'application lors de l'exécution de quelque chose dans un thread. Lorsque le thread termine l'exécution et que vous devez renvoyer le résultat à l'activité de l'appelant, vous avez besoin de ce contexte avec un gestionnaire.
la source
En termes simples
getApplicationContext()
comme le suggère le nom de la méthode, votre application sera informée des détails de l'application auxquels vous pouvez accéder depuis n'importe où dans l'application. Ainsi, vous pouvez utiliser cela dans la liaison de service, l'enregistrement de la diffusion, etc.Application context
sera vivant jusqu'à la fin de l'application.getActivity()
outhis
rendra votre application consciente de l'écran actuel, qui est également visible, ainsi que les détails du niveau d'application fournis parapplication context
. Donc, tout ce que vous voulez savoir sur l'écran actuelWindow
ActionBar
Fragementmanger
est disponible dans ce contexte. Fondamentalement etActivity
étendreContext
. Ce contexte sera vivant jusqu'à ce que le composant (activité) actuel soit vivantla source
Qu'est-ce qu'un contexte? Personnellement, j'aime considérer le contexte comme l'état de votre demande à tout moment. Le contexte d'application représente une configuration globale ou de base de votre application et une activité ou un service peut s'appuyer dessus et représente une instance de configuration de votre application ou un état transitif pour celle-ci.
Si vous regardez la source pour android.content.Context, vous voyez que Context est une classe abstraite et les commentaires sur la classe sont les suivants:
Interface vers des informations globales sur un environnement d'application. Il s'agit d'une classe abstraite dont l'implémentation est fournie par le système Android. Il permet l'accès aux
application-specific
ressources et aux classes, ainsi que des appels d'ups pour desapplication-level
opérations telles que le lancement d'activités, la diffusion et la réception d'intentions, etc. Ressources. Les ressources au niveau de l'application peuvent accéder à des éléments tels que des ressources[getResources()]
ou des actifs String[getAssets()]
et les ressources au niveau du système sont tout ce à quoi vous accédez avecContext.getSystemService().
En fait, regardez les commentaires sur les méthodes et ils semblent renforcer cette notion:
getSystemService()
: Renvoyer le descripteur à unsystem-level
service par son nom. La classe de l'objet retourné varie selon le nom demandé.getResources()
: Renvoyer une instance de ressources pour le package de votre application.getAssets()
: Renvoyer une instance de ressources pour le package de votre application. Il peut être utile de souligner que dans la classe abstraite Context, toutes les méthodes ci-dessus sont abstraites! Une seule instance de getSystemService (Class) a une implémentation et qui appelle une méthode abstraite. Cela signifie que leur implémentation devrait être fournie principalement par les classes d'implémentation, qui comprennent:En regardant la documentation de l'API, la hiérarchie des classes ressemble à ceci:
Le contexte
| - ContextWrapper
| - - Application
| - - ContextThemeWrapper
| - - - - Activité
| - - Un service
| - - - IntentService
Puisque nous savons que
Context
lui - même ne fournit aucun aperçu, nous descendons l'arbre et jetons un coup d'œil àContextWrapper
et réalisons qu'il n'y a pas grand-chose non plus. Étant donné que l'application s'étendContextWrapper
, il n'y a pas grand-chose à voir non plus, car il ne remplace pas l'implémentation fournie parContextWrapper
. Cela signifie que l'implémentation de Context est fournie par le système d'exploitation et est masquée par leAPI
. Vous pouvez jeter un œil à l'implémentation concrète de Context en consultant la source de la classe ContextImpl.la source
Je ne l'ai utilisé que
getBaseContext
lors du grillage d'unonClick
(noob très vert à la fois Java et Android). Je l'utilise lorsque mon clicker est directement dans l'activité et je dois l'utilisergetBaseContext
dans un clicker interne anonyme. Je suppose que c'est à peu près le truc avecgetBaseContext
, c'est peut-être retourner le contexte de l'activité dans laquelle se cache la classe interne.la source
MyActivity.this
. L'utilisation du contexte de base tel que vous le décrivez ne causera probablement pas de problèmes mais c'est faux.