【问题标题】:How to terminate a Xamarin application?如何终止 Xamarin 应用程序?
【发布时间】:2015-05-29 06:10:46
【问题描述】:

如何从任何活动中终止 Xamarin 应用程序?

我已经尝试了System.Environment.Exit(0)System.Environment.Exit(1) 以及Finish() 并杀死了所有活动。

它仍然会打开一个带有默认活动名称和黑屏的空白页面。

有什么具体的解决办法吗?

【问题讨论】:

标签: xamarin terminate


【解决方案1】:

如果您使用的是 Xamarin.Forms,请创建一个依赖服务。

界面

public interface ICloseApplication
{
    void closeApplication();
}

Android:使用FinishAffinity() 不会重新启动您的活动。它只会关闭应用程序。

public class CloseApplication : ICloseApplication
{
    public void closeApplication()
    {
        var activity = (Activity)Forms.Context;
        activity.FinishAffinity();
    }
}

IOS:正如上面已经建议的那样。

public class CloseApplication : ICloseApplication
{
    public void closeApplication()
    {
        Thread.CurrentThread.Abort();
    }
}

UWP

public class CloseApplication : ICloseApplication
{
    public void closeApplication()
    {
        Application.Current.Exit();
    }
}

在 Xamarin 表单中的使用

var closer = DependencyService.Get<ICloseApplication>();
    closer?.closeApplication();

【讨论】:

  • 谢谢!阅读他们说的其他线程,“在 iOS 中无法做到这一点”。很高兴看到有办法。
  • @Damian - 我猜苹果不会允许这样做,因为它违反了惯例,并且在基于 appstore 的 iOS 原生应用程序中,苹果监控开发人员没有使用任何私有 api 来关闭应用程序,但我我不确定你是否检查过它是否会生成任何崩溃日志只是一个想法
  • 这对我来说适用于 Android,但我必须将 [assembly: Dependency(typeof(CloseApplication))] 添加到 CloseApplication 类中才能获得依赖项服务
  • 我还必须添加依赖项。这是像我这样不得不考虑一下的其他人的语法: [assembly: Dependency(typeof(CloseApplication))] namespace MyNamespace.Droid { class CloseApplication : ICloseApplication { public void closeApplication() { var activity = (Activity )Forms.Context;活动.FinishAffinity(); } } }
  • 只是一个想法,但正如 Apple 告诉你不要这样做的那样,使用这种技术的应用很有可能无法通过苹果应用商店的审查。
【解决方案2】:

让它跨平台工作的一个简单方法是通过这个命令:

System.Diagnostics.Process.GetCurrentProcess().CloseMainWindow();

this link得到它。

编辑:使用一段时间后,我发现.CloseMainWindow() 不会杀死应用程序,只会关闭它(嗯,这很明显)。如果你想终止应用程序(杀死),你应该使用以下:

System.Diagnostics.Process.GetCurrentProcess().Kill();

【讨论】:

  • 适用于 VS2017!所有其他答案都没有
  • 在 App Store 中发布时,Apple 是否接受?对于 Google Play 商店,我不怀疑...
  • 对生产代码使用任何诊断方法都是个坏主意。请改用 System.Environment.Exit(0)
  • 已确认,适用于 Android 和 iOS
  • @Quarkly System.Environment.Exit(0) 不适用于 Android。
【解决方案3】:

对于Android,你可以这样做

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

iOS 明确不为现有应用程序提供任何 API。只有操作系统可以关闭应用程序。

【讨论】:

  • 我已经应用了这段代码,但这也给我返回了带有主要活动标题的同一个黑色页面......还有其他解决方案还是我在那里遗漏了什么?
  • 如果您想终止所有应用程序进程,请使用此选项。 (计时器、服务、蚀刻...)
  • @Zam 这可能对较新版本的 Android 无效,但与您使用的 IDE 版本无关
【解决方案4】:

对于 iOS,您可以使用以下代码:

Thread.CurrentThread.Abort();

对于 Android,正如 @Jason 在这里提到的:

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

【讨论】:

  • 我已经应用了这段代码,但这也给我返回了带有主要活动标题的同一个黑色页面......还有其他解决方案还是我在那里遗漏了什么?
  • 嗯,它适用于我的应用程序。也许您不是从主 UI 线程调用它?尝试在此 lambda 表达式中终止应用程序: Xamarin.Forms.Device.BeginInvokeOnMainThread( () => {Android.OS.Process.KillProcess(Android.OS.Process.MyPid());});如果有帮助,请告诉我。
  • 感谢您的回复。是的,我想从子线程终止应用程序,而不是主 UI 线程,我的项目在 Xamarin.Android 中而不是在 Xamarin.Forms 中,所以你能给我解决方案吗为了那个原因?再次感谢
  • 您必须在主线程上才能关闭应用程序。试试这个代码:Acitivty.RunOnUiThread(() => { Android.OS.Process.KillProcess(Android.OS.Process.MyPid()); });
  • 好的..我可以使用 int pid = Android.OS.Process.MyPid();Android.OS.Process.KillProcess(pid); 来实现这一点但它仍然显示在后台运行我的应用程序..是否有任何特定的代码?
