前两节课主要讲了从你的app启动另外一个app。但是如果你的app可以响应前面发出的action,那么你的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。

Add an Intent Filter [添加Intent Filter]

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

主要有下面三个方面需要定义:

Action
一个想要执行的动作的名称。通常是系统已经定义好的值,例如 ACTION_SEND或者 ACTION_VIEW。
Data
Intent附带数据的描述。可以使用一个或者多个属性,你可以只定义MIME type或者是只指定URI prefix,也可以只定义一个URI scheme,或者是他们综合使用。

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

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

示例:

<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_SENDTOintent 必须使用Uri类型来指定接收者使用sendsendto的地址。例如:

<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 与 receivingACTION_SENDintents来执行social sharing行为的,请查看Receiving Content from Other Apps.【Android Training - 06】分享数据内容 [Lesson 2 - 从其它app接收分享的内容]

Handle the Intent in Your Activity [在你的Activity中Handle发送过来的Intent]

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

你可以执行getIntent()来获取启动你的activity的那个intent。你可以在activity生命周期的任何时候去执行这个方法,当是你最好是在onCreate()或者onStart()里面去执行。

@Overrideprotected 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 ...    }}

Return a Result [返回Result]

如果你想返回一个result给启动你的那个activity,仅仅需要执行setResult(),通过指定一个result code与result intent。当你的的操作成功之后,用户需要返回到原来的activity,通过执行finish()来关闭被叫起的activity。
// Create intent to deliver some kind of result dataIntent 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_COLOR_RED); finish();

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


学习自:http://developer.android.com/training/basics/intents/filters.html,欢迎交流!

转载请注明出自:http://blog.csdn.net/kesenhoo,谢谢!









更多相关文章

  1. Android应用开发笔记(7):构建自己的Android账户与内容同步机制,例
  2. Android(安卓)实现自定义圆环
  3. Android(安卓)选择联系人+返回对应手机号码
  4. Android(安卓)仪表进度条 自定义View
  5. android页面布局时定义控件ID时@id/XX和@+id/xx 有什么区别?
  6. 基于frida的几种安卓脱壳工具
  7. android集成Crosswalk内核,屏蔽返回键问题。
  8. Android(安卓)自定义View(三):重写View实现全新控件
  9. Android(安卓)使用AsyncTask 后监听异步加载完毕的动作-(by terry

随机推荐

  1. 简单记录PHP的超全局变量$_SERVER
  2. PHP+Redis 有序集合实现 24 小时排行榜实
  3. PHP面试题汇总(附答案)
  4. PHP is_file、file_exists、is_dir总结
  5. php 创建目录的几种方法
  6. PHP跨域问题解决方案
  7. 深度解析Nginx下的PHP框架路由实现
  8. php查询数据库并输出乱码
  9. PHP生成有背景的二维码图片
  10. php关于日期时间的操作