如何终止Xamarin应用程序?

时间:2015-03-25 14:04:03

标签: xamarin

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

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

它仍会打开一个包含默认活动名称和黑屏的空白页。

对此有什么具体的解决方案吗?

14 个答案:

答案 0 :(得分:44)

如果您使用的是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();

答案 1 :(得分:18)

对于Android,您可以

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

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

答案 2 :(得分:9)

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

Thread.CurrentThread.Abort();

对于Android,如 @Jason 所述:

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

答案 3 :(得分:6)

使其跨平台工作的一种简单方法是使用以下命令:

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

this link获得。

编辑:使用它一段时间后,我发现.CloseMainWindow()没有杀死应用程序,只关闭它(好吧,那很明显)。如果你想终止app(kill),你应该使用以下内容:

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

答案 4 :(得分:4)

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

this.FinishAffinity();

答案 5 :(得分:2)

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

答案 6 :(得分:1)

以前答案的简单一体化组合,而不是接口/依赖:

    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;
    }

答案 7 :(得分:1)

我尝试了这段代码

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 :(得分:0)

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

对于iOS和Android(比如在Xamarin Forms中),您可以抛出一个异常,这是一个非常重要的&#34;方法,将完成这项工作:

throw new Exception();

由于这不是最好的用户体验,您可能只想将其用于iOS,因为在Android上,您可能会收到一个系统弹出窗口,告诉您应用程序崩溃了。但是,不像其他iOS方法,如调用exit(0)或调用私有iOS方法,如&#34; terminateWithSuccess&#34;通过一个选择器,它不应该完全根据你的方式进行应用商店验证。他们可能仍会让您失败,因为您的应用会尝试自行终止。

你可能想要专门针对Android实现一些不同的东西,在这种情况下Jason的答案就足够了,如果不是一点点,那么使用这种方法可能不会让你的应用自我清理:

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

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

答案 9 :(得分:0)

当我尝试从活动B关闭Xamarin Android应用程序并同时在其下打开活动A时,上述方法都没有帮助我完全关闭Xamarin Android应用程序。

一个聪明人留下了诡计here

  1. 活动B中的首次通话FinishAffinity()(关闭两个活动, 但是,该应用程序仍在后台运行)
  2. 然后调用JavaSystem.Exit(0)杀死后台应用程序(我认为可以将其替换为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); }

答案 10 :(得分:0)

System.Environment.Exit(0);为我工作

答案 11 :(得分:0)

None of these work with Android 8. They all left the app in the background. I can prove this by pressing the close all button and the app is still there.

For my testing I used a brand new simple Android app and tried all of your answers.

答案 12 :(得分:0)

非常简单

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

享受!

答案 13 :(得分:0)

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