前面的两篇文章主要讲了一个方面:从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. PHP 报告分拣和生产理念

    原则排序报告 见一宝.一只猫的排序,我想照猫画虎,鼓捣自己一个. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3VqaWFuZ3dlaTU2Nw==/f ...

  2. 基于Hadoop的地震数据分析统计

    源码下载地址:http://download.csdn.net/detail/huhui_bj/5645641 opencsv下载地址:http://download.csdn.net/detail/ ...

  3. 自己动手写了第三阶段的处理器——教学OpenMIPS处理器蓝图

    我们会继续上传新书<自己动手写处理器>(未公布).今天是第十条.我每星期试试4 从本章開始将一步一步地实现教学版OpenMIPS处理器.本章给出了教学版OpenMIPS的系统蓝图,首先介绍 ...

  4. JAVA Socket(多个客户同时连接,信息共享) client (java/ruby)

    第一步 充分理解Socket 1.什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字" ...

  5. 如何禁止使用teamviwer的使用

    前几天有人问我teamviwer怎么禁止,刚开始做实验的时候过滤了teramviwer.com解析出来的IP,可是还是没有用,其实将teamviwer登陆的服务器地址在路由器上过滤,teramviwe ...

  6. Cordova CLI源码分析(一)——简介

    本系列文章分析基于node.js的命令行工具Cordova CLI,所以如果对node.js基础不是很了解,建议参考http://nodejs.gamesys.net/node-js提供的基础教程 文 ...

  7. 可删除超炫&amp;多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990).谢谢支持!        实例Demo下载地址在本文最后 简介 这个Demo主要是使用了cardsui ...

  8. 怎样在C++中获得完整的类型名称

    Wrote by mutouyun. (http://darkc.at/cxx-get-the-name-of-the-given-type/) 地球人都知道C++里有一个typeid操作符能够用来获 ...

  9. Oracle历史记录

    请问如何查询ORACLE的历史操作记录!!!!!------解决方案-------------------- 有一个专门存储操作的数据库表..select t.SQL_TEXT, t.FIRST_LO ...

  10. centos 6.5 升级内核 linux 3.12.17

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Linux centos 2.6.32-431.el6.x86_64(Centos-6.5-x86_64-mi ...