web-dev-qa-db-fra.com

Xamarin.Forms: Forms.Context est obsolète

Le nouvel avertissement obsolète dans Xamarin.Forms 2.5 m'a vraiment laissé perplexe ... Quel contexte dois-je utiliser dans les services de dépendance, par exemple, pour appeler GetSystemService ()?

Devrais-je stocker dans un champ statique le contexte d'activité contre lequel les formulaires xamarin ont été initialisés?

Devrais-je remplacer la classe d'applications Android et utiliser son contexte?

Devrais-je appeler GetSystemService à l’activity create et le sauvegarder quelque part?

17
Anton Duzenko

J'avais le même problème avec plusieurs Dependency Services

La solution la plus simple

Dans beaucoup de cas pour applications à activité unique

Xamarin.Forms.Forms.Context

Peut être remplacé par

Android.App.Application.Context

Le fond plus en détail

Android.App.Application.Context renvoie le contexte d'application global du processus en cours lié au cycle de vie de l'application, tel qu'il est associé à un contexte d'activité.

Un exemple typique d'utilisation du contexte d'application concerne le démarrage d'une activité, par exemple.

Android.App.Application.Context.StartActivity(myIntent);

La règle générale consiste à utiliser le contexte d'activité actuel, sauf si vous avez besoin de enregistrer une référence à un contexte à partir d'un objet qui vit au-delà de votre Activité. Dans quel cas utiliser le contexte d'application

Pourquoi Forms.Context est-il devenu obsolète?

(Xmarin.Forms 2.5} _ a introduit une nouvelle fonctionnalité "d'intégration de formulaires", qui permet d'incorporer des pages de formulaires dans les applications Xamarin.iOS/Xamarin.Android. Cependant, étant donné que les applications Xamarin.Android peuvent utiliser plusieurs activités, il semble qu'il y ait un risque que les utilisateurs de Xamarin.Android appellent Forms.Context et obtiennent à leur tour une référence à la MainActivity, ce qui peut poser problème.

Le travail autour

Dans un moteur de rendu, vous obtenez maintenant une référence au contexte de la vue qui est transmise au constructeur.

Avec n'importe quelle autre classe, vous êtes confronté à la question de savoir comment obtenir le contexte d'activité. Dans une application Single Activity} _ (dans la plupart des cas), le Application.Context fonctionnera correctement. 

Cependant, pour obtenir le contexte d'activité en cours dans une application à activités multiples, vous devez y conserver une référence. Le moyen le plus simple et le plus fiable de procéder consiste à utiliser une variable class qui implémente l'interface Application.IActivityLifecycleCallbacks.

L'idée principale est de conserver une référence du contexte lors d'une activité est créé, démarré ou repris.

[Application]
public partial class MainApplication : Application, Application.IActivityLifecycleCallbacks
{
   internal static Context ActivityContext { get; private set; }

   public MainApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) { }

   public override void OnCreate()
   {
      base.OnCreate();
      RegisterActivityLifecycleCallbacks(this);
   }    

   public override void OnTerminate()
   {
      base.OnTerminate();
      UnregisterActivityLifecycleCallbacks(this);
   }  

   public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
   {
      ActivityContext = activity;
   }   

   public void OnActivityResumed(Activity activity)
   {
      ActivityContext = activity;
   }

   public void OnActivityStarted(Activity activity)
   {
      ActivityContext = activity;
   }

   public void OnActivityDestroyed(Activity activity) { }  
   public void OnActivityPaused(Activity activity) { }
   public void OnActivitySaveInstanceState(Activity activity, Bundle outState) { }
   public void OnActivityStopped(Activity activity) { }
}

Avec l'approche ci-dessus, applications à activité unique et applications à activités multiples peuvent désormais toujours avoir accès au contexte d'activité en cours/local. par exemple au lieu de compter sur le contexte global 

Android.App.Application.Context 

// or previously

Xamarin.Forms.Forms.Context

Peut maintenant être remplacé par 

MainApplication.ActivityContext

Exemple d'appel dans un service de dépendance

if (MainApplication.ActivityContext!= null)
{
    versionNumber = MainApplication.ActivityContext
                       .PackageManager
                       .GetPackageInfo(MainApplication.ActivityContext.PackageName, 0)
                       .VersionName;
}

Ressources supplémentaires

Android.App.Application.IActivityLifecycleCallbacks

registerActivityLifecycleCallbacks

45
Michael Randall