Закрыть приложение и удалить из последних приложений /
Я знаю, что этот вопрос часто встречается и задавался много раз по переполнению стека, но после посещения почти четырех страниц результатов поиска и почти 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 позволяет принудительно остановить приложение, даже если на нем нет запущенных процессов. Принудительная остановка переводит пакет в определенное состояние остановки, где он не может принимать широковещательные события.
Теперь, когда это не так, с моей глупой идеей для этого. Суть его в том, чтобы заменить задачу, которую вы хотите завершить, той, которую система исключит из списка недавних приложений.
- Определите деятельность (я назову это
Exiter
), который просто заканчивает себя немедленно.- Вызов
finish()
вonCreate(Bundle)
, - От вопроса звучит так, как ОП тоже захочет позвонить
System.exit(int)
тоже. Но для других людей, читающих этот ответ, вам обычно не нужно убивать процесс. - использование
android:theme="@android:style/Theme.NoDisplay"
чтобы это не вызывало кучу избыточных переходов.
- Вызов
- Задавать
android:taskAffinity
чтобыExiter
будет выполняться в задаче, которую вы хотите выйти. Или нет: по умолчанию не указаноtaskAffinity
делает так, что все действия имеют общий анонимныйtaskAffinity
, - Когда вы хотите выйти, используйте
startActivity(Intent)
начатьExiter
со следующими флагами:Intent.FLAG_ACTIVITY_NEW_TASK
- Даже если мы хотим начать действие в той же задаче, другие флаги требуют этот флаг. К счастью,taskAffinity
будет препятствовать тому, чтобы система фактически запустила новую задачу.Intent.FLAG_ACTIVITY_CLEAR_TASK
- Это завершает все действия по заданию. Вам не придется звонитьfinish()
везде, просто вExiter
,Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- Задача не будет в списке последних приложений. Поскольку это та же самая задача, что и та, которая выходит, этот флаг удаляет задачу из списка.
finishAndRemoveTask();
работал для меня, чтобы удалить приложение из панели задач. После закрытия приложения.
Добавьте это к своей деятельности:
@Override
public void finish() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
super.finishAndRemoveTask();
}
else {
super.finish();
}
}
Вызывайте это, когда ваша деятельность завершена и должна быть закрыта, а задача должна быть полностью удалена как часть завершения корневого действия задачи.
Решение для Котлина.
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();}
это сработало для меня, чтобы удалить приложение из фона. После закрытия приложения