435 votes

getApplication() vs getApplicationContext()

Je ne pouvais pas trouver une réponse satisfaisante à cette, allons-y alors: qu'est-ce qu' Activity/Service.getApplication() et Context.getApplicationContext()?

Dans notre application, à la fois retour le même objet. Dans un ActivityTestCase cependant, se moquant de l'application getApplication() de revenir avec la maquette, mais getApplicationContext reviendra encore une autre instance de contexte (celui injecté par Android). C'est qu'un bug? Est-ce à dessein?

Je ne comprends même pas la différence dans la première place. Existe-il des cas à l'extérieur d'une suite de test où les deux appels peuvent revenir avec des objets différents? Quand et pourquoi? Par ailleurs, pourquoi est - getApplication défini sur Activity et Service, mais pas sur Context? Ne devrait-il pas toujours être valide, l'instance de l'application disponible à partir de n'importe où?

381voto

Piwaï Points 2891

Question très intéressante. Je pense que c'est surtout une signification sémantique, et peut également être due à des raisons historiques.

Bien que dans le courant Android Activité et de Service, les implémentations, getApplication() et getApplicationContext() retour le même objet, il n'y a aucune garantie que ce sera toujours le cas (par exemple, un fournisseur spécifique de mise en œuvre).

Donc, si vous voulez la classe d'Application que vous avez enregistré dans le Manifeste, vous devriez ne jamais les appeler getApplicationContext() le et jette-le à votre demande, car il ne peut pas être l'instance de l'application (ce qui de toute évidence vous expérimenté avec le framework de test).

Pourquoi est - getApplicationContext() existe, en premier lieu ?

getApplication() n'est disponible que sur l'Activité de la classe et dans la classe de Service, alors que getApplicationContext() est déclaré dans le Contexte de la classe.

Que signifie en fait qu'une chose : lors de l'écriture de code dans un récepteur de radiodiffusion, ce qui n'est pas un contexte, mais est dans un contexte donné, dans sa méthode onReceive, vous pouvez uniquement appeler getApplicationContext(). Ce qui signifie également que vous n'êtes pas la garantie d'avoir accès à votre application dans un BroadcastReceiver.

Quand on regarde le code Android, vous voyez que lorsqu'il est attaché, une activité reçoit une base de contexte et d'une demande, et ceux qui sont différents paramètres. getApplicationContext() délègue à l'appel à l' baseContext.getApplicationContext().

Une chose de plus : la documentation dit que la plupart des cas, vous ne devriez pas sous-classe de l'Application:

Il n'est normalement pas nécessaire pour sous - Application. Dans la plupart des situation, statique des singletons peuvent fournir les mêmes fonctionnalités dans un plus modulaire façon. Si votre singleton a besoin d'un contexte global (par exemple pour vous inscrire récepteurs de radiodiffusion), la fonction de récupération, il peut être donné une Context qui utilise en interne Context.getApplicationContext()lorsque d'abord la construction de l'singleton.

Je sais que ce n'est pas exact de réponse précise, mais encore, ne fait que répondre à votre question?

33voto

usethe4ce Points 4752

Il semble avoir à faire avec le contexte de l'emballage. La plupart des classes dérivées Context sont en fait une ContextWrapper, qui délègue à un autre contexte, peut-être avec les modifications apportées par le wrapper.

Le contexte est un général de l'abstraction qui prend en charge les moqueries et l'utilisation de proxy. Depuis de nombreux contextes sont liés à une limitée-durée de vie d'un objet, tel qu'un Activity, il doit y avoir un moyen d'obtenir une plus longue durée de contexte, à des fins telles que l'enregistrement de l'avenir des notifications. Qui est atteint par Context.getApplicationContext(). Une logique de mise en œuvre est le retour de l'global Application objet, mais rien n'empêche un contexte de mise en œuvre de retourner un emballage ou un proxy avec une durée de vie appropriée à la place.

Les activités et les services sont plus particulièrement associées à un Application objet. L'utilité de tout cela, je crois, c'est que vous pouvez créer et enregistrer dans le manifeste d'une classe dérivée de l' Application et Activity.getApplication() ou Service.getApplication() sera de retour cet objet spécifique d'un type spécifique, vous pouvez diffuser à votre dérivé Application classe et de l'utiliser pour quel que soit personnalisé but.

En d'autres termes, getApplication() est garanti pour retourner un Application objet, alors que l' getApplicationContext() est libre de retourner une procuration à la place.

29voto

RivieraKid Points 4618

Comparer getApplication() et getApplicationContext().

getApplication renvoie un Application objet qui va vous permettre de gérer votre application à l'échelle mondiale de l'état et de répondre à des situations de périphérique comme onLowMemory() et onConfigurationChanged().

getApplicationContext renvoie le mondial de contexte de l'application - à la différence d'autres contextes, c'est que par exemple, un contexte d'activité peuvent être détruits (ou autrement rendu disponible) par Android lorsque votre activité se termine. Le contexte de l'Application reste disponible tout le temps de votre Demande objet existe (ce qui n'est pas lié à une Activity) de sorte que vous pouvez l'utiliser pour des choses comme les Notifications qui nécessitent un contexte qui sera disponible pour des périodes plus longues et indépendant de transitoire objets de l'INTERFACE utilisateur.

Je suppose que ça dépend de ce que votre code est fait de savoir s'il peut ou non être la même - bien que dans des conditions normales d'utilisation, je m'attends à être différent.

-13voto

Lenny Porter Points 19

Pour répondre à la question, getApplication() retourne un objet Application et getApplicationContext() retourne un objet de contexte. Basé sur vos propres observations, je suppose que le contexte des deux sont identiques (c.-à-d. dans les coulisses, l’Application appelle de classe cette dernière fonction pour remplir la partie du contexte de la classe de base ou des mesures équivalentes prend place). Il ne devrait pas vraiment d’importance quelle fonction vous appeler si vous avez juste besoin d’un contexte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X