首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin.Forms: Forms.Context已过时

Xamarin.Forms: Forms.Context已过时
EN

Stack Overflow用户
提问于 2017-11-17 23:24:10
回答 2查看 24.6K关注 0票数 33

Xamarin.Forms 2.5中新的过时警告真的让我感到困惑。例如,我应该在依赖项服务中使用什么上下文来调用GetSystemService()?

我应该在静态字段中存储初始化xamarin表单所针对的活动的上下文吗?

我是否应该重写android Application类并使用它的上下文?

我应该在activity create中调用GetSystemService并将其保存在某个地方吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-18 14:49:43

我在几个Dependency Services上也遇到了同样的问题

最简单的解决方案

单活动应用程序的许多情况下,

代码语言:javascript
复制
Xamarin.Forms.Forms.Context

可以替换为

代码语言:javascript
复制
Android.App.Application.Context

更详细的背景

Android.App.Application.Context返回与应用程序的生命周期相关的当前流程的全局应用程序上下文,而不是活动上下文。

使用应用程序上下文的典型示例是用于启动活动,例如

代码语言:javascript
复制
Android.App.Application.Context.StartActivity(myIntent);

一般的经验法则是使用当前活动上下文,除非您需要保存活动之外的对象对上下文的引用。在这种情况下,请使用应用程序上下文

为什么Forms.Context会过时?

Xmarin.Forms 2.5引入了一个新的“表单嵌入”功能,可以将表单页面嵌入到Xamarin.iOS / Xamarin.Android应用程序中。然而,由于Xamarin.Android应用程序可以使用多个活动,似乎存在Xamarin.Android用户调用Forms.Context并获得对MainActivity的引用的危险,这可能会导致问题。

解决问题的方法

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

对于任何其他类,您都面临着如何获取活动上下文的问题。在单活动应用程序(大多数情况下)中,Application.Context可以很好地工作。

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

主要思想是在创建、启动或恢复活动时保留上下文的引用。

代码语言:javascript
复制
[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) { }
}

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

代码语言:javascript
复制
Android.App.Application.Context 

// or previously

Xamarin.Forms.Forms.Context

现在可以替换为

代码语言:javascript
复制
MainApplication.ActivityContext

依赖项服务中的示例调用

代码语言:javascript
复制
if (MainApplication.ActivityContext!= null)
{
    versionNumber = MainApplication.ActivityContext
                       .PackageManager
                       .GetPackageInfo(MainApplication.ActivityContext.PackageName, 0)
                       .VersionName;
}

其他资源

Android.App.Application.IActivityLifecycleCallbacks

registerActivityLifecycleCallbacks

票数 82
EN

Stack Overflow用户

发布于 2018-06-01 17:26:28

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

CrossCurrentActivity.Current.Activity.StartActivity(myIntent)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47353986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档