У меня есть приложение с несколькими страницами, т.е. несколько действий, а некоторые из них остаются открытыми.
Есть ли способ сразу закрыть все действия?
У меня есть приложение с несколькими страницами, т.е. несколько действий, а некоторые из них остаются открытыми.
Есть ли способ сразу закрыть все действия?
Всякий раз, когда вы хотите выйти из всех открытых действий, вы должны нажать кнопку, которая загружает первая активность, которая запускается, когда ваше приложение запускается, затем очищает все остальные действия, а затем завершает последний оставшийся процесс. для этого примените следующий код в проекте 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();
}
и вы закончили....
Существует finishAffinity()
метод в Activity
, которая завершит текущую деятельность и все родительские действия, но он работает только в Android 4.1 или выше.
Для API 16+ используйте
finishAffinity();
Для более низкого (Android 4.1 ниже) используйте
ActivityCompat.finishAffinity(YourActivity.this);
Лучшее решение, которое я нашел, которое совместимо с устройствами, имеющими уровень API < 11
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Для этого решения требуется поддержка Android.
Для API 16+ используйте
finishAffinity();
Для более низких используйте
ActivityCompat.finishAffinity(YourActivity.this)
Существует три решения для истории чистой активности.
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)
для выхода из приложения.
Я боролся с той же проблемой. Открыв страницу about и вызывая finish();
, оттуда не закрывалось приложение, она переходила к предыдущему действию, и я хотел закрыть приложение на самой странице.
Это код, который работал у меня:
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
finish();
Надеюсь, что это поможет.
Если вы ищете решение, которое, по-видимому, больше "по книге" и методологически разработанное (с использованием 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 (...), на первый взгляд, кажутся очень приятными, элегантными, короткими, быстрыми и легкими в реализации - они чувствуют себя немного "неправильно" (чтобы начать работу - с все возможные накладные расходы и ресурсы, которые могут потребоваться и задействованы в нем, только для того, чтобы убить его?...)
Следующие два флага работали для меня. Они будут очистить все предыдущие действия и начать новый
Intent intent = new Intent(getApplicationContext(), MyDetails.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Надеюсь, это поможет.
Вы можете использовать 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
Вы можете попробовать только finishAffinity(), закрыть все текущие действия, чтобы работать над версией v4.1
Вы можете сохранить логический флаг для представления, если все действия должны быть завершены или нет (более предпочтительны в ваших общих предпочтениях), тогда метод 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.
Проблема с finishAffinity()
состоит в том, что finishAffinity()
только действия в текущей задаче, но действия с singleInstance
launchMode и в других задачах по-прежнему открываются и finishAffinity()
на передний план после выполнения finishAffinity()
. Проблема с System.exit(0)
заключается в том, что вы завершаете процесс приложения со всеми фоновыми службами и всей выделенной памятью, и это может привести к нежелательным побочным эффектам (например, больше не получать уведомления).
Вот еще две альтернативы, которые решают обе проблемы:
ActivityLifecycleCallbacks
в своем классе приложения, чтобы зарегистрировать созданные действия и закрыть их при необходимости: https://gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10ActivityLifecycleMonitorRegistry
: https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.java#L15использование
finishAffinity ();
Вместо:
System.exit(); or finish();
выход из полного приложения или всей активности.
Ни один из вышеупомянутых ответов не работал для меня. Но я исследовал еще немного и, наконец, получил ответ.
Вы на самом деле попросили закрыть приложение, как мне нужно. Итак, добавьте следующий код
finishAffinity();
Если корень:
Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
закройте приложение
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);
}
Вы можете использовать следующий код:
Intent i = new Intent(OldActivity.this, NewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
Я стартер в 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();
}