Xamarin.Forms:Forms.Context已过时

时间:2017-11-17 15:24:10

标签: xamarin.forms

Xamarin.Forms 2.5中新的过时警告真让我困惑。 我应该在Dependency Services中使用什么上下文,例如,调用GetSystemService()?

我是否应该在静态字段中存储xamarin表单的活动上下文?

我应该覆盖android Application类并使用它的Context吗?

我应该在活动创建时调用GetSystemService并将其保存在某个地方吗?

2 个答案:

答案 0 :(得分:50)

我遇到了几个Dependency Services

的问题

最简单的解决方案

单一活动应用

的很多情况
Xamarin.Forms.Forms.Context

可以替换为

Android.App.Application.Context

背景更详细

Android.App.Application.Context返回绑定到Application生命周期的当前进程的全局Application Context,与Activity上下文相关联。

使用Application上下文的典型示例是启动Activity,例如

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

一般的经验法则是使用当前的活动上下文,除非您需要   保存对超出您的对象的对象的上下文的引用   活动。在这种情况下使用Application上下文

为什么Forms.Context过时了?

Xmarin.Forms 2.5 引入了一个新的" Forms嵌入"功能,可以将表单页面嵌入到Xamarin.iOS / Xamarin.Android应用程序中。但是,由于Xamarin.Android应用程序可以使用多个活动,因此Xamarin.Android用户有可能会调用Forms.Context,并反过来获取对MainActivity的引用,这可能会导致问题

解决方法

在渲染器中,您现在可以获得对视图上下文的引用,该上下文将传递给构造函数。

对于任何其他类,您将面临如何获取活动上下文的问题。在单个活动应用(在大多数情况下)Application.Context将正常工作。

但是要在多活动应用程序中获取当前活动上下文,您需要保留对它的引用。最简单,最可靠的方法是通过实现class接口的Application.IActivityLifecycleCallbacks

  

主要思想是在活动时保留Context的引用   创建,启动或恢复。

[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) { }
}

通过上述方法,单个活动应用程序多个活动应用程序现在始终可以访问当前/本地活动上下文。例如,而不是依赖于全球背景

Android.App.Application.Context 

// or previously

Xamarin.Forms.Forms.Context

现在可以替换为

MainApplication.ActivityContext

依赖关系服务中的示例调用

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

其他资源

Android.App.Application.IActivityLifecycleCallbacks

registerActivityLifecycleCallbacks

答案 1 :(得分:1)

在新的Xamarin Forms解决方案的最新支架中,在Android项目中引用了CrossActivityPlugin(https://github.com/jamesmontemagno/CurrentActivityPlugin)。所以你可以使用

CrossCurrentActivity.Current.Activity.StartActivity(myIntent)