Подтвердить что ты не робот

Как прекратить применение Xamarin?

Как я могу отменить приложение Xamarin из любого из действий?

Я попробовал как System.Environment.Exit(0), так и System.Environment.Exit(1), а также Finish() и убил все действия.

Он по-прежнему открывает одну пустую страницу с именем активности по умолчанию и черным экраном.

Есть ли какое-то конкретное решение для этого?

4b9b3361

Ответ 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();

Ответ 2

Для Android вы можете сделать

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

iOS явно не предоставляет API для существующего приложения. Только ОС может закрыть приложение.

Ответ 3

Для iOS вы можете использовать этот код:

Thread.CurrentThread.Abort();

Для Android, как @Jason упоминается здесь:

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

Ответ 4

Простой способ заставить его работать кроссплатформенно с помощью этой команды:

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

Получил по этой ссылке.

РЕДАКТИРОВАТЬ: После некоторого использования я обнаружил, что .CloseMainWindow() не убивает приложение, только закрывает его (ну, это очевидно). Если вы хотите закрыть приложение (kill), вы должны использовать следующее:

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

Ответ 5

В своей деятельности используйте этот код

this.FinishAffinity();

Ответ 6

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

Ответ 7

Простая комбинация всех предыдущих ответов вместо интерфейса/зависимости:

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

Ответ 8

Как ваш оригинальный вопрос упоминает о действиях, ваш вопрос специально для Android, вы должны, вероятно, обновить заголовок вопроса, имея в виду, чтобы люди, ищущие кросс-платформенное решение, пришли сюда.

Для iOS и Android (скажем, в Xamarin Forms) вы можете просто выбросить исключение, которое, будучи "тяжелым", сделает работу:

throw new Exception();

Поскольку это не лучший пользовательский интерфейс, и вы можете использовать его только для iOS, потому что на Android вы, вероятно, получите всплывающее окно с сообщением о том, что приложение разбилось. Однако, в отличие от других методов iOS, таких как вызов exit (0) или вызов частных методов iOS, таких как "terminateWithSuccess" с помощью селектора, он не должен терпеть неудачу проверки магазина приложений исключительно на основе того, как вы это делаете. Они могут по-прежнему вас терпеть, потому что ваше приложение пытается прервать себя.

Возможно, вы захотите реализовать что-то особенное для Android, и в этом случае достаточно ответа Джейсона, если не немного на носу, то есть использование этого подхода может не позволить вашему приложению очиститься:

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

В любом случае, вы должны действительно задать вопрос, почему вам нужно предоставить этот вариант. В отличие от настольных приложений, где закрытие приложения необходимо, потому что приложения находятся внутри окон, которые по дизайну допускают многозадачность и не ориентированы на работу, мобильные платформы в первую очередь предназначены для того, чтобы пользователи могли сосредоточиться на одной задаче за раз. Как только пользователь завершит задачу, они должны решить выйти из этой задачи, нажав кнопку "домой", кнопку "Назад" или кнопку "Изменить приложение (задание)". Это действительно относится ко всем платформам.

Ответ 9

Я пробовал этот код

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 закрываются, когда пользователь решает прекратить работу приложения. Может быть, это поможет вам.

Ответ 10

Ни один из вышеперечисленных методов не помог моему приложению Xamarin полностью завершить работу, когда я пытался закрыть его из Деятельности B, при этом под ним также было открыто Мероприятие А.

Умный парень оставил трюк здесь

  1. Сначала вызовите FinishAffinity() в FinishAffinity() B (закрывает оба действия, однако приложение все еще работает в фоновом режиме)
  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); }

Ответ 11

System.Environment.Exit(0); работает для меня