【解决方案5】:

System.Environment.Exit(0);

为我工作。

【讨论】:

  • 非通用,在 Android 上失败。
【解决方案6】:

在您的活动中,使用此代码

this.FinishAffinity();

【讨论】:

    【解决方案7】:

    我试过这段代码

    protected override bool OnBackButtonPressed()
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                var result = await DisplayAlert("", "Would you like to exit from application?", "Yes", "No");
                if (result)
                {
                    if (Device.OS == TargetPlatform.Android)
                    {
                        Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
                    }
                    else if (Device.OS == TargetPlatform.iOS)
                    {
                       Thread.CurrentThread.Abort();
                    }
                }
            });
            return true;
        }
    

    在这种情况下,iOS 和 Android 应用程序会在用户选择终止应用程序时关闭。也许对你有帮助。

    【讨论】:

      【解决方案8】:
      System.Diagnostics.Process.GetCurrentProcess().CloseMainWindow();
      

      【讨论】:

        【解决方案9】:

        前面答案的简单多合一组合,而不是接口/依赖项:

            protected override bool OnBackButtonPressed()
            {
                Device.BeginInvokeOnMainThread(async () =>
                {
                    var result = await this.DisplayAlert("Alert!", "want to exit?", "Yes", "No");
                    if (result)
                    {
        #if __ANDROID__
                        var activity = (Android.App.Activity)Forms.Context;
                        activity.FinishAffinity();
        #endif
        #if __IOS__
                        Thread.CurrentThread.Abort();
        #endif
                    }
                });
                return true;
            }
        

        【讨论】:

        • 我不认为这实际上会关闭应用程序。它使窗口消失,但应用程序仍在运行......至少调试器在模拟器中运行时不会退出。
        • 所有实例类也保留在内存中......当你重新启动它们的实例时,这里已经充满了以前的数据。
        【解决方案10】:
        System.Diagnostics.Process.GetCurrentProcess().Kill();
        

        【讨论】:

          【解决方案11】:

          由于您的原始问题提到了活动,因此您的问题是专门针对 Android 的,您可能应该牢记这一点来更新问题标题,以避免人们在这里寻找跨平台解决方案。

          对于 iOS 和 Android(例如在 Xamarin Forms 中),您可以只抛出一个异常,这虽然是“重手”的方法,但可以完成这项工作:

          throw new Exception();
          

          由于这不是最佳的用户体验,您可能只想在 iOS 上使用它,因为在 Android 上,您可能会收到一个系统弹出窗口,告诉您应用程序崩溃了。但是,与通过选择器调用 exit(0) 或调用私有 iOS 方法(如“terminateWithSuccess”)等其他 iOS 方法不同,它不应该完全基于您的操作方式而使应用商店验证失败。它们可能仍然会让您失败,因为您的应用会尝试自行终止。

          您可能想要专门为 Android 实现一些不同的东西,在这种情况下,Jason 的回答就足够了,如果不是一点点,即使用这种方法可能不允许您的应用自行清理:

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

          无论哪种方式,您都应该真正质疑为什么需要提供此选项。与需要关闭应用程序的桌面应用程序不同,因为应用程序驻留在窗口内,这些窗口在设计上允许多任务处理并且不是面向任务的,而移动平台主要是为用户一次专注于一项任务而设计的。一旦用户完成任务,他们应该决定通过单击主页按钮、后退按钮或更改应用程序(任务)按钮来退出此任务。这确实适用于所有平台。

          【讨论】:

            【解决方案12】:

            这些都不适用于 Android 8。它们都将应用程序留在后台。 我可以通过按下全部关闭按钮来证明这一点,并且应用程序仍然存在。

            在我的测试中,我使用了一个全新的简单 Android 应用,并尝试了你所有的答案。

            【讨论】:

              【解决方案13】:

              以上方法都没有帮助我的 Xamarin Android 应用完全关闭。我试图从 Activity B 中关闭它,同时在它下面打开 Activity A。

              一个聪明人留下了一个诡计here

              1. 在活动 B 中首次调用 FinishAffinity()(关闭两个活动, 但是,该应用仍然在后台运行)
              2. 然后调用JavaSystem.Exit(0)杀掉后台app(我觉得可以换成Android.OS.Process.KillProcess(Android.OS.Process.MyPid());或者System.Diagnostics.Process.GetCurrentProcess().Kill();

              我关闭应用的方法:

              private void CloseBtn_Click(object sender, EventArgs e){
                  FinishAffinity();
                  JavaSystem.Exit(0);
              }
              

              【讨论】:

                【解决方案14】:

                Application.Quit(); 我假设您使用的是 C#

                【讨论】:

                  【解决方案15】:

                  打电话

                  public void Quit ();
                  

                  这将以正确的方式退出应用程序,而不会“崩溃”。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-08-05
                    • 2011-08-29
                    • 2015-04-21
                    • 2017-07-24
                    相关资源
                    最近更新 更多