数据的交互是双向的,仅实现数据的收发还远远不够。如上例(Ex3.10)所示,通过startActivity启动界面会产生一个新的Intent实例,因而所有数据也全部被初始化。
上一章通过Bundle实现了数据的收发,接下来我们通过startActivityForResult()方法来实现数据的回传。
第一、实现回传的准备工作——如何启动Activity?
据现在的知识结构来看,启动Activity只能用startActivity()或者startActivityForResult()。我们来看一下这两个接口是如何描述的:
void android.app.Activity.startActivity(Intent intent )
void android.app.Activity.startActivityForResult(Intent intent , int requestCode )
void android.app.Activity.startActivity(Intent intent )
void android.app.Activity.startActivityForResult(Intent intent , int requestCode )
参数intent我们不去细说,(如果不懂,看前一章)主要就在于requestCode的不同。官方的解释为:
requestCode : If >= 0, this code will be returned in onActivityResult() when the activity exits
我是这样理解的,requestCode的存在,就是为了区分不同模块所传回的数据。因为现实应用中,主界面需要众多子功能模块配合(子Activity)配合,要靠requestCode来辨别是哪个子模块。
接下来我们看看实例中所给出的代码,是如何调用另一Activity的。
第二、执行数据回传
在子Activity中完成相应计算后,就可以用setResut ()准备要回传的数据了。当调用finish()方法后,就把intent封装的数据发到主Activity中。
而回传数据的关键就在于setResut()方法:
void android.app.Activity.setResult(int resultCode, Intent data)
void android.app.Activity.setResult(int resultCode , Intent data )
void android.app.Activity.setResult(int resultCode , Intent data )
resultCode用来区分不同的返回结果与返回状态(RESULT_CANCELED/RESULT_OK)
PS:到现在我始终质疑 resultCode的存在价值,如果仅仅为了判断返回状态和返回结果,完全可以用Intent封装一个标志位吗!可能我这的观点很武断,望大家指正。
第三、接收数据
按照数据回传规则,主Activity(调用过 startActivityForResult ) 只要重载onActivityResult()方法就可以实现接收回传的数据了。
void android.app.Activity.onActivityResult(int requestCode , int resultCode , Intent data )
void android.app.Activity.onActivityResult(int requestCode , int resultCode , Intent data )
各个参数的意义与上面对应,就不用再解释了。我们看看Ex3.11中的数据回传都做了些什么,哪些参数用到了?哪些没用到?
总结:
使用Intent实现参数回传,关键在于文中提到的三个函数。弄清楚这三个函数,数据回传就不算事儿了。