Android: очистить стек активности
У меня есть несколько действий в моем приложении. и поток очень сложный. Когда я нажимаю приложение Logout naviagates для входа в экран входа в систему, и оттуда пользователь может выйти, отменив бутон (вызов system.exit(0)
)
когда я выхожу из или назад, система вызывает действие из стека: (как я могу очистить все действия в стеке, когда я нахожусь на экране входа в систему? вызов finish()
нецелесообразен, так как существует так много действий и некоторых действий не должны быть закрыты, когда они активны, например, активность активации вызываемой камеры.
validateuser logoutuser = new validateuser();
logoutuser.logOut();
Intent loginscreen = new Intent(homepage.this, Login2.class);
(homepage.this).finish();
loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(loginscreen);
Ответы
Ответ 1
Большинство из вас ошибаются. Если вы хотите закрыть существующий стек операций независимо от того, что там и создать новый root, правильный набор флагов следующий:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Из документа:
public static final int FLAG_ACTIVITY_CLEAR_TASK
Добавлено в уровень API 11
Если задано в Intent, переданном Context.startActivity()
, этот флаг вызовет любую существующую задачу, которая будут связаны с активностью, подлежащей очистке до начинается деятельность. То есть, эта деятельность становится новым корнем иначе пустая задача, и все старые действия завершены. Это может используется только в сочетании с FLAG_ACTIVITY_NEW_TASK
.
Ответ 2
Когда вы вызываете startActivity
в последнем действии, вы всегда можете использовать
Intent.FLAG_ACTIVITY_CLEAR_TOP
как флаг этого намерения.
Подробнее о флагове здесь.
Ответ 3
Вот простой вспомогательный метод для запуска нового действия в качестве новой верхней активности, которая работает с уровня API 4 до текущей версии 17:
static void startNewMainActivity(Activity currentActivity, Class<? extends Activity> newTopActivityClass) {
Intent intent = new Intent(currentActivity, newTopActivityClass);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11
currentActivity.startActivity(intent);
}
назовите это следующим образом:
startNewMainActivity(this, MainActivity.class);
Ответ 4
Очистить активность Backstate по нижнему коду:
Intent intent = new Intent(Your_Current_Activity.this, Your_Destination_Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Готово
Ответ 5
В моем случае LoginActivity также был закрыт. В результате
Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK
не помогло.
Однако установка
Intent.FLAG_ACTIVITY_NEW_TASK
помог мне.
Ответ 6
Intent intent = new Intent(LoginActivity.this, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //It is use to finish current activity
startActivity(intent);
this.finish();
Ответ 7
Я отметил, что вы попросили решение, которое не полагается на finish()
, но мне интересно, может ли это тем не менее помочь.
Я отслеживал, возникает ли флаг выхода с переменной статического класса, которая выживает во всей продолжительности жизни приложения. В каждом соответствующем действии onResume()
используйте
@Override
public void onResume() {
super.onResume();
if (ExitHelper.isExitFlagRaised) {
this.finish();
}
}
Класс ExitHelper
public class ExitHelper {
public static boolean isExitFlagRaised = false;
}
Скажем, в mainActivity, пользователь нажимает кнопку для выхода - вы можете установить ExitHelper.isExitFlagRaised = true;
, а затем finish()
. После этого также будут завершены другие соответствующие виды деятельности, которые будут возобновлены автоматически.
Ответ 8
Это решение отлично работает:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Но новый запуск активности длится, и вы видите белый экран некоторое время. Если это важно, используйте этот обходной путь:
public class BaseActivity extends AppCompatActivity {
private static final String ACTION_FINISH = "action_finish";
private BroadcastReceiver finisBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
registerReceiver(finisBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
}, new IntentFilter(ACTION_FINISH));
}
public void clearBackStack() {
sendBroadcast(new Intent(ACTION_FINISH));
}
@Override
protected void onDestroy() {
unregisterReceiver(finisBroadcastReceiver);
super.onDestroy();
}
}
Как это использовать:
public class ActivityA extends BaseActivity {
// Click any button
public void startActivityB() {
startActivity(new Intent(this, ActivityB.class));
clearBackStack();
}
}
Недостаток: все действия, которые должны быть закрыты в стеке, должны расширять BaseActivity