我的项目是使用主从导航构建的。列表中共有三个页面,分别命名为 Resources、Contacts 和 Login。在 iOS 中一切正常,但是当用户按下 Droid/WinPhone 设备硬件后退按钮时,应用程序应该退出。是否有适用于所有设备的 Xamarin Forms 应用程序退出机制?(我的意思是本机代码不依赖于平台)提前致谢。
5 回答
我就是这样做的
在 xamarin 表单中,我添加了界面
public interface INativeHelper
{
void CloseApp();
}
在android项目中,我实现了INativeHelper
public class NativeHelper : INativeHelper
{
public void CloseApp()
{
Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
}
}
IOS中INativeHelper的实现
public class NativeHelper : INativeHelper
{
public void CloseApp()
{
Process.GetCurrentProcess().CloseMainWindow();
Process.GetCurrentProcess().Close();
}
}
然后只需在 Xamarin.Forms 项目的页面中覆盖方法 OnBackButtonPressed
protected override bool OnBackButtonPressed()
{
INativeHelper nativeHelper = null;
nativeHelper = DependencyService.Get<INativeHelper>();
if (nativeHelper != null)
{
nativeHelper.CloseApp();
}
return base.OnBackButtonPressed();
}
我没有为 WinPhone 做实现,但应该是类似的。
按下物理后退按钮时,您可以使用 DepedencyService 关闭应用程序:
在您的 UI (PCL) 中,执行以下操作:
protected override bool OnBackButtonPressed()
{
if (Device.OS == TargetPlatform.Android)
DependencyService.Get<IAndroidMethods>().CloseApp();
return base.OnBackButtonPressed();
}
现在在您的 Android 项目中实现特定于 Android 的逻辑:
[assembly: Xamarin.Forms.Dependency(typeof(AndroidMethods))]
namespace Your.Namespace
{
public class AndroidMethods : IAndroidMethods
{
public void CloseApp()
{
Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
}
}
}
还要创建一个接口(在您的 UI PCL 中):
public interface IAndroidMethods
{
void CloseApp();
}
据我所知,在 Xamarin 应用程序中没有退出应用程序的本机方式。
唯一的方法是使用依赖服务。覆盖 ContentPage 中的 OnBackButtonPressed 函数并检查它是否为最后一页:
protected override bool OnBackButtonPressed()
{
if(navigation.NavigationStack.Count == 1)//navigation is MainPage.Navigation
DependencyService.Get<YourDependencyInterface>().CloseApp();
}
对于YourAndroidDependency 类中的Android :
public void CloseApp()
{
(Xamarin.Forms.Forms.Context as Activity).Finish();
}
至于WinPhone,我不确定,但我相信它可以以同样的方式完成 - 依赖服务。
尝试了以上所有方法后,我发现以上方法均不适用于具有最新版本 Android 的 Google Pixel 3a
最接近的命令是
Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
但是,它使应用程序的剩余部分在后台仍然可见。
从 Android Main Activity 调用时,以下内容对我有用
public void ExitApp()
{
this.FinishAndRemoveTask();
Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
}
第一行 FinishAndRemoveTask 从前台和后台删除应用程序,但是 Application 进程仍然处于活动状态,因此需要第二个命令。
这是找到的更简单的方法:
public void QuitApp(object sender, EventArgs args)
{
Process.GetCurrentProcess().CloseMainWindow();
Process.GetCurrentProcess().Close();
}
PS:在安卓中测试