title: acitvity之间传值与返回传值
精明的编程者听说了此道,并遵循它;
平庸的编程者听说了此道,并寻觅它;
愚蠢的编程者听说了此道,却嘲笑它。
要不是因为有嘲笑,道也就不复存在了。
最高的声音最难被听见。前进也是一种倒退。大器晚成。即使一个完美的程序也仍然会有隐患。
道深藏不露,难以理解。
1、使用startActivity方法返回传值
requestCode,请求码:
请求码的值是根据业务需要由自已设定,用于标识请求来源。
例如(这个场合的情境感很重要):一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,其中requestCode参数可以用于标记是在前面Activity中到底哪个按钮处点击的,在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,以根据不同按钮来源作出不同业务处理,就要用switch语句来比较requestcode的值。
resultCode,结果码:
在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在每一个新的Activity中可以用setResult(int resultCode)——即用resultCode来标记每一个新Activity,这样在原来Activity的onActivityResult()方法中就可以知道是从哪个新Activity中返回的了
原来requestCode和resultCode其实就是用来标记的,一个标记原来Activity中哪一个地方(比如按钮)发出跳转到新Activity的请求的,另一个标记是从哪一个新的Activity返回到原来Activity的——之所以翻译成“请求码”和“结果码”,也是顾名思义了。
在activity中复用onActivityResult方法。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println("onActivityResult:"+resultCode);
switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK
case RESULT_OK:
System.out.println("RESULT_OK");
Bundle b = data.getBundleExtra("bundle");
String str = b.getString("str1");//str即为回传的值
System.out.println("str1"+str);
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
在打开的activity中复用onBackPressed方法,在结束页面时会回退到前一个,同时在上一个方法中会获得传的值。
@Override
public void onBackPressed() {
System.out.println(" super.onBackPressed();");
Intent intent = new Intent();
Bundle bundle = new Bundle();
//把返回数据存入Intent
bundle.putString("str1", "My name is linjiqin");
intent.putExtra("bundle", bundle);
setResult(RESULT_OK, intent);
DeleteCover.this.finish();
super.onBackPressed();
}
2、intent传值中传一些特殊类型的值
对于简单类型的值,如:String ,int 等,就不再说。
但是对于List<Map<String, String>>
这样类型的就要用intent一个不常用的方法来做。也就是java 的** Serializable(序列化)**。更多的知识请参见一篇博文我对Java Serializable(序列化)的理解和总结或者自己查阅更多参考书。
例如:List<Map<String, String>> coverArray = new ArrayList<Map<String, String>>();
我们想要把coverArray传到另一个activity中,我们可以用这样做,
Intent intent = new Intent(MainActivity.this, CoverMap.class);
intent.putExtra("coverArray", (Serializable) coverArray);
startActivity(intent);
在接收的activity中我们就同理来
Intent intent = getIntent();
coverArray = (List<Map<String, String>>) intent.getSerializableExtra("coverArray");
和那些简单的String int 差不太多。