Besoin de contexte dans les classes hors activité

J’ai des classes dans mon application qui doivent appeler des fonctions Android nécessitant le contexte en tant que paramètre. Je ne l’ai pas car la classe n’est pas une sous-classe de la classe Activity.

Quelle est la bonne façon de résoudre ce problème?

  1. Passez-le en paramètre sur chaque appel?
  2. Passez-le à l’instanciation de classe et conservez-le?

Cela dépend du rôle de la classe. Mais de toute façon, passez ApplicationContext mais pas Activité 1. Si vous transmettez le contexte d’activité, gc ne peut plus le supprimer de la mémoire lorsque vous n’avez plus besoin d’activité. Mais le contexte d’application est utilisé alors que l’application n’est pas terminée par OS.Refer Évitez les memory leaks

Passez-le en paramètre. Ou mieux encore, obtenez le contexte de l’application pour éviter les memory leaks.

 public class Example { protected Context context; public Example(Context context){ this.context = context.getApplicationContext(); } } 

Je suis presque toujours avec une approche de paramètre constructeur. Je le passe dans l’instanciation et garde une référence privée dans la classe instanciée.

Vous devez penser à une chose importante. Si la classe que vous transmettez au Context existe plus longtemps que l’ Activity instanciée, vous devez utiliser le contexte d’application. Si cette classe fait des choses dans l’interface utilisateur, vous aurez besoin d’un contexte d’activité.

Assurez-vous que la classe à laquelle vous transmettez un contexte d’activité ne durera pas plus longtemps que l’ Activity ou que vous ferez toute l’activité.

Si vous ne faites pas de choses avec l’interface utilisateur, allez avec le contexte de l’application.

Je le passe en paramètre, je pense que sa meilleure forme pour le faire

Passez-le à l’instanciation de classe et conservez-le.

Un exemple typique est lorsque vous créez un assistant de firebase database. Voir ce lien

J’ai répondu à cette question ici aussi.

Vous pouvez le faire en utilisant ContextWrapper , comme décrit ici.

Par exemple:

 public class MyContextWrapper extends ContextWrapper { public MyContextWrapper(Context base) { super(base); } } 

et utiliser cette classe comme il était Contexte

Le meilleur moyen est de suivre l’approche Bean:

 public class Example { protected Context getContext() { ... } ... } 

Ensuite, cela dépend des possibilités d’access au contexte. Si la classe est totalement indépendante, le paramètre constructeur et le champ privé semblent être la meilleure approche.

Mais cette propriété de bean vous protège de toute modification ultérieure du code.