通过setResult返回结果时设置操作的目的

时间:2016-12-25 16:01:01

标签: android android-intent

这是Training for Android developers

的示例代码
cat partitions.txt | while read line
do
part=$line
  su - demo -c "touch $part" 
fi
done

当我们从子活动返回结果时,通常我们只需要设置Extra或Uri数据。在此处指定自定义操作的目的是什么? 更新:

假设我们要打开图库应用以选择要在我们的应用中使用的图片。

调用图库应用

 //Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"));

setResult(Activity.RESULT_OK, result);

finish();

返回结果

    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent,PICK_IMAGE_REQUEST);

处理结果

   Intent result = new Intent();              
   result.setData(_Uri.parse("content://result_uri");
   setResult(Activity.RESULT_OK, result);
   finish();

我没有设置" com.example.RESULT_ACTION"在上面的示例代码中。

3 个答案:

答案 0 :(得分:3)

当您致电startActivityForResutl时,意味着您希望第二个/次级活动得到回复,并且当用户返回上一个活动时会触发onActivityResult

onActivityResult有3个参数,其中一个是intent,如果第二个/子活动尚未调用setResult函数,那么您将收到intent as上一个活动中的null

如果您不打电话给result功能,setResult意图永远不会传递给您之前的活动

第一项活动

Intent intent = new (..., secondActivity);
..
startActivityForResult(intent,1);

第二项活动

....
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"));

//setResult(Activity.RESULT_OK, result); this is not there
finish();

第一项活动

... OnActivityResult(int response, int request, Intent data)
               //                                      ^^^ will be null because 
               // setResult was not called in second activity so to get data intent 
               // you have to call setResult          

注意:如果您不想要任何结果,请使用startActivity代替startActivityForResult,并且无需拨打setResult第二个活动和OnActivityResult功能将不会被触发

更新:

Intent result = new Intent("com.example.RESULT_ACTION",
Uri.parse("content://result_uri"));

com.example.RESULT_ACTION:表示执行的操作类型是什么,在这种情况下是结果操作

它类似于action

intent-filter字段
<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        ^^^
    </intent-filter>
</activity>

这样您就可以验证执行的操作类型,例如您可以执行的活动结果

if(data.getAction().equals("com.example.RESULT_ACTION"))
 { // do this}
else if(data.getAction().equals("android.intent.action.SEND"") {
   // do something here}

显然可以使用请求和响应代码完成,但是当两个应用程序之间的数据或操作发生而不是两个活动时,这很有用

content://result_uri在文档中只是一个例子,但这意味着,数据类型意味着与意图相关的数据的详细信息

例如:如果您想使用意图打开图像,并在系统上安装应用程序,则使用

 intent.setDataAndType(Uri.parse("file://" + "/sdcard/test.jpg"), "image/*");

其中image/*描述了作为图像的文件类型

例如getData为您提供意图正在处理的数据/文件资源,意味着它提供URI,可以进一步用于验证数据类型。

因此,当在两个应用之间进行通信但在同一个应用中使用startActivityForResult时,这非常有用,那么您只需使用请求和响应代码识别结果类型

答案 1 :(得分:0)

希望这会对你有所帮助:

http://www.vogella.com/tutorials/AndroidIntent/article.html#retrieving-result-data-from-a-sub-activity

意图用于向Android系统发出已发生特定事件的信号。意图通常描述应该执行的操作,并提供应该执行此类操作的数据。例如,您的应用程序可以通过intent为某个URL启动浏览器组件。以下示例说明了这一点。

String url = "http://www.vogella.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

但Android系统如何识别可以对特定意图作出反应的组件?

组件可以通过意图过滤器为特定操作和特定数据注册自己。意图过滤器通过声明组件的功能来指定活动,服务或广播接收器可以响应的意图类型。

Android组件在AndroidManifest.xml中静态注册意图过滤器,或者在广播接收器的情况下也通过代码动态注册意图过滤器。意图过滤器由其类别,操作和数据过滤器定义。它还可以包含其他元数据。

如果将意图发送到Android系统,则Android平台会运行接收方确定。它使用意图中包含的数据。如果多个组件已注册相同的intent过滤器,则用户可以决定应该启动哪个组件。

答案 2 :(得分:0)

  

每个传入意图仅指定一个操作和一个数据类型,但是   可以声明<action><category>和。{的多个实例   每个<data>

中的<intent-filter>.个元素

它表示您将结果发送到活动或子活动的任何活动或子活动,它需要再次为您发送结果的活动定义Intent的操作,因为它为<intent-filter>

正确处理而定义Intent

所以它更像是<intent-filter>安全方法。