1.4 获取到图片后的操作 onActivityResult
1.4.1 基础知识的简单介绍
Activity的启动涉及到两个Activity——父Activity和子Activity,
父Activity是启动方,即调用startActivity()方法一方,子Activity是被启动方,即被startActivity()方法打开的一方。
接下来分析,实现父Activity打开子Activity的方法 startActivityForResult(),和实现子Activity回传结果给父 Activity的方法 setResult()、onActivityResult()
【使用 intent extra 附加数据】 Inter 是四大组件之间和四大组间与操作系统之间通信的一种媒介工具。我们将需要传递的数据作为 entra 信息,附加给 startActivity(Intent) 方法的 Inter 上发送出去。extra是一种 key-value 结构。 调用 Inter.putExtra() 方法将 extra 信息添加给 inter,Inter.putExtra() 方法有很多种形式。(1) 一个参数固定为 String 类型的 Key。(2) 一个参数值可以是多种数据类型:包括8中剧本数据类型 和 实现了 Serializable接口的类的实例对象。子 activity调用对应的 getXXextra()方法对extra进行解析即可获取父 activity发过来的数据。
【父 acitvity 调用 startActivityForResult() 方法,启动子activity】 父 activity为了从子 activity中获取返回结果,所以调用启动子 activity的另外一种方法startActivityForResult(Intent intent, intrequestCode),该方法接收两个参数:(1) 一个是携带了 extra的 Intent (2) 另一个参数是请求代码 requestCode。 请求代码是发送给子 activity,然后再返回给父 activity的用户定义整数值。(当一个activity启动多个不同类型的字 activity,且需要判断区分消息回馈放时,会要使用到请求码进行区分)
【子 acitvity 调用 setResult() 方法,回传数据给父 activity】 实现子 activity返回值给父 activity,有以下两种 setResult() 方法可供调用: public final void setResult(int resultCode) public final void setResult(int resultCode), 通常来说,参数 result-code 可以是以下两个系统预定义常量中的任何一个:【ACTIVITY.RESULT_OK】、【 ACTIVITY_RESULT_CANCELED】。 使用 setResult() 方法代码附在后面。 如果子 activity 是 startActivityForResult() 方法启动的,结果代码则总是会返回给父 activity。子 activity可以不调用 setResult() 方法,如果不需要区分附加在 intent上的结果或者其他信息,可以让操作系统发送默认的结果代码。
Intent data = new Intent();
data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);
setResult(RESULT_OK, data);
【父 activity 调用 onActivityResult() 方法接收子 activity 返回的数据】 在用户单击后退,从子 activity回到父 activity时,ActivityManager会调用父 activity的onActivityResult(int requestCode,int resultCode, Intent data) 方法。该方法接收三个参数:
requestCode :请求的标识,用于分辨父activity获取到的数据来源于哪个子 activityresultCode :子activity返回的标识,代表着返回数据是否成功Intent :setResult() 返回的结果