У меня 3 занятия: A-> B-> C
Пользователь начинает с действия A. При переходе к B он может нажать назад и вернуться к A. Но ... Когда пользователь переходит к C из B. Я хочу, чтобы 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, так что .. Это не то, что мне нужно.




Запустите активность B с startActivityForResult():
Intent intent = new Intent(A.this, B.class);
startActivityForResult(intent, 100);
и переопределить в классе AstartActivityForResult():
@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();
Заменить onBackPressed() в Activity C
@Override
public void onBackPressed() {
finishAffinity();
}
Это приведет к завершению работы всех Activity, работающих в одной задаче. Если пользователь снова запустит приложение, нажав на него в окне недавних задач, отобразится Activity A.
Если я вас правильно понял, вы можете добиться этого с помощью 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();
}
Это должно сработать.
вы можете просто написать это в Activity C, если ваше приложение работает с JELLY_BEAN и выше.
@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();
}
Действие A в onCreate:
@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
}
100% рабочий. попробуйте запустить Activity C вот так. Намерение намерения = новое намерение (это, ActivityC.class); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity ();
попробуйте использовать
Intent.FLAG_ACTIVITY_CLEAR_TASKвместоIntent.FLAG_ACTIVITY_CLEAR_TOPпри запуске активности C и используйтеfinish()только для возврата из активности C.