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

121

Je suis nouveau android et je suis en train de comprendre la différence entre getApplication(), getApplicationContext(), getBaseContext(), getContext()et someClass.thissurtout quand utiliser les ces méthodes dans les lignes de code suivantes:

Quand je lance un toast, quelle est la différence entre ces derniers 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();

même avec les intentions:

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);
Pheonix7
la source
Copie
ils ne gèrent que le contexte et baseContext. mais j'aimerais comprendre tous leurs usages dans les 2 contextes. merci
Pheonix7

Réponses:

215

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

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

  1. Contexte de l'application
  2. Contexte de l'activité

Le contexte de l' application est attaché au cycle de vie de l'application et sera toujours le même tout au long de la vie de l'application. Donc, si vous utilisez Toast , vous pouvez utiliser le contexte d'application ou même le contexte d'activité (les deux) car un toast peut être levé de n'importe où dans votre application et n'est pas attaché à une fenêtre.

Le contexte de l' activité est attaché au cycle de vie de l'activité et peut être détruit si l'activité onDestroy()est augmentée. Si vous souhaitez lancer une nouvelle activité, vous devez utiliser le contexte de l'activité dans son intention afin 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 un indicateur Intent.FLAG_ACTIVITY_NEW_TASKdans l'intention pour la traiter comme une nouvelle tâche.

En se référant maintenant à vos cas:

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

getApplication() bien qu'elle fasse référence à l'objet Application, mais la classe Application étend la classe Context, de sorte qu'elle peut ê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 avez besoin de manipuler, Viewsoptez pour Activity-Context , sinon Application-Context suffirait.

waqaslam
la source
11
Donc, si je fais les choses correctement, someClass.this, getBaseContext et getContext () sont des contextes d'activité tandis que getApplicationContext () et getApplication () sont des contextes d'application?
Pheonix7
le contexte est juste une information sur un environnement, n'est-ce pas?
committedandroider
Oui, c'est comme le bac à sable qui héberge l'application
waqaslam
@committedandroider car le contexte d'activité contient des informations supplémentaires pour le thème choisi, donc lorsque les vues sont créées dans le code, le thème correct sera appliqué automatiquement. Pour plus d'informations, vous pouvez lire ceci
waqaslam
@waqaslam se référant aux classes android sdk, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; et getBaseContext()est la méthode de ContextWrapper, getBaseContext() offers activity context.ainsi que Application Contextaussi ... n'est-ce pas?
Bhuro le
26

La réponse par Waqas est très claire et complète, mais je voudrais préciser davantage la différence entre l' utilisation par thisrapport à getBaseContext(), ou getApplication()contre getApplicationContext(). Les deux Activityet Applicationne s'étendent pas Context, mais ContextWrapper, qui est un

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

Ce contexte «réel» est ce que vous obtenez en utilisant getBaseContext().

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

  • (a) ne font pas référence au même objet ( this != getBaseContext()) et
  • (b) appeler le contexte par thisest 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()contre getApplicationContext().

AlexR
la source
En ce qui le getBaseContext()concerne, les développeurs Android de Google ont suggéré ceci: "N'utilisez pas getBaseContext (), utilisez simplement le contexte que vous avez." Donc, en fait, ils vous suggèrent d'utiliser thispour les activités.
ChuongPham
c'est l'explication la plus claire que getBaseContextj'ai trouvée sur Internet. Merci!!
q126y le
6
LoginActivity.this 

la ligne ci-dessus est une activité qui est évidemment un contexte .. cela est utilisé 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 car cela Contextdure jusqu'à ce que l'application s'arrête.

getBaseContext()

ce contexte est disponible pour les widgets et les vues.

Mais tous donnent un objet Contexte et rien d'autre.

ngesh
la source
donc dans un message toast ou lors de la création d'un intent, ils ont tous le même effet, même si l'utilisation de getApplicationContext () est la plus correcte?
Pheonix7
1
@Hassan Samii: Pour Toast, vous pouvez utiliser getApplicationContext()pour toutes les situations, mais il est préférable de l'utiliser thislorsque vous créez Toast dans une activité.
ChuongPham
0

Class.this utilisé si votre classe étend Activity getapplication () used refer application and application extend application context getbasecontext () refer your activity context context refer to your activity life cycle context applicationcontext refer to your app life cycle

chandrakant Chaturvedi
la source