Android学习之Intent过滤器的使用
来源:互联网 发布:tpshop b2b2c源码 编辑:程序博客网 时间:2024/06/04 18:29
Intent过滤器
我们的app的功能可能对别的app也有用,那么我们的app应该做好响应其他APP的准备。
例如,一个社交app,它可以分享信息或者照片给好友,那么最好我们的app能够接收ACTION_SEND
的intent,这样当用户在其他app触发分享功能的时候,我们的app也能够出现在待选对话框。
通过在manifest文件中的<activity>
标签下添加<intent-filter>
属性,能使其他的app能够启动我们的activity。
当app被安装到设备上时,系统可以识别intent filter并把这些信息记录下来。
当其他app使用隐式intent执行startActivity()
或者startActivityForResult()
时,系统会自动查找出那些可以响应该intent的activity。
添加Intent Filter
为了尽可能确切的定义activity能够处理的intent,每一个intent filter都应该尽可能详尽的定义好action元素与data元素。
若activity中的intent filter满足以下intent对象的标准,系统就能够把特定的intent发送给activity:
Action:一个想要执行的动作的名称。
通常是系统已经定义好的值,如ACTION_SEND或ACTION_VIEW。 在intent filter中通过指定它的值,值的类型必须为字符串,而不是API中的常量(看下面的例子)Data:Intent附带数据的描述。
在intent filter中通过指定它的值,可以使用一个或者多个属性,我们可以只定义MIME type或者是只指定URI prefix,也可以只定义一个URI scheme,或者是他们综合使用。
Note: 如果不想处理Uri类型的数据,那么应该指定 android:mimeType 属性。例如
text/plain
orimage/jpeg
.
- Category:提供一个附加的方法来标识这个activity能够处理的intent。
通常与用户的手势或者是启动位置有关。系统有支持几种不同的categories,但是大多数都很少用到。而且,所有的隐式 intents都默认是 CATEGORY_DEFAULT 类型的。在intent filter中用指定它的值。
在我们APP的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过滤器设置,activity会对外宣称自己是适合处理ACTION_VIEW
的activity。
如果是开发一款浏览器应用,为响应ACTION_VIEW
操作,需要在activity声明中包含以下intent过滤器:
<activity android:name=".BrowserActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" android:host="www.csdn.net" /> </intent-filter></activity>
intent过滤器中的action元素告诉操作系统,activity能够处理指定的任务;
DEFAULT类别告诉操作系统,activity愿意处理某项任务。
DEFAULT类别必须明确地在intent过滤器中进行设置。
如果没有在的intent filter中声明CATEGORY_DEFAULT,activity将无法对implicit intent做出响应。
DEFAULT类别实际隐含添加到了几乎每一个隐式intent中。(唯一的例外是LAUNCHER类别,因为他是所有应用的主activity都会响应的隐式intent,并且要带有MAIN的action)。
每一个发出去的intent只会包含一个action与data类型,但处理这个intent的activity的 可以声明多个, 与 。
如果任何的两对action与data是互相矛盾的,就应该创建不同的intent filter来指定特定的action与type。
例如,假设我们的activity可以处理文本与图片,无论是ACTION_SEND
还是ACTION_SENDTO
的intent。在这种情况下,就必须为两个action定义两个不同的intent filter。因为ACTION_SENDTO的intent 必须使用 Uri 类型来指定接收者使用 send 或 sendto 的地址。例子:
<activity android:name="ShareActivity"> <!-- 处理发送文本; 接受SENDTO行为和带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> <!-- 处理发送的文本和图片; 接受SEND行为和文本或图片的数据 --> <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>
在Activity中处理发送过来的Intent
为了决定采用哪个action,我们可以读取Intent的内容。
可以执行getIntent()
来获取启动我们的activity的那个intent。我们可以在activity生命周期的任何时候去执行这个方法,但最好是在onCreate()
或者onStart()
里面去执行。
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获得启动当前activity的intent Intent intent = getIntent(); Uri data = intent.getData(); // 计算出intent的type if (intent.getType().indexOf("image/") != -1) { // 处理intent的类型是图像的数据 ... } else if (intent.getType().equals("text/plain")) { // 处理intent的类型是文本的数据 ... }}
返回Result
如果想返回一个result给启动我们的activity的那个activity,仅仅需要执行setResult()
,通过指定一个result code与result 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 code。通常不是RESULT_OK
就是RESULT_CANCELED
。我们可以通过Intent来添加需要返回的数据。
Note:默认的result code是
RESULT_CANCELED
.因此,如果用户在没有完成操作之前点击了返回键,那么之前的activity接受到的result code就是”canceled”。
如果只是纯粹想要返回一个整数来表示结果的选项之一,则可以设置result code为任何大于0的数值。
如果我们返回的result只是一个整数,那么连intent都可以不需要返回了,可以调用setResult(int)
然后只传递result code如下:
setResult(RESULT_COLOR_RED);finish();
Note:我们没有必要在意自己的activity是被用
startActivity()
还是startActivityForResult()
方法所叫起的。系统会自动去判断该如何传递result。在不需要result的情况下,result会被自动忽略。
如有不足请评论指出,谢谢!
与官方文档略有出入。。。
参考官方文档:
http://developer.android.com/training/basics/intents/filters.html
- Android学习之Intent过滤器的使用
- Android 之Intent和Intent过滤器
- Android基础之Intent 和 Intent 过滤器
- Android Activity---使用Intent过滤器
- Android Activity---使用Intent过滤器
- Android学习之Intent使用
- Android学习之Intent使用
- Android学习之Intent使用
- android 之Intent的使用
- Android开发之基本组件学习-----------Intent的使用
- Android初级学习之Intent的简单使用
- android学习:通过Intent打开Activity的两种方法,Intent过滤器的使用方法
- android学习之路-使用Intent跳转
- Android 开发中 Intent 和 Intent 过滤器学习笔记
- Android之Intent学习
- Android学习之Intent
- Android -- Intent 和 Intent 过滤器
- Android Intent和Intent过滤器
- awk命令格式
- 关于block的应用
- 最后一个一
- Python中利用set去除列表(list)重复元素
- 1710: 最后一个1 (进制转换变形)
- Android学习之Intent过滤器的使用
- Android-实现简单画图画板
- 学习IOS中
- LCM from 1 to n
- hdu 5413 CRB and Roads 位运算优化复杂度
- sed简记
- iOS 时间戳转换为时间
- 为什么需要SDN
- 气泡,归并,插入,快速,选择排序java实现