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"));
}
}