web-dev-qa-db-fra.com

différence et quand utiliser getApplication (), getApplicationContext (), getBaseContext () et someClass.this

Je suis nouveau sur Android et j'essaie de comprendre la différence entre getApplication(), getApplicationContext(), getBaseContext(), getContext() et someClass.this et surtout quand utiliser ces méthodes dans les lignes de code suivantes:

Quand je lance un toast, quelle est la différence entre ceux-ci et dans quels cas les utiliser?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

idem avec intention:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);
111
Pheonix7

Toast et Intention , les deux nécessitent une référence à context. Et getApplication , getApplicationContext , LoginActivity.this et getBaseContext , ils offrent tous une référence au contexte.

Maintenant, la confusion est la déclaration de différents contextes et de leur utilisation spécifique. Pour simplifier les choses, vous devez compter deux types de contexte disponibles dans la structure Android.

  1. Contexte d'application
  2. Contexte d'activité

Application le contexte est lié au cycle de vie de l'application et sera toujours identique pendant toute la durée de l'application. Ainsi, si vous utilisez Toast, vous pouvez utiliser le contexte de l'application ou même le contexte de l'activité (les deux), car un pain peut être levé de n'importe où dans votre application et n'est pas attaché à une fenêtre.

Activité le contexte est lié au cycle de vie de l'activité et peut être détruit si la fonction onDestroy() de l'activité est déclenchée. Si vous souhaitez lancer une nouvelle activité, vous devez utiliser le contexte de l'activité dans Intent pour que la nouvelle activité de lancement soit connectée à l'activité en cours (en termes de pile d'activités). Cependant, vous pouvez également utiliser le contexte de l'application pour lancer une nouvelle activité, mais vous devez ensuite définir l'indicateur Intent.FLAG_ACTIVITY_NEW_TASK dans l'intention de la traiter comme une nouvelle tâche.

Maintenant, en vous référant à vos cas:

LoginActivity.this fait référence à votre propre classe, qui étend la classe d'activité, mais la classe de base (Activity) étend également la classe de contexte, de sorte qu'elle peut être utilisée pour offrir un contexte d'activité.

getApplication() fait référence à l'objet Application, mais la classe Application étend la classe Context, elle peut donc être utilisée pour offrir un contexte d'application.

getApplicationContext() offre un contexte d'application.

getBaseContext() offre un contexte d'activité.

Conseils: Chaque fois que vous devez manipuler Views, optez pour Activity-Context, sinon Application-Context serait suffisant.

192
waqaslam

La réponse de Waqas est très claire et complète, mais je voudrais préciser davantage la différence entre utiliser this contre getBaseContext(), ou getApplication() contre getApplicationContext(). Activity et Application n'allongent pas Context en elle-même, mais ContextWrapper, qui est un 

"Mise en œuvre par procuration de Context qui délègue simplement tous ses appels à un autre Context".

Ce "vrai" contexte est ce que vous obtenez en utilisant getBaseContext()

Donc, bien que this (pour Activity) et getBaseContext() donnent tous les deux le contexte de l’activité, 

  • (a) ne se réfèrent pas au même objet (this != getBaseContext()) et 
  • (b) le contexte d'appel via this est légèrement moins efficace, car les appels passent par un niveau supplémentaire d'indirection. Je doute que cela fasse une différence pratique, cependant.

La même logique s'applique à getApplication() vs getApplicationContext().

23
AlexR
LoginActivity.this 

la ligne ci-dessus est une activité qui est manifestement un contexte. Elle est utilisée lorsque vous créez des AlertDialogs ... À certains endroits, il est obligatoire d'utiliser le contexte d'activité ...

getApplication()

Idem ici, la méthode make text nécessite le contexte et l'application elle-même implémente Context 

getApplicationContext()

c'est la manière la plus préférée puisque cette Context vit jusqu'à la fermeture de l'application.

getBaseContext()

ce contexte est disponible pour les widgets et les vues.

Mais tous donnent un contexte objet et rien d’autre ..

6
ngesh

Cette classe est utilisée si votre classe étend Activity Getapplication () utilisé, application de référence et application étend le contexte de l'application Getbasecontext (), fait référence à votre contexte d'activité Context fait référence à votre contexte de cycle de vie d'activité. le cycle de vie de votre application

0