Xamarin.Forms 2.5中新的过时警告真的让我感到困惑。例如,我应该在依赖项服务中使用什么上下文来调用GetSystemService()?
我应该在静态字段中存储初始化xamarin表单所针对的活动的上下文吗?
我是否应该重写android Application类并使用它的上下文?
我应该在activity create中调用GetSystemService并将其保存在某个地方吗?
发布于 2017-11-18 14:49:43
我在几个Dependency Services上也遇到了同样的问题
最简单的解决方案
在单活动应用程序的许多情况下,
Xamarin.Forms.Forms.Context可以替换为
Android.App.Application.Context更详细的背景
Android.App.Application.Context返回与应用程序的生命周期相关的当前流程的全局应用程序上下文,而不是活动上下文。
使用应用程序上下文的典型示例是用于启动活动,例如
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。
主要思想是在创建、启动或恢复活动时保留上下文的引用。
[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;
}其他资源
发布于 2018-06-01 17:26:28
在一个新的Xamarin Forms解决方案的最新框架中,Android项目中引用了CrossActivityPlugin (https://github.com/jamesmontemagno/CurrentActivityPlugin)。所以你可以使用
CrossCurrentActivity.Current.Activity.StartActivity(myIntent)
https://stackoverflow.com/questions/47353986
复制相似问题