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. 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本、内核、当前时间

    申请博客有一段时间了,然而到现在还一篇没有写过..... 主要因为没有想到需要写些什么,最近在学习Python语言,照着书上看了看最基础的东西,发现根本看不进去,而且光看的话今天看了觉得都理解懂了,过 ...

  2. Protel99 SE快捷键大全

    为了方便观看我们的protel99 se视频教程的朋友,我们在这里发布了protel99 se的所有的键盘的快捷分健大全,希望大家在学习我们的视频教程的时候,可以熟悉以下这些快捷键,因为平时我们用pr ...

  3. MinGW 编译zlib、libpng、libjpeg、libcurl等(全都是Qt项目)

    MinGW 这里使用的是Qt5自带的MinGw版本,将路径D:\Qt\Qt5.1.0\Tools\mingw48_32\bin加到"环境变量"→"系统变量"→& ...

  4. libcurl post上传文件

    #include <stdio.h>#include <string.h> #include <curl/curl.h> int main(int argc, ch ...

  5. mfc删除标题和边框

    //删除标题和边框WS_CAPTION和WS_BORDER风格 ModifyStyle(WS_CAPTION, 0);ModifyStyle(WS_BORDER, 0);

  6. Hidden String(深搜)

    Hidden String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  7. Scala函数---既存类型

    语法: Type ::= InfixType ExistentialClauses ExistentialClauses ::= „forSome‟ „{‟ ExistentialDcl {semi ...

  8. 关于js的一些总结

    1.js中如果判断变量是否为空,要注意两种情况: 一种是变量为空:另一种是变量为0: 2.js如果要进行算术运算或者比较,最好把它强制类型为整型或者浮点型.防止字符串比较,如果本来是数字的字符串,如果 ...

  9. Oracle语句优化规则(二)

    21.       用EXISTS替换DISTINCT 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换  例如: ...

  10. python命令行解析工具argparse模块【4】

            上一节我们讲解了add_argument()方法,这一节我们将学习parse_args()方法.          parse_args()方法的作用是解析命令行参数,并返回解析之后的 ...