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 ...
随机推荐
- 属性“dataProvider”有多个初始值设定项。(注意:“dataProvider”是“mx.charts.BarChart”的默认属性)。
1.错误描写叙述 属性"dataProvider"有多个初始值设定项.(注意:"dataProvider"是"mx.charts.BarChart&q ...
- 【STL】关联容器 — hash_set
容器hash_set是以hash table为底层机制的,差点儿所有的操作都是转调用hash table提供的接口.因为插入无法存储同样的键值,所以hash_set的插入操作所有都使用hash tab ...
- HUST 1017(DLX)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=65998#problem/A 题意:求01矩阵的精确覆盖. DLX学习资料:ht ...
- hdu1561(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 题意:n座城堡,每个里面都有宝物,要求在你可以攻占m个城堡得到的最多的宝物,但是如果要攻破一个城 ...
- Swift 的类、结构体、枚举等的构造过程Initialization(下)
类的继承和构造过程 类里面的全部存储型属性--包含全部继承自父类的属性--都必须在构造过程中设置初始值. Swift 提供了两种类型的类构造器来确保全部类实例中存储型属性都能获得初始值,它们各自是指定 ...
- [置顶] Guava学习之Multimap
相信大家对Java中的Map类及其之类有大致的了解,Map类是以键值对的形式来存储元素(Key->Value),但是熟悉Map的人都知道,Map中存储的Key是唯一的.什么意思呢?就是假如我们有 ...
- php中遍历数组的方法
参考网址:http://www.jb51.net/article/29949.htm 这三种方法中效率最高的是使用foreach语句遍历数组.从PHP4开始就引入了foreach结构,是PHP中专门为 ...
- U8Linux磁盘与文件系统管理
1.扇区为最小的物理存储单位,每个扇区为512bytes;将扇区组成一个圆,那就是柱面,柱面是分区的最小单位.Linux系统的EX2文件系统:inode的内容用于记录文件的权限与相关属性. 至于blo ...
- C# 通信学习笔记
C# 通信学习笔记 DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不 ...
- TCP closing a connection
client closes socket: clientSocket.close(); step1 :client sends TCP FIN control segment to server st ...