簡體   English   中英

如何清除Android活動堆棧?

[英]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()。

根據Wakka從歷史堆棧刪除活動...


android:noHistory="true"屬性添加到AndroidManifest.xml中的<activity>中,如下所示:

<activity android:name=".MyActivity"
    android:noHistory="true">
</activity>

如果您使用的是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM