Android удаляет активность из заднего стека
Хорошо, поэтому я немного застенчив, что с этим делать. Таким образом, у меня есть MainActivity, и оттуда в DegreePlanActivity можно запустить Activity, а оттуда в EditDegreePlan можно запустить другое действие. У меня EditDegreePlan установлен в noHistory в AndroidManifest. Проблема заключается в том, что после сохранения EditDegreePlan он запускает Activity to DegreePlan. Поэтому, если пользователь нажимает "Назад", он должен нажать его дважды, чтобы снова вернуться к MainActivity. Я хочу избавиться от этого, поэтому им нужно только нажать его один раз. Я не понимаю, как это сделать.
Если я установил DegreePlanActivity в noHistory, они не могли бы нажать Back to it в EditDegreePlan.
Я попытался переопределить метод onBackPressed и запустить намерение MainActivity. Проблема в том, что они должны нажать Back несколько раз, чтобы выйти из приложения.
Что мне делать?
Ответы
Ответ 1
FLAG_ACTIVITY_CLEAR_TOP очищает ваш стек Activity, вы можете использовать код ниже:
Intent intent = new Intent(this, Activity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Помните, что этот флаг очищает только промежуточные действия, например, если у вас есть A, B, C в вашем Back Stack
затем при переходе от C Activity к D с этим флагом это не очищает Back Stack
и стек будет A, B, C, D, но если вы перейдете от Деятельности D к Деятельности A с этим флагом, B, C, D Деятельности выскочит из стека, и у вас будет только А в Back Stack.
Ответ 2
простое решение для API >= 15 до API 23
имя пользователя в намерении.
Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(nextScreen);
ActivityCompat.finishAffinity(currentActivity.this);
Ответ 3
Я бы предположил, что вместо startActivity()
вы используете startActivityForResult()
, когда вы запускаете EditDegreePlan-Activity, как описано в обучающие программы для Android.
В EditDegreePlan-Activity вы вызываете
setResult(RESULT_OK);
finish();
Если вы не ожидаете каких-либо данных из EditDegreePlan-Activity, вам необязательно реализовать onActivityResult
.
Ответ 4
Кажется, что вы получите желаемое поведение, если вообще не укажете какие-либо флаги. Кнопка "назад" просто поступила бы правильно. Чтобы получить активность, закрытую из вашего кода, используйте метод finish()
, который имеет тот же эффект, что и пользователь, нажимая кнопку "Назад". Таким образом, вы автоматически прибудете в DegreePlan, когда закончите EditDegreePlan, не нужно также вызывать любые Intents
.
Ответ 5
Вот ваш поток:
MainActivity → DegreePlanActivty → EditDegreePlan → DegreePlan → MainActivty
Переопределите этот метод внутри вашего "DegreePlan"
public void onBackPressed() {
super.onBackPressed();
Intent goToMainActivity = new Intent(getApplicationContext(), MainActivity.class);
goToMainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // Will clear out your activity history stack till now
startActivity(goToMainActivity);
}
Ответ 6
используйте это, чтобы очистить стек:
menuIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Ответ 7
Вы можете позвонить до окончания своей новой деятельности. Это будет выгружать текущее действие, поэтому, когда вы нажимаете кнопку "Назад", а затем следующее действие, первое действие больше не будет там.
Intent i = new Intent(MainActivity.this, NextActivity.class);
finish();
startActivity(i);
Ответ 8
Вы можете добавить флаги следующим образом и запустить Activity, попробуйте код ниже
Intent i = new Intent(activity, Payment.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(i);
Ответ 9
Чтобы удалить активность из заднего стека внутри манифеста, добавьте android:noHistory="true"
к вашей активности внутри файла манифеста.
Смотрите образец ниже.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activity"
android:versionCode="1"
android:versionName="1.0">
<application android:name="MyApp" android:label="My Application">
<activity android:name=".LoginActivity"
android:noHistory="true"> //add this line to your activity inside manifest
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Ответ 10
Intent intent = new Intent(getContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);