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);
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.
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.
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 autreContext
".
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é,
this != getBaseContext()
) et 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()
.
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 ..
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