XamarinForms Shell OnResume-显示上一页
我想在XF 4.5.0 Shell应用程序中实现锁定机制 我有一个静态计时器,它可以计算经过的秒数,并根据一些逻辑显示用户在将应用程序放在后面之前的屏幕(用户转到instagram,但应用程序在后台运行) 因此,我的XamarinForms Shell OnResume-显示上一页,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我想在XF 4.5.0 Shell应用程序中实现锁定机制 我有一个静态计时器,它可以计算经过的秒数,并根据一些逻辑显示用户在将应用程序放在后面之前的屏幕(用户转到instagram,但应用程序在后台运行) 因此,我的OnResume()方法如下所示: private bool IsUserExists() { if (!string.IsNullOrWhiteSpace(GlobalAppSettings.Email) && !string
OnResume()
方法如下所示:
private bool IsUserExists()
{
if (!string.IsNullOrWhiteSpace(GlobalAppSettings.Email) && !string.IsNullOrWhiteSpace(GlobalAppSettings.Password) && !string.IsNullOrWhiteSpace(GlobalAppSettings.Pin))
{
return true;
}
else
{
return false;
}
}
protected override void OnResume()
{
if ((!OnSleepOrPauseTime.HasValue || OnSleepOrPauseTime.Value.AddSeconds(5) <= DateTime.Now)
&&(IsUserExists()))
{
Xamarin.Forms.Device.BeginInvokeOnMainThread(async () =>
{
await Shell.Current.GoToAsync(Routes.LoginPinPage, false);
});
}
}
private bool IsUserExists()
{
如果(!string.IsNullOrWhiteSpace(GlobalAppSettings.Email)和&!string.IsNullOrWhiteSpace(GlobalAppSettings.Password)和&!string.IsNullOrWhiteSpace(GlobalAppSettings.Pin))
{
返回true;
}
其他的
{
返回false;
}
}
受保护的覆盖void OnResume()
{
如果(!OnSleepOrPauseTime.HasValue | | OnSleepOrPauseTime.Value.AddSeconds(5)
{
wait Shell.Current.GoToAsync(Routes.LoginPinPage,false);
});
}
}
问题:用户在屏幕上看到他之前所在的位置大约半秒钟,然后它重定向到LoginInput
快乐的路径应该是,用户不会看到退出应用程序之前闪烁的页面,而是立即锁定屏幕
可能的解决方案:在离开应用程序以某种方式将后台应用程序重定向到登录pin屏幕之前,我突然想到了这一点。PushAsync有两个重载- 默认情况下,
PushAsync
方法使用动画推送新页面。我认为这就是您所指的所谓“闪烁”。
您可以尝试使用第二个重载并将false传递给animated
属性,看看它是否有任何区别
PushAsync(新登录输入页(),false);
如果你想在应用程序离开时重定向用户-你可以使用另一个应用程序的生命周期方法-在睡眠中调用你的导航。但是我建议先在没有动画的情况下尝试
请记住,如果您选择使用OnSleep
方法,您还必须在不使用动画的情况下推送页面。我刚刚测试了使用动画推送,我确实看到了您提到的闪烁。将动画
标志设置为false,可以为我删除任何闪烁。PushAsync有2个重载-
默认情况下,PushAsync
方法使用动画推送新页面。我认为这就是您所指的所谓“闪烁”。
您可以尝试使用第二个重载并将false传递给animated
属性,看看它是否有任何区别
PushAsync(新登录输入页(),false);
如果你想在应用程序离开时重定向用户-你可以使用另一个应用程序的生命周期方法-在睡眠中调用你的导航。但是我建议先在没有动画的情况下尝试
请记住,如果您选择使用OnSleep
方法,您还必须在不使用动画的情况下推送页面。我刚刚测试了使用动画推送,我确实看到了您提到的闪烁。将动画
标志设置为false,可以为我删除任何闪烁。行为或者动画变为false也是一样。在荣誉移动android 9上测试,你在OnSleep方法中有什么逻辑吗?另外,这是OnResume方法中唯一的代码吗?是否可能IsUserExists花费了一点时间并且阻止了检查?请看我的更新。我还使用了私有方法IsuesResists()
。我没有覆盖OnSleep()方法,yetI在OnResume()中对所有内容都进行了注释方法除了重定向到一个PinPage之外,还是一样的,我可以看到上一页。我看到你改变了推新页的方式-你使用的不是Navigation的PushAsync方法,而是Shell的GoToAsync方法。我没有用这种方式测试它。如果它再次闪烁,那么我建议你试试OnSleep方法。不幸的是,我没有我不知道推的逻辑是什么(OnSleepOrPauseTime道具),但您可以尝试将其放在那里。如果它在应用程序放在后台后计算秒数,您可以启动计时器并使用它来计算秒数。该行为与动画变为false时的行为相同。在荣誉移动android 9上测试,您在OnSleep方法中是否有任何逻辑?此外,这是OnResume方法中唯一的代码吗?是吗可能IsUserExists花费了一些时间,并且阻止了检查?请查看我的更新。我还使用了私有方法IsuesResists()
。我没有覆盖方法OnSleep(),yetI在OnResume()中对所有内容进行了注释方法除了重定向到一个PinPage之外,还是一样的,我可以看到上一页。我看到你改变了推新页的方式-你使用的不是Navigation的PushAsync方法,而是Shell的GoToAsync方法。我没有用这种方式测试它。如果它再次闪烁,那么我建议你试试OnSleep方法。不幸的是,我没有我不知道推的逻辑是什么(OnSleepOrPauseTime道具),但您可以尝试将其放在那里。如果它在应用程序放在后台后计算秒数,您可以启动计时器并使用它计算秒数。如果您想在后台实现计时功能,在Android中,当您的应用程序是后台时,您应该使用forground service和AlarmManager
来实现,您应该使用dependency serivce打开forground服务(使应用程序在后台保持活动状态),使用AlarmManager
计时,计时结束后,使用MessageCenter从Droid向PCL发送消息,然后导航登录ping屏幕。@LeonLu MSFT基本上奇怪的是,有些人没有一些nuget或Resume()锁屏示例?