Как выйти с остановкой фонового запуска из приложения, но не закрыть сервисы - PullRequest
0 голосов
/ 03 июля 2018

Я давно искал решение о том, как закрыть приложение для Android.

Собирая все посты, посвященные этой теме, я закончил тем, что нашел здоровое и эффективное решение, которым я хотел бы поделиться в этом посте

Пожалуйста, поправьте меня, если я где-то потерпел неудачу.

public static void closeApp(Activity activity) {
    //Go to home to change main android view and focus
    //You can remove this part
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        activity.startActivity(intent);

    //finish in background many activities as possible
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.finishAndRemoveTask();
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        activity.finishAffinity();
    } else {
        activity.finish();
    }

    //Kill all existing app process
    activity.moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());

    //close the app
    System.exit(0);
}

на примере

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            closeApp(MainActivity.this);
        }
    });
}

1 Ответ

0 голосов
/ 03 июля 2018

Подход, который вы используете, выглядит достаточно всеобъемлющим, когда речь идет об освобождении ресурсов и полном закрытии приложения. Хотя я чувствую, что это немного преувеличено, но если это то, что требует ваш вариант использования, то никаких проблем. Вы можете проверить это SO для получения дополнительной информации.

У меня есть комментарий к следующей строке

остановка фонового запуска из приложения, не закрытие служб

android.os.Process.killProcess(android.os.Process.myPid()); Этот метод завершит процесс с заданным PID. Если ваши службы работают с этим PID, они тоже будут убиты.

Начиная с Android O, было наложено несколько ограничений на фоновое выполнение, из-за которых нельзя поддерживать службы в фоновом режиме. Когда ваше приложение закрывается, ОС прекращает работу Служб, как если бы вы позвонили stopSelf(). Как следствие, вы не сможете поддерживать свои службы в живых.

...