[英]Deleting back stack of activities
我有3個活動:A-> B-> C
用戶從活動A開始。轉到B時,他可以按回去,然后返回到A。但是...當用戶從B轉到C時,我希望刪除A和B,並在單擊時退出應用程序。
我試過了:
Intent intent = new Intent(B.this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
但在背面仍然會轉到B。如果這樣做:
Intent intent = new Intent(VerifyPhoneActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
用戶返回到A,所以..這不是我所需要的。
覆蓋Activity
C中的onBackPressed()
@Override
public void onBackPressed() {
finishAffinity();
}
這將導致在同一任務中運行的所有Activity
完成。 如果用戶在最近的任務窗口中通過點擊再次啟動應用程序,則將顯示Activity
A。
使用startActivityForResult()
啟動B
活動:
Intent intent = new Intent(A.this, B.class);
startActivityForResult(intent, 100);
並在類A
startActivityForResult()
重寫:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 100) {
if (resultCode == 1) {
finish();
}
}
}
現在在B
類中,將結果設置回活動A
:
Intent intent = new Intent(VerifyPhoneActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
setResult(1);
finish();
100%工作。 嘗試像這樣啟動活動C。 Intent intent = new Intent(this,ActivityC.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity();
如果我理解正確,則可以使用SharedPreferences實現此目的:
在您的活動A中添加以下內容:
public class ActivityA extends AppCompatActivity {
SharedPreferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
if (savedInstanceState == null){
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
editor.putBoolean("CloseApp", false);
editor.commit();
}
}
@Override
protected void onResume() {
super.onResume();
boolean finish = prefs.getBoolean("CloseApp", false);
if (finish){
this.finish();
}
}
在活動B中:
public class ActivityB extends AppCompatActivity {
SharedPreferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
}
@Override
protected void onResume() {
super.onResume();
boolean finish = prefs.getBoolean("CloseApp", false);
if (finish){
this.finish();
}
}
活動C:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
editor.putBoolean("CloseApp", true);
editor.commit();
}
@Override
public void onBackPressed() {
super.onBackPressed();
this.finish();
}
那應該工作。
如果您的應用程序從JELLY_BEAN開始運行,則只需在Activity C中編寫即可。
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onBackPressed() {
super.onBackPressed();
finishAffinity();
}
如果您的應用程序在JELLY_BEAN下工作,則可以使用以下解決方案:
活動C:
@Override
public void onBackPressed() {
Intent i = new Intent(C.this,A.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("BackFromC",true);
startActivity(i);
super.onBackPressed();
}
onCreate中的活動A:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
if(getIntent() != null){
if(getIntent().getBooleanExtra("BackFromC",false)){
finish();
}
}
... your Code
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.