如何从任何活动中终止Xamarin应用程序?
我已经尝试了System.Environment.Exit(0)
和System.Environment.Exit(1)以及Finish()
并杀死了所有活动。
它仍会打开一个包含默认活动名称和黑屏的空白页。
对此有什么具体的解决方案吗?
答案 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
FinishAffinity()
(关闭两个活动,
但是,该应用程序仍在后台运行)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#