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?
J'avais le même problème avec plusieurs Dependency Services
Dans beaucoup de cas pour applications à activité unique
Xamarin.Forms.Forms.Context
Peut être remplacé par
Android.App.Application.Context
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
(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.
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
if (MainApplication.ActivityContext!= null)
{
versionNumber = MainApplication.ActivityContext
.PackageManager
.GetPackageInfo(MainApplication.ActivityContext.PackageName, 0)
.VersionName;
}