前面的两篇文章主要讲了一个方面:从app中启动其他app。但是如果你的app可以处理对其他app有用的操作,你的app也应该响应其他app的操作请求。例如,如果你创建了一个社交app可以分享信息和图片给用户的朋友,支持ACTION_SENDintent,让用户在其他app初始化分享操作然后启动你的app来执行,是一件很有趣的事情。

为了其他app可以启动activity,应该在manifest文件中添加<intent-filter>元素和响应的<activity>元素。

当app安装到设备上后,系统会识别intent filter然后把信息加到一个所有安装的app都支持的全局目录中。当app用模糊的intent调用startActivity()或者startActivityForResult()时,系统就会查询哪个activity(或哪些)可以响应这个intent。

添加一个Intent Filter

为了要正确的定义哪些intent你的activity可以处理,每个添加的intent filter在接收的操作类型和数据类型上应该尽量的明确。

系统可能会把Intent传给activity如果activity有一个intent filter完全满足这个intent的标准:

Action

要指定的动作的名字。通常是平台预定义的值比如ACTION_SEND或者ACTION_VIEW。

在intent filter中用<action>元素来指定。在这个元素中指定的值必须是动作的全名,而不是API常量。(看后面的例子)。

Data

和intent相关的数据描述

在intent filter中的用<data>元素来指定。在这个元素中使用一个或多个属性,可以只指定MIME类型,URI前缀,或者这些和其他可接受数据类型的组合。

注意:如果不不声明数据Uri的细节(比如用户处理其他类型的数据,而不是URI),应该只指明android:mimeType属性来声明activity处理的数据类型,比如text/plain或image/jpeg。

Category

提供了一个附加的方式来表示activity处理的intent的特性,通常和用户手势或开始的位置相关。系统支持好几个不同的category,但是很少用到。但是,所有明确的intent都默认定义为CATEGORY_DEFAULT

在intent filter中用<category>元素来指定。

在intent filter中,可以通过在<intent-filter>中用每个相应的XML元素来定义你的activity可以接收什么样的标准。

例如,这里有一个activity,它通过intent filter定义了能处理ACTION_SEND的intent,并且数据类型为字符串或图片:

 <activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>

每个引入的intent都指定了一个动作类型和数据类型,但是可以定义多个<action>,<category>,和<data>元素在每个<intent-filter>中。

如果两组动作和数据在他们的行为中相互冲突,应该创建另外一个intent-filter来指明接收哪个操作时对应哪些数据类型。

例如,假如activity可以处理ACTION_SEND和ACTION_SENDTO intent以及字符串和图片。这种情况下,应该为这两个操作定义两个不同的intent filter,因为ACTION_SENDTO intent在用必须使用URI数据来指定收件人地址,例如:

 <activity android:name="ShareActivity">
<!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
<intent-filter>
<action android:name="android.intent.action.SENDTO"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="sms" />
<data android:scheme="smsto" />
</intent-filter>
<!-- filter for sending text or images; accepts SEND action and text or image data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>

注意:为了可以接收模糊的intent,必须在intent filter中包括CATEGORY_DEFAULT。方法startActivity()和startActivityForResult()只处理带有CATEGORY_DEFAULT的intent。如果没有声明它,那么没有模糊的intent会传给你的activity。

更多关于使用发送和接收ACTION_SEND intent来执行社会化分享行为,查看Receiving Content from Other Apps。

在Activity中处理Intent

为了决定在activity中执行什么动作,可以查看启动它的Intent。

当activity启动时,调用getIntent()来获取启动activity的Intent。在activity的声明周期的任何时候都可以查看,但是通常是在早期的回调方法(onCreate()或onStart())中查看。

例如:

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取启动这个activity的Intent
Intent intent = getIntent();
Uri data = intent.getData(); // 根据intent的类型决定做什么
if (intent.getType().indexOf("image/") != -1) {
// 处理带有图片数据的Intent。。。
} else if (intent.getType().equals("text/plain")) {
// 处理带有字符串的Intent。。。
}
}

返回结果

如果要返回到调用你的activity,简单的调用setResult()来指定结果代码和结果Intent。当操作完成了然后用户需要返回到以前的activity,调用finish()来关闭(然后销毁)这个activity。例如:

 // 创建intent来传递结果数据
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();

必须要指定结果代码和结果,总体上,是RESULT_OK或RESULT_CANCELED。然后如果需要的话可以用Intent添加附加数据。

注意:结果默认设置为RESULT_CANCELED。所以,如果用户在完成操作和设置结果前点了返回按钮,原来的activity会收到"canceled"结果。

如果只是需要返回一个代表结果选项的数字,可以把结果码设置为任何大于0的值。如果使用结果码传递一个数字的话就不需要包含Intent了,可以调用setResult()然后只传递一个结果码。例如:

 setResult(RESULT_COLOR_RED);
finish();

