[英]Activities Stack Issue
我有兩套活動假設每個活動3個活動,(A1,B1,C1 || A2,B2,C2)我從A1開始我的應用程序然后 - > B1 - > C1這里我要從C1跳轉到 - > A2在A2,如果我按回它應該存在應用程序而不是讓我回到C1,然后從A2我導航到 - > B2 - > C2。
所以基本上我想改變起始活動,就像我在一個應用程序中有兩個應用程序,當我轉到第二個應用程序時,我必須清除活動堆棧。 那可能嗎? 有任何想法嗎?
在我看來,你已經回答了自己的問題。 你寫了:
所以基本上我想改變起始活動,就像我在一個應用程序中有兩個應用程序,當我轉到第二個應用程序時,我必須清除活動堆棧。
我會這樣做:
創建DispatcherActivity
,它是在啟動應用程序時啟動的活動。 此活動是您的任務的根活動,負責啟動A1或A2,取決於...而不是自己調用finish()
(即:它將被A1或A2覆蓋,但仍然位於活動的根部堆)。
在A1
,捕獲“后退”鍵並告訴DispatcherActivity退出如下:
@Override
public void onBackPressed() {
Intent intent = new Intent(this, DispatcherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addExtra("exit", "true");
startActivity(intent);
}
這將清除任務堆棧到根活動( DispatcherActivity
),然后再次使用此意圖啟動DispatcherActivity
。
在C1
,要啟動A2
,請執行以下操作:
Intent intent = new Intent(this, DispatcherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addExtra("A2", "true");
startActivity(intent);
這將清除任務堆棧到根活動( DispatcherActivity
),然后再次使用此意圖啟動DispatcherActivity
。
在DispatcherActivity
,在onCreate()
您需要根據intent中的extras確定要執行的操作,如下所示:
Intent intent = getIntent();
if (intent.hasExtra("exit")) {
// User wants to exit
finish();
} else if (intent.hasExtra("A2")) {
// User wants to launch A2
Intent a2Intent = new Intent(this, A2.class);
startActivity(a2Intent);
} else {
// Default behaviour is to launch A1
Intent a1Intent = new Intent(this, A1.class);
startActivity(a1Intent);
}
在A2
,捕獲“后退”鍵並告訴DispatcherActivity使用與A1
相同的onBackPressed()
覆蓋來退出。
注意:我只是輸入了這段代碼,所以我沒有編譯它,它可能不完美。 你的旅費可能會改變 ;-)
如果要在按后退按鈕而不是返回上一個活動時關閉應用程序,則應覆蓋后退按鈕。 在overwrite方法中,在關閉活動后調用finish()方法。 我希望這可以幫助你。
編輯:
檢查以下鏈接:這是用於關閉視圖堆棧中的所有活動。 關閉應用程序之前關閉所有活動。
http://www.coderzheaven.com/2011/08/27/how-to-close-all-activities-in-your-view-stack-in-android/
您可以檢查在活動A2中按下的按鈕的時間,然后檢查其后退按鈕是否可以關閉應用程序。 您可以在A2中使用以下方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
this.finish();
}
return super.onKeyDown(keyCode, event);
}
嘗試使用此意圖啟動活動A2 - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
使用onBackPressed處理此方法並完成方法。
在啟動其他活動之前,最好使用finish()方法關閉當前活動。
如果要在后退時轉到上一個活動,請覆蓋onBackPressed方法並調用特定意圖。
在A2活動中,在onBackPressed方法中添加finish方法(不要在此處調用以前的活動)。 這是其中一種方式。
將Intent從Activity C1傳遞給A2時使用as
Intent intent=new Intent(C1.this,A2.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
並在您的活動A2中覆蓋后退按鈕
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
A2.this.finish();
}
return super.onKeyDown(keyCode, event);
}
FLAG_ACTIVITY_CLEAR_TOP
不是您要找的。 我想你正在尋找:
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.