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

原文链接:http://developer.android.com/training/basics/intents/filters.html


之前的两节课关注于故事的一面:从你的应用启动另一个应用的activity。但是如果你的应用可以执行一个对另一个应用来说有用的行为,那么你的应用就应该准备好响应由其他应用所发起的行为需求。例如,你构建了一个社交应用,它可以和用户的朋友分享信息和照片,那么此时你最感兴趣的就是支持ACTION_SEND的Intent,这样用户可以在其他应用初始化一个“分享”的行为,然后启动你的应用来执行这个行为。

为了允许其他应用启动你的Activity,你需要在清单文件中,在对应的<activity>标签内,添加一个<intent-filter>(姑且称之为Intent过滤器)标签。

当你的应用安装在一个设备上时,系统会识别你的intent过滤器,并且将信息添加至一个内部的目录,这里面收录了所有安装的应用所支持的intents。当一个应用调用startActivity()或者startActivityForResult(),并且使用的是隐式的intent时,系统会找到哪一个(些)activity可以相应这个intent。

一). 添加一个Intent过滤器

为了恰当地定义你的activity可以处理什么intents,每个你添加的intent过滤器,就activity能接受的行为和数据类型而言,应该是越明确越好。

如果Activity的intent过滤器能够符合下面列举的Intent对象标准,那么系统会将该Intent交付给这个activity:

Action

一个字符串,表征了将要执行的行为的名称。通常是一个系统所定义的值,如:ACTION_SEND或者ACTION_VIEW

在你的intent过滤器中,用<action>标签来特指接收的行为。在这个标签中你所特指的值必须是这个行为的全名,而不是API常量(见下面的例子)。

Data

这是一个和intent所关联的数据的描述。

在你的intent过滤器中,用<data>标签来特指它。你可以在这个标签中使用一个或多个字段,你可以只定义MIME类型,只定义一个URI前缀,只定义一个URI方案,或者是这些和其他类型的结合,它们指出了能接收的数据类型。

Note:

如果你不需要申明关于数据Uri细节(比如当你的activity处理其他类型的“extra”数据,而不是一个URI),那么你应该只指明“android:mimeType”这一属性字段,以此来声明你的activity要处理的数据类型,比如:“text/plain”或者“image/jpeg”。

Category

提供一个额外的方法来特定处理该intent的Activity,通常与用户的手势或者它所启动的地点相关。系统支持一些不同类型的category,但大多数很少使用。然而,要记住的是所有隐式的intent,默认定义了CATEGORY_DEFAULT

在你的Intent过滤器中,用<category>标签特指它。

在你的intent过滤器中,你可以通过在<intent-filter>标签中添加合适的XML标签,来申明你的activity接收什么样的intent。

下面的例子是一个具有intent过滤器的activity,它处理的intent是这样的,具有ACTION_SEND的行为,且数据类型是文本或图像:

<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只特定一个行为和一个数据类型,但是在每个<intent-filter>标签中声明多个<action><data>或者<category>标签的实例也是可以的。

如果有两对行为和数据,其行为是相互排斥的,你应该分别创建intent过滤器,将行为和数据类型合理搭配避免冲突。

例如,假设你的应用处理文本和图像的数据类型,也同时相应ACTION_SENDACTION_SENDTO的行为。在这种情况下,你必须为两个行为分别定义两个intent过滤器,因为一个含有ACTION_SENDTO的intent必须使用数据Uri,并通过使用“send”或者“sendto”的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>

Note:

为了接收隐式的intent,你必须在intent过滤器中包含CATEGORY_DEFAULT这一category。startActivity()startActivityForResult()这两个方法都将所有的intent处理为包含有CATEGORY_DEFAULT的category。如果你不声明它,你的应用不会收到任何隐式的intent。

更多关于发送和接收ACTION_SEND的intents的信息,可以阅读:Receiving Simple Data from Other Apps

二). 处理你的Activity中的Intent

为了决定在你的Activity中决定要执行什么行为,你可以读取启动你的Activity的Intent

当你的activity启动后,调用getIntent()来获取启动这个Activity的Intent。你可以在任意一个Activity的生命周期阶段执行这件事情,但一般你应该在早期生命周期回调函数(如:onCreate()或者onStart())中执行。

例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity
Intent intent = getIntent();
Uri data = intent.getData(); // Figure out what to do based on the intent type
if (intent.getType().indexOf("image/") != -1) {
// Handle intents with image data ...
} else if (intent.getType().equals("text/plain")) {
// Handle intents with text ...
}
}

三). 返回一个结果

如果你希望给激活你的activity返回一个结果,调用setResult()来指定结果码和结果Intent。当你的操作执行完毕,并且用户要返回到原来的Activity中了,调用finish()来关闭(或者说销毁)你的activity,例如:

