Xamarin.Forms 2.5中新的过时警告真让我困惑.我应该在Dependency Services中使用什么上下文,例如,调用GetSystemService()?
我应该在静态字段中存储xamarin表单初始化的活动上下文吗?
我应该覆盖android Application类并使用它的Context吗?
我应该在活动创建时调用GetSystemService并将其保存在某个地方吗?
AAA*_*ddd 59
我和几个人有同样的问题 Dependency Services
在很多情况下单活动应用程序
Xamarin.Forms.Forms.Context
Run Code Online (Sandbox Code Playgroud)
可以替换
Android.App.Application.Context
Run Code Online (Sandbox Code Playgroud)
Android.App.Application.Context 返回绑定到Application生命周期的当前进程的全局Application Context,与Activity上下文相关联.
使用Application上下文的典型示例是用于启动Activity,例如
Android.App.Application.Context.StartActivity(myIntent);
Run Code Online (Sandbox Code Playgroud)
一般的经验法则是使用当前的活动上下文,除非您需要保存对超出Activity的对象的上下文的引用.在这种情况下使用Application上下文
Xmarin.Forms 2.5引入了一个新的"Forms嵌入"功能,可以将Forms页面嵌入到Xamarin.iOS/Xamarin.Android应用程序中.但是,由于Xamarin.Android应用程序可以使用多个活动,因此看起来存在Xamarin.Android用户调用的危险,Forms.Context并且反过来获得对其的引用MainActivity,这可能导致问题.
在渲染器中,您现在可以获得对视图上下文的引用,该上下文将传递给构造函数.
对于任何其他类,您将面临如何获取活动上下文的问题.在单个Activity应用程序中(在大多数情况下),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) { }
}
Run Code Online (Sandbox Code Playgroud)
通过上述方法,单个活动应用程序和多个活动应用程序现在始终可以访问当前/本地活动上下文.例如,而不是依赖于全球背景
Android.App.Application.Context
// or previously
Xamarin.Forms.Forms.Context
Run Code Online (Sandbox Code Playgroud)
现在可以替换为
MainApplication.ActivityContext
Run Code Online (Sandbox Code Playgroud)
if (MainApplication.ActivityContext!= null)
{
versionNumber = MainApplication.ActivityContext
.PackageManager
.GetPackageInfo(MainApplication.ActivityContext.PackageName, 0)
.VersionName;
}
Run Code Online (Sandbox Code Playgroud)
Android.App.Application.IActivityLifecycleCallbacks
registerActivityLifecycleCallbacks
| 归档时间: |
|
| 查看次数: |
14497 次 |
| 最近记录: |