如何在Xamarin Forms中退出应用程序?

3

我的项目使用主细节导航来构建。列表中有三个页面,分别为资源、联系人和登录。 在 iOS 上一切正常,但当用户按下 Droid/WinPhone 设备的硬件返回按钮时,应用程序应该退出。 是否有适用于 Xamarin Forms 的应用程序退出机制,可以在所有设备上运行?(我的意思是本机代码而不是特定于平台的) 提前致谢。

6个回答

9

我是一名有用的助手,可以为您进行翻译。

在Xamarin Forms中,我添加了接口。

我是这样做的。

public interface INativeHelper
{
    void CloseApp();
}

在我的安卓项目中,我实现了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进行实现,但应该是类似的。


3
您可以使用DependencyService在按下物理返回按钮时关闭应用程序:
在您的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();
}

它像魔法一样运行得很好,Sumeet... 非常感谢你... 但我仍在努力寻找在Xamarin.Windows中退出应用程序的方法。我正在尝试自己解决,如果你能提供帮助/指导,我将不胜感激... - Senthamizh

1
据我所知,在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,我不确定,但我相信可以通过依赖服务以同样的方式完成。

你的代码帮助我让我的项目变得更好了。但是当特定页面被执行时,比如用户点击资源页面,我想要清除导航栈历史记录,有什么方法吗?顺便说一下,感谢你的时间... - Senthamizh
你可以使用 navigation.InsertPageBefore() 将 Resources 页面推入导航栏,然后调用 navigation.PopToRootAsync(),但这不是一个好主意。我的做法是: - Dima
' for (int i = 0; navigation.NavigationStack.Count > 1;) {// 释放所有页面 var page = navigation.NavigationStack.ElementAt(i); if (page.BindingContext != null && page.BindingContext is BaseViewModel) { (page.BindingContext as BaseViewModel).OnDisappearing(); page.BindingContext = null; } navigation.PopAsync(false);//无动画 navigation.RemovePage(page);//和AnimationNavigationPage一起崩溃 }' - Dima
抱歉,在编辑代码之前按了回车键。您可以使用“navigation.InsertPageBefore()”将当前页面插入,并在导航到资源页面之前调用“navigation.PopAsync(false)”作为页面数-1。 - Dima
太棒了!我使用了你的想法,幸运的是它以更好的方式得到了实现。再次感谢你! - Senthamizh

1

在尝试了上述所有方法后,我发现以上方法都无法在安装了最新版Android的Google Pixel 3a上运行。

最接近成功的命令是:

Android.OS.Process.KillProcess(Android.OS.Process.MyPid());

然而,它仍然在背景中显示应用程序的残留部分。
当从Android主活动调用以下内容时,对我有效。
    public void ExitApp()
    {
        this.FinishAndRemoveTask();
        Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
    }

第一行FinishAndRemoveTask将应用程序从前台和后台中删除,但是应用程序进程仍然处于活动状态,因此需要第二个命令。

0

你可以使用 Environment.Exit(0);


0

这是找到的更简单的方法:

public void QuitApp(object sender, EventArgs args)
{
    Process.GetCurrentProcess().CloseMainWindow();
    Process.GetCurrentProcess().Close();
}

附注:在安卓上测试过


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接