// 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();

你必须为你的结果指定结果码。通常,它不是RESULT_OK就是RESULT_CANCELED。必要时,你可以提供一个包含有额外数据的Intent

Note:

默认结果码设置为RESULT_CANCELED。所以当用户在执行完行为,或在你将结果数据配置完毕之前,按下返回按钮,原始的activity会收到“取消”的结果。

如果你只需要返回一个整数,它代表了一些结果项中的一个,那么你可以将结果码设置为任何一个大于0的数。如果你使用结果码来返回一个整数,此时你不需要再传递一个Intent。你可以调用setResult(),并且只传递一个结果码,例如:

setResult(RESULT_COLOR_RED);
finish();

在这个例子中,可能仅有少量的一些结果,所以结果码是一个本地定义的整形(大于0)。这样做在你给自己的应用的某个activity返回一个结果时,是没有问题的,因为接收这个结果的activity可以引用公有常量来明确结果码的值。

Note:

不需要检查你的activity是被startActivity()还是被startActivityForResult()所启动的。如果启动你的activity的intent需要返回一个值,仅需要调用setResult()。如果原始activity调用的是startActivityForResult(),那么系统将会发送给它你在setResult()中提供的数据,不然的话,这个结果会被忽略。

【Android Developers Training】 30. 允许其它应用启动你的Activity的更多相关文章

  1. 【Android Developers Training】 29. 从Activity获得结果

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

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

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

  3. 【Android Developers Training】 15. 启动一个Activity

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

  4. 【Android Developers Training】 91. 解决云储存冲突

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

  5. 【Android Developers Training】 81. 解析XML数据

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

  6. 【Android Developers Training】 28. 将用户带领到另一个应用

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

  7. 【Android Developers Training】 27. 序言:和其它应用交互

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

  8. 【Android Developers Training】 3. 构建一个简单UI

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

  9. 【Android Developers Training】 0. 序言:构建你的第一个应用

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

随机推荐

  1. ContentSize、Contentoffset以及ContentInset属性

    ContentSize UIScrollView可以滚动的区域.在我的理解中,我把UIScrollView看成是具有上下两层的一个复合视图,frame控制着上层的大小,我们看到的UIScrollVie ...

  2. Linux与堆栈概念

    在学习C/C++编程的时候,老师都会反复灌输一些概念.比如程序内变量在堆栈上的分配,栈是由高地址到低地址,堆是由低地址到高地址等等,然后画出这样一幅经典概念图: 图片来自:http://blog.cs ...

  3. PriorityBlockingQueue详解

    1.PriorityBlockingQueue public class PriorityBlockingQueue<E> extends AbstractQueue<E> i ...

  4. 编写自己的一个简单的web容器(二)

    昨天我们已经能够确定浏览器的请求能够被我们自己编写的服务类所接收并且我们服务类响应的数据也能够正常发送到浏览器客户端,那么我们今天要解决的问题就是让我们的数据能够被浏览器识别并解析. Http(Htt ...

  5. OpenCV探索之路(九):模板匹配

    模板匹配的作用在图像识别领域作用可大了.那什么是模板匹配? 模板匹配,就是在一幅图像中寻找另一幅模板图像最匹配(也就是最相似)的部分的技术. 说的有点抽象,下面给个例子说明就很明白了. 在上面这幅全明 ...

  6. 彻底搞清函数中的this指向

    近日阅读<javascript设计模式与开发实践> 书中的apply和call调用函数层出不穷,很多妙用: 函数中的this是根据调用方式来决定的 函数调用方式有4中 1.直接调用 a(. ...

  7. 在Excel上写程序(ExcelEx)

    首先要说明的是:Ctrl+D,是执行框选的的扩展函数+号,一个单元格里多个函数用+号分隔*号,相当于链式操作(没法子,公式里不能写"."号) 虽还有很大的局限性,至少很多小程序和数 ...

  8. 【试验局】ReentrantLock中非公平锁与公平锁的性能测试

    硬件环境: CPU:AMD Phenom(tm) II X4 955 Processor Memory:8G SSD(128G):/ HDD(1T):/home/ 软件环境: OS:Ubuntu14. ...

  9. Python爬虫01——第一个小爬虫

    Python小爬虫——贴吧图片的爬取 在对Python有了一定的基础学习后,进行贴吧图片抓取小程序的编写. 目标: 首先肯定要实现图片抓取这个基本功能 然后实现对用户所给的链接进行抓取 最后要有一定的 ...

  10. 矢量量化(VQ)

    作者:桂. 时间:2017-05-31  21:14:56 链接:http://www.cnblogs.com/xingshansi/p/6925955.html 前言 VQ(Vector Quant ...