我遇到了几个Dependency Services同样的问题
最简单的解决方案
单活动应用程序
在很多情况下
Xamarin.Forms.Forms.Context
可以替换为
Android.App.Application.Context
更详细的背景
Android.App.Application.Context 返回与应用程序生命周期相关联的当前进程的全局应用程序上下文,与 Activity 上下文相对。
使用 Application 上下文的典型示例是启动 Activity,例如
Android.App.Application.Context.StartActivity(myIntent);
一般的经验法则是使用当前的活动上下文,除非你需要
保存对超出您的对象的上下文的引用
活动。在这种情况下使用应用程序上下文
为什么 Forms.Context 过时了?
Xmarin.Forms 2.5 引入了新的“表单嵌入”功能,可以将表单页面嵌入到 Xamarin.iOS / Xamarin.Android 应用中。但是,由于 Xamarin.Android 应用程序可以使用多个活动,因此Xamarin.Android 用户似乎存在调用Forms.Context 并反过来获得对MainActivity 的引用的危险,这可能会导致问题。
解决方法
在渲染器中,您现在获得了对视图上下文的引用,该引用被传递到构造函数中。
对于任何其他类,您都面临如何获取活动上下文的问题。在单个 Activity 应用程序(大多数情况下)Application.Context 可以正常工作。
但是,要在多活动应用程序中获取当前活动上下文,您需要持有对它的引用。最简单、最可靠的方法是通过实现Application.IActivityLifecycleCallbacks 接口的class。
主要思想是在 Activity 时保持 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) { }
}
通过上述方法,单个 Activity 应用程序和多个 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