Xamarin.Forms:Forms.Context已过时

Xamarin.Forms:Forms.Context已过时,xamarin.forms,Xamarin.forms,Xamarin.Forms 2.5中新的过时警告确实让我感到困惑。 例如,我应该在依赖项服务中使用什么上下文来调用GetSystemService() 我是否应该将xamarin表单初始化所针对的活动的上下文存储在静态字段中 我应该重写android应用程序类并使用其上下文吗 我应该在activity create中调用GetSystemService并将其保存在某个位置吗?我在几个依赖项服务中遇到了相同的问题 最简单的解决方案 在许多情况下,单活动应用程序 Xamarin.Forms.Form

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

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

我应该重写android应用程序类并使用其上下文吗


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

我在几个
依赖项服务中遇到了相同的问题

最简单的解决方案 在许多情况下,单活动应用程序

Xamarin.Forms.Forms.Context
可以替换为

Android.App.Application.Context

更详细地介绍背景
Android.App.Application.Context
返回与应用程序生命周期相关的当前进程的全局应用程序上下文,与活动上下文对应

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

Android.App.Application.Context.StartActivity(myIntent);
一般的经验法则是使用当前活动上下文,除非您需要 保存对超出您权限范围的对象的上下文引用的步骤 活动。在这种情况下,请使用应用程序上下文

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

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

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

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

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

通过上述方法,单个活动应用程序多个活动应用程序现在可以始终访问当前/本地活动上下文。e、 g而不是依赖全球环境

Android.App.Application.Context 

// or previously

Xamarin.Forms.Forms.Context
现在可以替换为

MainApplication.ActivityContext

依赖项服务中的示例调用
额外资源


在新Xamarin表单解决方案的最新框架中,Android项目中引用了CrossActivityPlugin()。所以你可以用


CrossCurrentActivity.Current.Activity.StartActivity(myIntent)

这似乎不适用于CustomTablesActivityManager(Android.App.Application.Context作为活动)。有什么选择吗?@Shubhan你能不能只传入父活动?我没有,我有一个用于打开web链接的界面实现。在这种情况下,无法发送特定于设备的参数、活动。我看到的选项是活动中的静态对象,这是一个糟糕的设计
MainApplication.ActivityContext
if (MainApplication.ActivityContext!= null)
{
    versionNumber = MainApplication.ActivityContext
                       .PackageManager
                       .GetPackageInfo(MainApplication.ActivityContext.PackageName, 0)
                       .VersionName;
}