3

我的项目是使用主从导航构建的。列表中共有三个页面,分别命名为 Resources、Contacts 和 Login。在 iOS 中一切正常,但是当用户按下 Droid/WinPhone 设备硬件后退按钮时,应用程序应该退出。是否有适用于所有设备的 Xamarin Forms 应用程序退出机制?(我的意思是本机代码不依赖于平台)提前致谢。

4

5 回答 5

8

我就是这样做的

在 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 做实现,但应该是类似的。

于 2016-10-26T07:26:01.013 回答
3

按下物理后退按钮时,您可以使用 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();
}
于 2016-10-27T11:20:56.023 回答
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,我不确定,但我相信它可以以同样的方式完成 - 依赖服务。

于 2016-10-26T07:30:07.923 回答
1

尝试了以上所有方法后,我发现以上方法均不适用于具有最新版本 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 进程仍然处于活动状态,因此需要第二个命令。

于 2020-01-24T07:56:54.623 回答
0

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

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

PS:在安卓中测试

于 2019-03-25T13:28:21.933 回答