1. 程式人生 > >【android】關於多個activity頁面跳轉,跳過中間頁面返回前邊頁面傳值

【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模式,如下圖所示:
這裡寫圖片描述
預設是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,這樣就達到了最終的效果
這裡寫圖片描述