簡體   English   中英

如何通過按后退按鈕關閉非root活動的Android應用程序

[英]How to close an Android app from non-root activity by pressing the backbutton

我想在我的Android應用程序中建模的功能是,如果用戶登錄,他將被轉發到主菜單( MainMenuActivity )。 從這里和我在應用程序中為其提供按鈕的其他地方,他必須能夠注銷,這應該將他發送回登錄屏幕( LoginActivity )並完成堆棧上面的所有活動。 我通過在登錄和注銷后不破壞LoginActivity來實現這一點:

    Intent intent = new Intent(this, LoginActivity.class);
    // Clean up all other activities.
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent);

此外,我希望用戶不能使用主菜單的backbutton返回到登錄屏幕。 所以我在MainMenuActivity覆蓋了onBackPressed()方法。 相反,我希望當用戶從主菜單按下后退按鈕時,應用程序會終止(就像它在堆棧上的最后一個活動一樣)。 我怎樣才能做到這一點?

我確實閱讀了其他幾種方法,例如在執行登錄后完成LoginActivity,然后再按照此處所述進行操作:

https://stackoverflow.com/a/3008684/1332314

但我不太確定這是否是一個合適的解決方案,只需閱讀帖子下方的評論。

顯然我確實找到了解決問題的方法。 我只是從LoginActivity啟動MainMenuActivity ,如下所示:

private void continueToMainMenu() {
    Intent intent = new Intent(this, MainMenuActivity.class);
    startActivityForResult(intent, 0);
}

然后,當用戶按下主菜單中的后退按鈕時,將調用此覆蓋的函數:

public void onBackPressed() {
    setResult(LoginActivity.ACTION_QUIT);
    finish();
}

這將首先為LoginScreen設置結果代碼,然后完成MainMenuActivity 然后LoginActivity終止接收這個特定的結果代碼,我實現如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == LoginActivity.ACTION_QUIT)
    {
        finish();
    }
}

這樣做將確保不會觸及活動生命周期太深,所有清理回調仍將被調用,並且不應該打開任何安全漏洞。

希望如果其他人遇到同樣的問題,這會有所幫助。

移動到MainMenuActivity時使用此標志:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_CLEAR_TASK);

這將刪除所有以前的活動,如果您按后退應用程序將被關閉。

現在,在注銷按鈕的情況下,當您移動到LoginActivity時, LoginActivity相同的操作,同一標志現在將使LoginActivity成為堆棧上的唯一活動,並且將關閉后台應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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