【android】关于多个activity页面跳转,跳过中间页面返回前边页面传值

  • 这是一个面试中被问到的题目,答得不是很好,后来经过自己敲代码尝试发现了一个解决思路。
  • 我可以把这个问题具体化。比如有一个需求,给你三个页面A,B,C,要求A可以跳转到B页面,并传值,B可以跳转到C页面,并传值,C页面直接返回A页面,并且把C页面的值直接给A页面。
  • 刚开始我尝试直接显示跳转,就是如下边代码所示:

A

Intent intent = new Intent(A.this, B.class);
                intent.putExtra("a", "我是A页面传过来的值");
                startActivity(intent);

B

Intent intent = new Intent(B.this, C.class);
                intent.putExtra("b", "我是B页面传过来的值");
                startActivity(intent);

C

Intent intent = new Intent(C.this, A.class);
                intent.putExtra("c", "我是C页面返回的值");
                startActivity(intent); 

但是发现存在一个大问题,就是这个过程会经历A->B->C->A这个过程,这几个页面先后压入任务栈中,当我退回时还得一个个按照A->C->B->A的顺序退栈。再次思考怎么样才能很好地解决这个问题呢

思路1:这个问题的引发直接会联想到Activity的启动模式,因为默认是standard模式,这里A是首先启动的一个页面然后最终又回到A,所以首先想起了singleTask模式,如下图所示:
【android】关于多个activity页面跳转,跳过中间页面返回前边页面传值_第1张图片
默认是A->B->C->A的压栈方式,如果给A设置launchMode=”singleTask”,效果就是A首先会看看栈里有A没,如果发现了A,会把A以上的页面给移除掉,然后A就暴露在栈顶了(如果对Activity的四种启动模式还不太了解,可以参考http://blog.csdn.net/shinay/article/details/7898492/),就是A->B,A->B->C,A的压栈过程了,最后只剩下了A。

但是经过上边的修改之后又发现了一个问题,发现C的值根本传不到A页面,可能是C页面跳回A页面时还没来得及传值就把C页面给移除了,所以这种方案不可行。

思路2:C页面可以调用finish()结束C页面,然后还有个B页面怎么办呢,想到页面可以回传值给启动它的页面,所以我们可以让C回传值给B,B再把C传给它的值回传给A页面,然后finish()把自己关闭,代码如下:

C

private void backA() {
        Button btnJumpc = (Button) findViewById(R.id.btn_jump_c);
        btnJumpc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(C.this, A.class);
                intent.putExtra("c", "我是C页面返回的值");
                setResult(1, intent);
                finish();
            }
        });
    }

    @Override
    public void onBackPressed() {
        Intent intent = new Intent(C.this, A.class);
        intent.putExtra("c", "我是C页面返回的值");
        setResult(1, intent);
        finish();
    }

B

private void jumpC() {
        Button tvJumpB = (Button) findViewById(R.id.btn_jump_b);
        tvJumpB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(B.this, C.class);
                intent.putExtra("b", "我是B页面传过来的值");
                startActivityForResult(intent, 1);
            }
        });
    }

     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //把C回传给它的数据再回传给A,然后关闭自己
        if(requestCode == 1 && resultCode == 1){
            setResult(1, data);
            finish();
        }
    }

A

private void jumpB() {
        Button tvJumpB = (Button) findViewById(R.id.btn_jump_a);
        tvJumpB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(A.this, B.class);
                intent.putExtra("a", "我是A页面传过来的值");
                startActivityForResult(intent, 1);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == 1 && resultCode == 1){
            tvShow.setText(data.getStringExtra("c"));
        }
    }

OK,这样就达到了最终的效果
【android】关于多个activity页面跳转,跳过中间页面返回前边页面传值_第2张图片

你可能感兴趣的:(android)