[英]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.