Intent过滤

编写:kesenhoo - 原文:http://developer.android.com/training/basics/intents/filters.html

前两节课主要讲了从你的app启动另外一个app。但如果你的app的功能对别的app也有用,那么你的app应该做好响应的准备。例如,如果你创建了一个social app,它可以分享messages 或者 photos 给好友,那么最好你的app能够接收ACTION_SEND 的intent,这样当用户在其他app触发分享功能的时候,你的app能够出现在待选对话框。

为了使得其他的app能够启动你的activity,你需要在你的manifest文件的<activity>标签下添加<intent-filter>的属性。

当你的app被安装到设备上时,系统可以识别你的intent filter并把这些信息记录下来。当其他app通过执行 startActivity() 或者 startActivityForResult()方法,并使用implicit intent时,系统可以自动查找出那些可以响应这个intent的activity。

添加Intent Filter

为了尽可能确切的定义你的activity能够handle哪些intent,每一个intent filter都应该尽可能详尽的定义好action与data。

如果activity中的intent filt满足以下intent对象的标准,系统就能够把特定的intent发送给activity:

  • Action:一个想要执行的动作的名称。通常是系统已经定义好的值,例如ACTION_SEND或者ACTION_VIEW。 在intent filt中用<action>指定它的值,值的类型必须为字符串,而不是API中的常量(看下面的例子)

  • Data:Intent附带数据的描述。在intent filt中用<data>指定它的值,可以使用一个或者多个属性,你可以只定义MIME type或者是只指定URI prefix,也可以只定义一个URI scheme,或者是他们综合使用。

Note: 如果你不想handle Uri 类型的数据,那么你应该指定 android:mimeType 属性。例如 text/plain or image/jpeg.

  • Category:提供一个附加的方法来标识这个activity能够handle的intent。通常与用 户的手势或者是启动位置有关。系统有支持几种不同的categories,但是大多数都不怎么用的到。而且,所有的implicit intents都默认是 CATEGORY_DEFAULT 类型的。在intent filt中用<category>指定它的值。

在你的intent filter中,你可以在<intent-filter>元素中定义对应的XML元素来声明你的activity使用何种标准。

例如,这个有intent filter的activity,当数据类型为文本或图像时会处理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与type,但是handle这个intent的activity的 <intent-filter>是可以声明多个<action>, <category><data> 的。

如果任何的两对action与data是互相矛盾的,你应该创建不同的intent fliter来指定特定的action与type。

例如,假设你的activity可以handle 文本与图片,无论是ACTION_SEND还是ACTION_SENDTO 的intent。在这种情况下,你必须为两个action定义两个不同的intent filter。因为ACTION_SENDTO intent 必须使用 Uri 类型来指定接收者使用 send 或 sendto 的地址。例如:

 <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:为了接受implicit intents, 你必须在你的intent filter中包含 CATEGORY_DEFAULT 的category。

关于更多sending 与 receiving ACTION_SEND intents来执行social sharing行为的,请查看上一课:接收Activity返回的结果(Getting a Result from an Activity)

在你的Activity中Handle发送过来的Intent

为了决定采用哪个action,你可以读取Intent的内容。

你可以执行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 ...
}
}

返回Result

如果你想返回一个result给启动你的那个activity,仅仅需要执行setResult(),通过指定一个result code与result 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 code。通常不是RESULT_OK就是RESULT_CANCELED。你可以通过Intent 来添加需要返回的数据。

Note:默认的result code是RESULT_CANCELED.因此,如果用户在没有完成操作之前点击了back key,那么之前的activity接受到的result code就是"canceled"。

如果你只是纯粹想要返回一个int来表示某些返回的result数据之一,你可以设置result code为任何大于0的数值。如果你返回的result只是一个int,那么连intent都可以不需要返回了,你可以调用setResult()然后只传递result code如下:

setResult(RESULT_COLOR_RED);
finish();

Note:我们没有必要在意你的activity是被用startActivity() 还是 startActivityForResult()方法所叫起的。系统会自动去判断改如何传递result。在不需要的result的case下,result会被自动忽略。

注意点:

  需要指出的是,一个Intent对象最多只能包含一个Action属性,程序可调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可以包含多个Category属性,程序可调用Intent的 addCategory(Stirng str)方法来为Intent添加Category属性。当程序创建Intent时,该Intent默认启动Category属性值为 Intent.CATEGORY_DEFAULT常量(常量值为android.intent.category.DEFAULT)的组件。             

