Android - 和其他APP交互 - 让其他app启动你的activity
前面的两篇文章主要讲了一个方面:从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的更多相关文章
- 【Android Developers Training】 30. 允许其它应用启动你的Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android WebView与JavaScript交互实现Web App
当我们去开发一个基于web的android app时,我们第一须要处理的就是与JavaScript的交互问题.Android须要做的事情就是开放某些特定的接口供web里的JavaScript调用,能够 ...
- android 点击通知栏返回应用 ,非启动一个新Activity
再使用如下的 Intent 设置: Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ ...
- android开发里跳过的坑——onActivityResult在启动另一个activity的时候马上回调
该问题是由于被启动的activity的launchMode为singleTask模式,该模式下不可以使用onActivityResult,要使用onActivityResult,被启动的activit ...
- Android - 和其他APP交互 - 获得activity的返回值
启用另一个activity不一定是单向的.也可以启用另一个activity并且获得返回值.要获得返回值的话,调用startActivityForResult()(而不是startActivity()) ...
- 【Android】12.2 利用Intent启动和关闭Activity
分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 Android应用程序中一般都有多个Activity,在Activity中,通过调用StartActivity方法 ...
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android - 和其他APP交互 - 把用户带到其他app
Android的重要功能之一就是app可以根据要执行的操作让用户启动另外一个app.例如,app有一个商业地址然后想要在地图上显示,并不需要在app中加一个显示地图的activity,可以直接用Int ...
- Android - 和其他APP交互
一个Android app通常有好几个activity.每个activity显示一个可以让用户执行特殊操作(例如看地图,照相等)的界面.要让用户从一个activity切换到另一个activity,ap ...
随机推荐
- 一二三(The Seventh Hunan Collegiate Programming Contest)
一二三 你弟弟刚刚学会写英语的一(one).二(two)和三(three).他在纸上写了好些一二三,可惜有些字母写错了.已知每个单词最多有一个字母写错了(单词长度肯定不会错),你能认出他写的啥吗? 输 ...
- hdu1690 Bus System (dijkstra)
Problem Description Because of the huge population of China, public transportation is very important ...
- broadcom6838开发环境实现函数栈追踪
在嵌入式设备开发中.内核为内核模块的函数栈追踪已经提供了非常好的支持,但用户层的函数栈追踪确没有非常好的提供支持. 在网上收集学习函数栈跟踪大部分都是描写叙述INTER体系架构支持栈帧的实现机制.或者 ...
- Android_app项目开发步骤总结
做了几个android企业应用项目后,总结了项目的基本开发步骤.希望可以交流. 一 应用规划: ※确定功能. ※必须的界面及界面跳转的流程. ※须要的数据及数据的来源及格 ...
- Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式
原文:Wix学习整理(7)--在开始菜单中为HelloWorld添加卸载快捷方式 通过前面的几篇随笔,我们已经给我们的HelloWorld提供了填写注册表信息,以及开始菜单快捷方式和桌面快捷方式.这些 ...
- HTC one/M7电信802d 毒蛇ViperOne2.1.0/高级毒蛇工具/完美root,精简/更多自定义,稳定,流畅ROM
ROM版本 HTC One/M7 802d ROM作者 雪狼团队·大盛 http://weibo.com/DaShengdd Android版本 Android 4.2.2 创建日期 2013.09. ...
- ZOJ 1584:Sunny Cup 2003 - Preliminary Round(最小生成树&&prim)
Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the planet w-5 ...
- AIX常用命令略记
■ 初始化端末时可能需要确认服务器端和端末时间是否匹配 ●cal 显示日历 ●date 显示服务前当前时间 ■ 显示当前目录,即显示当前所在目录的adress ●pwd(print workin ...
- PPP协议总结
PPP协议总结 PPP协议是一种在点到点链路上传输.封装网络数据包的数据链路层协议,PPP支持同步/异步方式的链路上. 一. PPP支持的链路类型 1. 同步和异步专线 2. 同步拨号链路. 3. 异 ...
- Nlog配置文件
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nl ...