Закрыть приложение и удалить из последних приложений /

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

Что я хочу:

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

Некоторые ответы, которые я нашел:

use System.exit(0); //doesn't clear app from recents
OR
use android.os.Process.killProcess(android.os.Process.myPid()); //doesn't clear app from recents
OR
use finish() or this.finish() or Activity.finish();// doesn't clear app from recents

И одно общее предложение, которое я вижу в каждом ответе, которое добавляет ниже код в манифесте:

android:excludeFromRecents //I think this is wrong approach.

потому что после добавления этого, когда пользователь нажимает кнопку "Домой" во время работы моего приложения, пользователь не может видеть мое приложение в недавнем списке приложений.

И много других предложений по этому вопросу, но ни одно из них не решает обе задачи: закрыть приложение и удалить приложение из списка последних приложений. Также, если вы идете в Settings>Apps>yourApp>your Application видите, что он все еще запрашивает "принудительную остановку", значит приложение работает!

6 ответов

Я основал свое решение на гостевой версии выше, а также на комментариях gilsaints88 ниже (для совместимости с Android L):

Добавьте это действие в ваш файл AndroidManifest.xml:

<activity
    android:name="com.example.ExitActivity"
    android:theme="@android:style/Theme.NoDisplay"
    android:autoRemoveFromRecents="true"/>

Затем создайте класс ExitActivity.java:

public class ExitActivity extends Activity
{
    @Override protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        if(android.os.Build.VERSION.SDK_INT >= 21)
        {
            finishAndRemoveTask();
        }
        else
        {
            finish();
        }
    }

    public static void exitApplication(Context context)
    {
        Intent intent = new Intent(context, ExitActivity.class);

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

        context.startActivity(intent);
    }
}

Затем, когда вы захотите принудительно закрыть свое приложение и удалить его из списка недавних, позвоните:

ExitActivity.exitApplication(context);

Это решение работает для меня вместо того, чтобы объявлять android:excludeFromRecents="true", потому что я хочу, чтобы пользователь мог видеть приложение в списке недавних пока ДО того момента, когда мое приложение вызывает закрытие приложения программно.

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

Теперь, когда это не так, с моей глупой идеей для этого. Суть его в том, чтобы заменить задачу, которую вы хотите завершить, той, которую система исключит из списка недавних приложений.

  1. Определите деятельность (я назову это Exiter), который просто заканчивает себя немедленно.
    • Вызов finish() в onCreate(Bundle),
    • От вопроса звучит так, как ОП тоже захочет позвонить System.exit(int) тоже. Но для других людей, читающих этот ответ, вам обычно не нужно убивать процесс.
    • использование android:theme="@android:style/Theme.NoDisplay" чтобы это не вызывало кучу избыточных переходов.
  2. Задавать android:taskAffinity чтобы Exiter будет выполняться в задаче, которую вы хотите выйти. Или нет: по умолчанию не указано taskAffinity делает так, что все действия имеют общий анонимный taskAffinity,
  3. Когда вы хотите выйти, используйте startActivity(Intent) начать Exiter со следующими флагами:
    • Intent.FLAG_ACTIVITY_NEW_TASK - Даже если мы хотим начать действие в той же задаче, другие флаги требуют этот флаг. К счастью, taskAffinity будет препятствовать тому, чтобы система фактически запустила новую задачу.
    • Intent.FLAG_ACTIVITY_CLEAR_TASK - Это завершает все действия по заданию. Вам не придется звонить finish() везде, просто в Exiter,
    • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS - Задача не будет в списке последних приложений. Поскольку это та же самая задача, что и та, которая выходит, этот флаг удаляет задачу из списка.

https://gist.github.com/anonymous/9884978

finishAndRemoveTask(); работал для меня, чтобы удалить приложение из панели задач. После закрытия приложения.

Добавьте это к своей деятельности:

@Override
public void finish() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        super.finishAndRemoveTask();
    }
    else {
        super.finish();
    }
}

finishAndRemoveTask ()

Вызывайте это, когда ваша деятельность завершена и должна быть закрыта, а задача должна быть полностью удалена как часть завершения корневого действия задачи.

Решение для Котлина.

ExitHelper.kt

fun Activity.finishAndRemoveTaskCompat() {
    if (android.os.Build.VERSION.SDK_INT >= 21) {
        finishAndRemoveTask()
    } else {
        val intent = Intent(this, ExitAndRemoveFromRecentAppsDummyActivity::class.java)

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
                Intent.FLAG_ACTIVITY_CLEAR_TASK or
                Intent.FLAG_ACTIVITY_NO_ANIMATION or
                Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)

        startActivity(intent)
    }
}

class ExitAndRemoveFromRecentAppsDummyActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        finish()
    }
}

AndroidManifest.xml

<activity
     android:name=".ExitAndRemoveFromRecentAppsDummyActivity"
     android:theme="@android:style/Theme.NoDisplay"
/>

Затем просто используйте его как обычный метод в вашей деятельности:

override fun boo() {
    foo()
    finishAndRemoveTaskCompat()
}
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){finishAndRemoveTask();}

это сработало для меня, чтобы удалить приложение из фона. После закрытия приложения

Другие вопросы по тегам