Intent过滤,intent-filter的更多相关文章

  1. Android菜鸟的成长笔记(9)——Intent与Intent Filter(下)

    原文:[置顶] Android菜鸟的成长笔记(9)——Intent与Intent Filter(下) 接着上一篇的内容,下面我们再来看看Intent的Data与Type属性. 一.Data属性与Typ ...

  2. Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)

    原文:[置顶] Android菜鸟的成长笔记(8)——Intent与Intent Filter(上) Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指 ...

  3. Android之旅-Intent与Intent Filter[上]

    Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性. 一.显式的Intent 明确指定了要启动 ...

  4. Android开发-API指南-Intent和Intent过滤器

    Intents and Intent Filters 英文原文:http://developer.android.com/guide/components/intents-filters.html 采 ...

  5. Android——Intent和Intent过滤器

    http://www.cnblogs.com/XP-Lee/p/3613830.html Intent就是一个激活组件的消息对象,用于组件之间的通信.需要注意的是,能被Intent激活通信的组件只有三 ...

  6. android intent和intent action大全

    1.Intent的用法:(1)用Action跳转1,使用Action跳转,如果有一个程序的AndroidManifest.xml中的某一个 Activity的IntentFilter段中 定义了包含了 ...

  7. Intent和Intent Filters

    什么是Intent     Intent是android开发中的重要对象,它作为一个信息承载对象存在.     我们可以在使用其他一些组件的时候从Intent获取行为响应的准则(即应该做什么东西,如何 ...

  8. intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

    ActivityA到ActivityBintent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);//ActivityB不加入后退栈android:noHisto ...

  9. ActivityGroup相关--getLocalActivityManager() 以及intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)用法

    ActivityGroup简介 1.ActivityGroup的核心就是继承了该类,能够通过getLocalActivityManager()得到一个LocalActivityManager 如,Lo ...

随机推荐

  1. preg_replace的用法

    <?php $str1 = "03/28/2015"; // 要替换成 2015-03-28 echo preg_replace("/([0-1][1-9])\/( ...

  2. [LeetCode]题解(python):129-Sum Root to Leaf Numbers

    题目来源: https://leetcode.com/problems/sum-root-to-leaf-numbers/ 题意分析: 一棵树,从跟节点到叶子节点比如1->2那么这个叶子代表12 ...

  3. C语言(1)--准备

    经过很长一段时间的准备,终于重新弄懂了一些C语言的问题,再次熟悉了C语言的大致应用,对此略有体会,在此以博客记录于此! 准备工作: 运行平台:Linux 编辑工具:vim (还可以使用emac,ged ...

  4. Spring 基于注解的装配

    xml头文件 xmlns:context="http://www.springframework.org/schema/context" 扫描包:<context:compo ...

  5. 使用RUBY生成二维码

    二维码现在貌似已经成为一个项目必不可少的总分了,最近在做的微信项目,更是大大的依赖于二维码,微信公众平台提供的临时二维码,局限太多,只能带一个ID,做不了太多有意义的整个,因为我们很多的二维码是需要自 ...

  6. 一个帝国cms [!--show.listpage--] css样式

    1.在分页位置加<div class="pagepage">[!--show.listpage--]</div> </div>这个标签 2.在需 ...

  7. 宣布发布 Windows Azure ExpressRoute,宣告与 Level 3 建立全新的合作伙伴关系并推出关于其他 Azure 服务令人振奋的更新

     在我们与世界各地的客户和合作伙伴交谈时,总会听到他们说,希望找到一个提供商帮助他们最大限度地发挥内部部署投资的作用并且能够利用云的灵活性.这是我们构建混合云策略和云操作系统愿景的基本原则.本着我 ...

  8. JAVA FILE or I/O学习 - File学习

    public class FileKnow { public static void main(String[] args) { //构建file对象 ,参数表示文件所在的路径 File file = ...

  9. JAVA GUI学习 - JOptionPane对话框组件学习

    /** * 对话框 - 学习笔记 * @author Wfei * */ public class JoptionPaneKnow extends JFrame { public JoptionPan ...

  10. 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例

    第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...