Android完成以前的导航活动

Elo*_*rro 5 android android-activity

我有5个活动(让我们说A,B,C,DE).活动A到D用于设置一些数据,因此用户可以来回更改任何内容.活动E,在另一方面,是总结,所以用户不再被允许回去.

我的想法是在用户到达时完成之前的所有活动 E

目前,我的活动A,以D没有重视他们的标志.

Activty E被称为:

Intent I = new Intent(this, SomeClass.class);

I.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivity(I);

我到处都读到这些标志应该实现我想要做的事情,但是当用户进入活动E并按下Back按钮时,应用程序将返回活动状态D.

有任何想法吗?我错过了什么?这不是解决这个问题的正确方法吗?

谢谢你的帮助

ach*_*hie 7

在每个活动A,B,C,D中使用方法startActivityForResult而不是startActivity.当用户退出活动E时,处理后退按钮并在intent中设置结果代码.现在在每个A,B,C和D类的onActivityResult方法中处理它,关闭活动并将结果传递给前一个活动.

您也可以在用户完成活动D后立即执行此操作.当用户从D转到E时,您可以使用上述方法实际上一直向下到活动A,然后打开活动E并完成活动A.

上述两种情况都会从用户角度产生相同的结果,除非您在这些活动的onStart方法中执行一些长时间的工作,否则它们不会看到中间活动A,B,C,D.


fer*_*spr 5

万一有人需要@achie建议的代码,这里是:

A,B,C,D活动应该开始以下活动:

Intent myIntent = new Intent(this, B.class); // Or C/D
startActivityForResult(myIntent, 1);
Run Code Online (Sandbox Code Playgroud)

此外,A,B,C,D活动应覆盖:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   if (resultCode == RESULT_OK && requestCode == 1) {
      setResult(RESULT_OK);
      finish();
   }
}
Run Code Online (Sandbox Code Playgroud)

那么E活动应该处理后退按钮:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
      setResult(RESULT_OK);
   }
   return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)