Завершите все действия за раз

У меня есть приложение с несколькими страницами, т.е. несколько действий, а некоторые из них остаются открытыми.

Есть ли способ сразу закрыть все действия?

Ответ 1

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

Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

Приведенный выше код завершает все действия, кроме FirstActivity. Затем нам нужно закончить FirstActivity Введите нижеприведенный код в Firstactivity oncreate

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();
}

и вы закончили....

Ответ 2

Существует finishAffinity() метод в Activity, которая завершит текущую деятельность и все родительские действия, но он работает только в Android 4.1 или выше.

Для API 16+ используйте

finishAffinity();

Для более низкого (Android 4.1 ниже) используйте

ActivityCompat.finishAffinity(YourActivity.this);

Ответ 3

Лучшее решение, которое я нашел, которое совместимо с устройствами, имеющими уровень API < 11

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

Для этого решения требуется поддержка Android.

Ответ 4

Для API 16+ используйте

finishAffinity();

Для более низких используйте

ActivityCompat.finishAffinity(YourActivity.this)

Ответ 5

Существует три решения для истории чистой активности.

1) Вы можете написать finish() во время запуска новой активности с помощью намерения.

2) Напишите android:noHistory="true" во всем теге <activity> в файле Androidmanifest.xml, используя это, если вы открываете новую активность, и вы не пишете finish(), в то время предыдущая активность всегда заканчивается, после записи активность выглядит так.

<activity
    android:name=".Splash_Screen_Activity"
    android:label="@string/app_name"
    android:noHistory="true">

</activity>

3) напишите system.exit(0) для выхода из приложения.

Ответ 6

Я боролся с той же проблемой. Открыв страницу about и вызывая finish();, оттуда не закрывалось приложение, она переходила к предыдущему действию, и я хотел закрыть приложение на самой странице.

Это код, который работал у меня:

Intent startMain = new Intent(Intent.ACTION_MAIN); 
startMain.addCategory(Intent.CATEGORY_HOME); 
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(startMain); 
finish();

Надеюсь, что это поможет.

Ответ 7

Если вы ищете решение, которое, по-видимому, больше "по книге" и методологически разработанное (с использованием BroadcastReceiver), вам лучше взглянуть на следующую ссылку: http://www.hrupin.com/2011/10/how-to-finish-all-activities-in-your-android-application-through-simple-call.

В предлагаемой реализации, которая появляется в этой ссылке, требуется небольшое изменение - вы должны использовать метод sendStickyBroadcast (Intent) (не забудьте добавить разрешение BROADCAST_STICKY к вашему манифесту), а не sendBroadcast (Intent), чтобы чтобы ваши приостановленные действия могли принимать трансляцию и обрабатывать ее, а это значит, что вы также должны удалить эту липкую трансляцию во время перезапуска приложения, вызвав метод removeStickyBroadcast (Intent) в вашем первом методе Activity onCreate().

Хотя вышеупомянутые решения на основе startActivity (...), на первый взгляд, кажутся очень приятными, элегантными, короткими, быстрыми и легкими в реализации - они чувствуют себя немного "неправильно" (чтобы начать работу - с все возможные накладные расходы и ресурсы, которые могут потребоваться и задействованы в нем, только для того, чтобы убить его?...)

Ответ 8

Следующие два флага работали для меня. Они будут очистить все предыдущие действия и начать новый

  Intent intent = new Intent(getApplicationContext(), MyDetails.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);

Надеюсь, это поможет.

Ответ 9

Вы можете использовать finishAffinity(), который завершит текущее действие и все родительские действия. Но это работает только для API 16+.

API 16+ использует:

finishAffinity();

Ниже API 16 используйте:

ActivityCompat.finishAffinity(this); //with v4 support library

Чтобы выйти из всего приложения:

finishAffinity(); // Close all activites
System.exit(0);  // closing files, releasing resources

Ответ 10

Вы можете попробовать только finishAffinity(), закрыть все текущие действия, чтобы работать над версией v4.1

Ответ 11

Вы можете сохранить логический флаг для представления, если все действия должны быть завершены или нет (более предпочтительны в ваших общих предпочтениях), тогда метод onStart() для каждого вида деятельности должен иметь что-то вроде:

SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false);
if(needToDestroyFlag)
{
    finish();
}else
{
    //...
}

Очевидно, вы можете установить этот флаг, как показано ниже, когда вам нужно закончить все действия (в текущей деятельности), после чего вы можете вызвать метод finish() для текущей активности, что приведет к прекращению текущей активности и поп-активности из стека один за другим, метод onStart() каждого из них выполняет и вызывает его завершение:

SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putBoolean("destroyFlag", true);
editor.apply();

Если вы используете метод, предложенный @letsnurture, вам будет задан вопрос, заданный @gumuruh.

Ответ 12

Проблема с finishAffinity() состоит в том, что finishAffinity() только действия в текущей задаче, но действия с singleInstance launchMode и в других задачах по-прежнему открываются и finishAffinity() на передний план после выполнения finishAffinity(). Проблема с System.exit(0) заключается в том, что вы завершаете процесс приложения со всеми фоновыми службами и всей выделенной памятью, и это может привести к нежелательным побочным эффектам (например, больше не получать уведомления).

Вот еще две альтернативы, которые решают обе проблемы:

  1. Используйте ActivityLifecycleCallbacks в своем классе приложения, чтобы зарегистрировать созданные действия и закрыть их при необходимости: https://gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10
  2. В тестировании вы можете использовать ActivityLifecycleMonitorRegistry: https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.java#L15

Ответ 13

использование

finishAffinity ();

Вместо:

System.exit(); or finish();

выход из полного приложения или всей активности.

Ответ 14

Ни один из вышеупомянутых ответов не работал для меня. Но я исследовал еще немного и, наконец, получил ответ.

Вы на самом деле попросили закрыть приложение, как мне нужно. Итак, добавьте следующий код

finishAffinity();

Ответ 15

Если корень:

Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");

Ответ 16

закройте приложение

Intent intent = new Intent(getApplicationContext(), Splash_Screen.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.putExtra("EXIT", true);
                startActivity(intent);

поместите это в oncreate и onResume самого первого действия, которое открывается. ех. на заставке

if (getIntent().getBooleanExtra("EXIT", false)) {
            this.finish();
            System.exit(0);
        }

Ответ 17

Вы можете использовать следующий код:

Intent i = new Intent(OldActivity.this, NewActivity.class);

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

startActivity(i);

Ответ 18

Я стартер в java/android, может быть, это простое решение для вас

FIRST, создайте статический класс

public class ActivityManager {

    static Activity  _step1;
    static Activity _step2;
    static Activity _step3;

    public static void setActivity1(Activity activity)
    {
        _step1 = activity;
    }

    public static void setActivity2(Activity activity)
    {
        _step2 = activity;
    }

    public static void setActivity3(Activity activity)
    {
        _step3 = activity;
    }

    public static void finishAll()
    {
        _step1.finish();
        _step2.finish();
        _step3.finish();
    }

}

THEN при запуске новой ссылки сохранения активности для вашего менеджера (в шаге 1):

ActivityManager.setActivity1(this);
AddValuesToSharedPreferences();
Intent intent = new Intent(Step1.this, Step2.class);
startActivity(intent);

И ТОГДА на последнем шаге закончить все:

 public void OkExit(View v) throws IOException {
        ActivityManager.finishAll();
    }