如何在带有活动的子流中提供向后导航

时间:2018-06-21 22:04:06

标签: android android-activity back-stack

我有活动A,B,C,用户之间可以进行导航。

活动B还提供了类似(B1,B2,B3)的子流。当用户完成子流时,他将与一些数据一起发送回B。

我应该使用什么意图标志或启动模式在A-B-C之间以及B1- B2-B3之间提供反向导航。但是当返回B并意图传递一些数据时,也清除/完成了此子流程吗?

我尝试将FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP添加到子活动(B1,B2,B3)中,但这没用。

visual explanation

4 个答案:

答案 0 :(得分:0)

在活动B2中:

  public void finish(){
        Bundle bundle = new Bundle();
        bundle.putString("KEY_NAVIGATION", "B");
        Intent intent = new Intent(B2.this, A.class);
        intent.putExtra("EXTRA", bundle);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }

您的活动A:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        component.inject(this);
        super.onCreate(savedInstanceState);
        if (getIntent().hasExtra("EXTRA")) {
            Intent intent = new Intent(A.this, B.class);
            startActivity(intent);
        }

        // do your logic
    }

通过这种方式,您可以在从B2导航后从B返回到A

希望这会有所帮助

答案 1 :(得分:0)

您可以使用链接的onActivityResult调用,因此,您不会从B2到B而是自动回溯通过同一条链接(B2-> B1-> B)调用finish()从后面的堆栈中取出链条。这样,您仍然可以在B1或B2处按预期使用后退按钮,但是一旦按A-> B-> B1-> B2-> B后按Back,将使您回到A,而不是B2。

无论您在B之前访问了多少活动(无论您是从Aa-> Ab-> Ac-> B然后通过B-> B1-> B2-> B循环来进行,这都将起作用)然后仍然可以通过B-> Ac-> Ab-> Aa)返回。

public class ActivityB extends AppCompatActivity {

  private static final int LAUNCH_B1 = 11;

  void launch_subloop() {
    Intent intent = new Intent(ActivityB.this, ActivityB1.class);
    startActivityForResult(intent, LAUNCH_B1);
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( resultCode == Activity.RESULT_OK && requestCode == LAUNCH_B1) {
      // do stuff upon loop completion
    }
  }
}

public class ActivityB1 extends AppCompatActivity {
  private static final int LAUNCH_B2 = 12;

  void go_to_next_step() {
    Intent intent = new Intent(this, ActivityB2.class);
    startActivityForResult(intent, LAUNCH_B2);
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( resultCode == Activity.RESULT_OK && requestCode == LAUNCH_B2) {
      // This will finish B1 and bring us back to B, with B1 and B2 now 
      // removed from the back stack
      setResult(Activity.RESULT_OK);
      finish();
    }
  }
}

public class ActivityB2 extends AppCompatActivity {

  void finish_subloop() {
    // when you finish, this should go back through the 
    // activities and finish B1 and B2, so if you go on from B to C, you can
    // still go back from C -> B -> A
    // This will bring us back to B1 and finish B2 (remove from back stack)
    setResult(Activity.RESULT_OK);
    finish();
  }
}

答案 2 :(得分:0)

尝试制作活动B的清单:

launchMode = “singleTask”

因此,在活动B2之后,您可以 startActivity(“活动b2的意图,将一些数据放入此意图中”),并在活动B中的 onNewIntent()中处理您的意图

如果活动B,B1,B2是相同的活动,为什么不仅仅将其片段化?

您也可以通过标志在没有LunchMode的情况下做同样的事情:

来自活动A

startActivity("intent for activity b with putting some data in this intent", Intent.FLAG_ACTIVITY_NEW_TASK)

活动B

startActivity("intent for activity B with data (if needs)", Intent.FLAG_ACTIVITY_NO_HISTORY)

活动B1

startActivity("intent for activity B with data (if needs)", Intent.FLAG_ACTIVITY_NO_HISTORY)

活动B2

startActivity("intent for activity B with data (if needs)", Intent.FLAG_ACTIVITY_NEW_TASK)

答案 3 :(得分:0)

最后,我通过执行以下操作获得了预期的结果。在活动B中,我创建了两种方法来启动活动

class ActivityB : AppCompatActivity() {

    fun startFromActivityA(context: Context) {
        val intent = Intent(context, ActivityB::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        context.startActivity(intent)
    }

    fun startFromActivityB2(context: Context, intentData: IntentData) {
        val intent = Intent(context, ActivityB::class.java)
        intent.putExtra(INTENT_DATA, intentData)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        context.startActivity(intent)
    }
}

因此,当我进入子流并且想要完成子流时,我将呼叫startFromActivityB2。它将清除整个子流,并仍提供向回导航到活动A