【android】關於多個activity頁面跳轉,跳過中間頁面返回前邊頁面傳值
阿新 • • 發佈:2019-01-07
- 這是一個面試中被問到的題目,答得不是很好,後來經過自己敲程式碼嘗試發現了一個解決思路。
- 我可以把這個問題具體化。比如有一個需求,給你三個頁面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,這樣就達到了最終的效果