[英]How to clear the Android Stack of activities?
我在 Android 中有一個包含多個活動的應用程序,我希望用戶能夠通過按菜單按鈕注銷。 我的問題是
A) Android 不允許您終止應用程序並且
B) 即使我再次將用戶發送到LoginActivity
,他們也總是可以按回並立即返回到他們所在的上一個活動。
我已經嘗試使用以下兩個標志啟動 Activity:
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
我還單獨嘗試了其中的每一個。
當我閱讀另一個 StackOverflow 問題時,我還嘗試在startActivity(intent)
finish()
之后調用finish()
。
這應該是按位或的,否則您最終會覆蓋較早的標志。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
像這樣:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
在您的登錄活動中,覆蓋后退按鈕,以便它隱藏您的應用而不是完成活動:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
還要確保在根活動上設置 android:alwaysRetainTaskState="true",這樣 Android 在用戶不活動 30 分鍾后就不會清除您的堆棧(包括登錄活動)。
然后在登錄成功時調用finish()。
如果您使用的是Android API 11
或更高版本,則可以使用以下代碼清除堆棧。
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
這不會清除您的活動返回堆棧。
即使按照上述所有答案,當我按下后退按鈕時,它會在關閉應用程序之前顯示最后一個活動一秒鍾。
這就是我所做的:
@Override
public void onBackPressed() {
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
}
現在我的應用程序退出后按下 :) 沒有任何麻煩。
在非常相似的情況下,設置Intent.FLAG_ACTIVITY_CLEAR_TOP
對我Intent.FLAG_ACTIVITY_CLEAR_TOP
,我沒有設置Intent.FLAG_ACTIVITY_NEW_TASK
標志。 你試過沒有嗎?
這對我有用:)
Intent main = new Intent(this, A_Activity.class);
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(main);
Intent tool = new Intent(this, B_Activity.class);
startActivity(tool);
finish();
例如,A 是我的根活動
當我在堆棧上調用開始活動 E 時,我有活動 A -> B -> C -> D 我現在有 A -> E
我不知道它是否好:) 但有效。
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
寫這個並注意: LoginActivity
必須首先作為 Launcher 啟動,並且
如果您編寫任何啟動器模式,標志將被覆蓋其目的,因此請刪除launchermode
並嘗試您肯定會得到它
嘗試這個
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
如果我們使用此代碼啟動登錄活動 (A):
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
活動應該在活動的堆棧中,否則這個標志不會有任何影響。
如果我們在登錄活動(A)中使用finish(),在啟動活動(B)后(避免從B回到A),活動A(登錄)將不會在堆棧中。 當登錄活動具有“noHistory”作為屬性時,會發生完全相同的情況。
所以,我的解決方案是其他響應的混合:
此代碼進入活動 B,以避免回到登錄活動:
@Override
public void onBackPressed() {
moveTaskToBack(true);
super.onBackPressed();
}
這段代碼進入調用注銷函數的活動:
public static void logout() {
Intent intent = new Intent(activity, LoginMain.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.