这种情况下,只有很少的可能的结果,所以结果码是本定定义好的数字(大于0)。这个在返回给自己app中的activity是很好用,因为activity接收到结果后可以根据公有的常量来决定返回码的值。

注意:不需要查看activity是由startActivity()还是startActivityForResult()启动的。直接调用setResult()因为启动activity的intent可能需要返回值。如果原始的activity调用了startActivityForResult(),那么系统会把setResult()提供的结果传递给它,否则,会忽视返回值。

Android - 和其他APP交互 - 让其他app启动你的activity的更多相关文章

  1. 【Android Developers Training】 30. 允许其它应用启动你的Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. Android WebView与JavaScript交互实现Web App

    当我们去开发一个基于web的android app时,我们第一须要处理的就是与JavaScript的交互问题.Android须要做的事情就是开放某些特定的接口供web里的JavaScript调用,能够 ...

  3. android 点击通知栏返回应用 ,非启动一个新Activity

    再使用如下的 Intent 设置: Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ ...

  4. android开发里跳过的坑——onActivityResult在启动另一个activity的时候马上回调

    该问题是由于被启动的activity的launchMode为singleTask模式,该模式下不可以使用onActivityResult,要使用onActivityResult,被启动的activit ...

  5. Android - 和其他APP交互 - 获得activity的返回值

    启用另一个activity不一定是单向的.也可以启用另一个activity并且获得返回值.要获得返回值的话,调用startActivityForResult()(而不是startActivity()) ...

  6. 【Android】12.2 利用Intent启动和关闭Activity

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 Android应用程序中一般都有多个Activity,在Activity中,通过调用StartActivity方法 ...

  7. 【Android Developers Training】 4. 启动另一个Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. Android - 和其他APP交互 - 把用户带到其他app

    Android的重要功能之一就是app可以根据要执行的操作让用户启动另外一个app.例如,app有一个商业地址然后想要在地图上显示,并不需要在app中加一个显示地图的activity,可以直接用Int ...

  9. Android - 和其他APP交互

    一个Android app通常有好几个activity.每个activity显示一个可以让用户执行特殊操作(例如看地图,照相等)的界面.要让用户从一个activity切换到另一个activity,ap ...

随机推荐

  1. Filter技术+职责链模式

    Filter是一个过滤器,存在Webclient与请求的资源之间.这里的资源能够说是jsp或servlet.它的作用就是在请求达到资源之前,先对请求进行预处理.而且也能够对servlet处理后的res ...

  2. python实用小代码

    栈的实现 #!/usr/bin/env python #coding=utf-8 #python version 2.7.4 class stack: def __init__(self,list=N ...

  3. 9个杀手级 JVM 编程语言

    9个杀手级 JVM 编程语言 Java虚拟机已经不再是仅仅局限在 Java 了,很多语言提供了脚本转换,可以让其他的程序在java虚拟机上运行,这样能够让更多的开发者能够依靠JVM在Java平台上大有 ...

  4. Android 通过调用系统,如接口 谷歌语音、百度语音、科大讯飞语音等语音识别方法对话框

    现在app在发展过程中会集成一些语音识别功能,不具有其自己的显影剂一般正在开发的语音识别引擎,所以在大多数情况下,它是选择一个成熟的语音识别引擎SDK集成到他们的app在. 平时,这种整合被分成两个, ...

  5. tomcat开始批量——setclasspath.bat

    除了上述两批,另一个重要的脚本,那是,setclasspath.bat.它主要负责查找.检查JAVA_HOME和JRE_HOME两个变量. ****************************** ...

  6. namespace命名空间

    在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的.可以将 PHP 命名空间与文件系统作一个简单的类比.在文件系统中访问一个文件有三种方式: 相对文件名形式如foo ...

  7. 使用异步HTTP提升客户端性能(HttpAsyncClient)

    使用异步HTTP提升客户端性能(HttpAsyncClient) 大家都知道,应用层的网络模型有同步.异步之分. 同步,意为着线程阻塞,只有等本次请求全部都完成了,才能进行下一次请求. 异步,好处是不 ...

  8. onmouseover 执行 ToolTip 控件

    Tooltip控件是一个简单,但非常有用的控件.它能够为我们的软件提供非常漂亮的提示信息,提高软件的可用性,给用户比较好的体验.假设现在有两个按钮,一个用来预览吊线世系图,一个用来预览行转.为了保持按 ...

  9. 建立qemu桥接的网络连接

    转载请注明出处谢谢:http://www.openext.org/2014/07/qemu-kvm-bridge-00     安装桥接工具:sudo apt-get install bridge-u ...

  10. Node.js v0.10.31API手冊-控制台

    Node.js v0.10.31API手冊-文件夹 控制台 Object 用于向 stdout 和 stderr 打印字符.类似于大部分 Web 浏览器提供的 console 对象函数,在这里则是输出 ...