Intent (一)
1,简介
Intent 是一种消息传递机制,可以理解为一种对消息的封装,执行某操作的抽象描述,可用于应用程序内部及应用程序之间
其组成包括:
- 要执行的动作(action)
如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android定义了一套标准动作:
MAIN_ACTION
VIEW_ACTION
EDIT_ACTION
PICK_ACTION
GET_CONTENT_ACTION
DIAL_ACTION
CALL_ACTION
SENDTO_ACTION
ANSWER_ACTION
INSERT_ACTION
DELETE_ACTION
RUN_ACTION
LOGIN_ACTION
CLEAR_CREDENTIALS_ACTION
SYNC_ACTION
PICK_ACTIVITY_ACTION
WEB_SEARCH_ACTIONAndroid也支持自定义动作,并可定义相应的Activity来处理它,建议使用一个描述性的 唯一的字符串,所以最好使用基于JAVA包的命名约定的命名系统。
- 执行动作要操作的数据(data)
采用指向数据的一个URI来表示,
如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。
这种URI表示,通过 ContentURI这个类来描述,具体可以参考android.net.ContentURI类的文档。
以联系人应用为例,以下是一些action / data对,及其它们要表达的意图:
VIEW_ACTION content://contacts/1-- 显示标识符为"1"的联系人的详细信息
EDIT_ACTION content://contacts/1-- 编辑标识符为"1"的联系人的详细信息
VIEW_ACTION content://contacts/-- 显示所有联系人的列表
PICK_ACTION content://contacts/-- 显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父activity。例如:电子邮件客户端可以使用这个Intent,要求用户在联系人列表中选择一个联系人
- 附加属性:
- category(类别),被执行动作的附加信息
- type(数据类型,显式指定Intent的数据类型(MIME)
- component(组件),指定Intent的的目标组件的类名称
- extras(附加信息),是其它所有附加信息的集合
总之,action、 data/type、category和extras 一起形成了一种消息通信机制。
这种消息使系统能够理解诸如“查看某联系人的详细信息”之类的信息。
随着应用不断的加入到系统中,它们可以添加新的action、 data/type、category来扩展这种消息通信机制。
应用也可以提供自己的Activity来处理已经存在的这样的消息,从而改变这些消息的行为。
可以用于:
- 显式启动一个特定的Service或Activity;
Intent intent = new Intent(MyActivity.this, SelectHorseActivity.class);
startActivity(intent);
- 隐式启动Service或Activity来执行一个动作的Intent,支持运行时迟绑定,不必事先知道需要启动哪个应用程序或Activity,这意味着可以创建使用其它应用程序功能的项目,而不必提前确切知道是哪个应用程序提供了这种功能;
Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);
- 广播某个事件已经发生
Intent intent = new Intent(LifeformDetectedReceiver.NEW_LIFEFORM);
intent.putExtra(LifeformDetectedReceiver.EXTRA_LIFEFORM_NAME,
detectedLifeform);
intent.putExtra(LifeformDetectedReceiver.EXTRA_LONGITUDE,
currentLongitude);
intent.putExtra(LifeformDetectedReceiver.EXTRA_LATITUDE,
currentLatitude);
sendBroadcast(intent);
优点:
- 支持应用程序之间的通信,从而把设备从一个包含相互独立的组件集合的平台变成一个互联的系统
- 支持在系统范围内广播消息,从而可以支持基于内部的,系统的或者第三方应用程序的事件创建事件驱动的应用程序
- 隐式调用实现调用者与被调用者之间的松耦合,利于系统的扩展与维护
最佳实践:
- 使用Intent来传播动作(隐式启动,运行时迟绑定),而不是显式地加载类,这种设计方法使组件之间实现分离,允许无缝地替换应用程序元素
2, Intent resolution--Intent 解释
对于运行时迟绑定,系统决定启动哪一个匹配组件(activity,service,broadcast receiver)的过程叫做Intent resolution
Android将已安装包的可用的Intent Filter放到一个列表中,再按以下原则进行匹配,把不匹配的Intent Filter从列表中删除直到找到匹配的Intent Filter
1、执行的动作(action)和执行动作要操作的数据(data)必须匹配
2、如果Intent Filter指定了scheme,host/authority,path或者MIME类型,那么这些值都要和Intent的URI匹配
一般情况下,intent-filter中只要包含action和category就足以满足很多需求。在实际解析过程中,如果一个组件的intent-filter中没有声明任何action,那么任何intent都能与该组件的action相匹配;但是如果一个intent-filter中没有声明任何category,那么这个组件只能与没有指定任何category的intent相匹配。需要注意的是:在隐式调用activity时,系统会自动给intent中加入android.intent.category.DEFAULT的category,所以如果一个intent-filter中不声明Ddefault的category就会导致intent匹配不到任何组件。
对于Broadcast Receiver,每个匹配的接收器都将接收Broadcast Intent
实例见 Intent (二)
Intent (一)的更多相关文章
- Parcelable序列化的使用,关于intent.getParcelableArrayExtra的使用
Parcelable相较于Serializable的效率更高 public class ChargeMode implements Parcelable{ public String name; pu ...
- android Intent介绍
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...
- 很不错的Intent用法 适用于正在开发的伙伴。自己看到了,也分享给大家吧。
本文介绍Android中Intent的各种常见作用. 1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开 ...
- 在Android中Intent的概念及应用(二)——Intent过滤器相关选项
一.如果多个Activity拥有同一个Intent Action,启动时用同一个Action启动会是什么情况? 如何指定某一个Activity启动? 在多个Activity拥有同一个Intent Ac ...
- 在Android中Intent的概念及应用(一)——显示Intent和隐式Intent
Intent寻找目标组件的两种方式: 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的. 隐式Intent:通过Intent ...
- Android的Intent.FLAG_ACTIVITY_CLEAR_TOP无效
转载:http://blog.csdn.net/u011361576/article/details/48626237 今天写代码遇到了一个问题: 当 B - A - B 跳转的时候,使用Intent ...
- Intent
1.http://blog.csdn.net/daogepiqian/article/details/50606474 2.http://blog.csdn.net/wulianghuan/artic ...
- Android基础学习第三篇—Intent的用法
写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...
- Android 笔记 Intent and Bundle day7
学习了Intent与Bundle的使用,进行应用中的交互 package com.example.intent; import android.app.Activity; import android ...
- Android Intent Flags
Intent,顾名思义,即意图,通常用它来启动一个应用程序组件( Activity, Service, 或者 BroadCast Receiver ).在启动一个新的 Activity 时,可以通过给 ...
随机推荐
- 在Java中怎样把数组转换为ArrayList?
翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...
- MySQL 单表百万数据记录分页性能优化
文章转载自:http://www.cnblogs.com/lyroge/p/3837886.html 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台 ...
- memcach 安装
Windows7 x64在Wampserver上安装memcache 2012-07-13 0个评论 收藏 我要投稿 Windows7 x64在Wampserver上安装m ...
- Memcached 配置 和项目应用
Memcached 配置 http://blog.csdn.net/sup_heaven/article/details/32337711 memcached真实项目中的应用 http://blog. ...
- Stanford parser学习:LexicalizedParser类分析
上次(http://www.cnblogs.com/stGeekpower/p/3457746.html)主要是对应于javadoc写了下LexicalizedParser类main函数的功能,这次看 ...
- 重拾C,一天一点点_3
按位运算 C语言提供了6个位操作运算符,只能作用于整型操作数,即只作用于带符号或无符号的char.short.int.long. & 按位与(AND) ! 按位或(OR) ^ ...
- node.js和socket.io纯js实现的即时通讯实例分享
在这个例子中,其实node.js并没有真正起到服务器的作用,因为我们这里可以直接运行client.html文件,而不用输入url请求,当 然,要想输入url请求页面内容还需要加入请求静态文件的代码.这 ...
- mysql命令语句来去除掉字段中空格字符的方法
mysql有什么办法批量去掉某个字段字符中的空格?不仅是字符串前后的空格,还包含字符串中间的空格,答案是 replace,使用mysql自带的 replace 函数,另外还有个 trim 函数. ...
- openerp模块收藏 auto_setup 自动帮你完成建新库时必做几个操作(转载)
auto_setup 自动帮你完成建新库时必做几个操作 原文:http://shine-it.net/index.php/topic,6777.0.html 模块地址: https://github. ...
- 未能加载文件或程序集“Report.Basic”或它的某一个依赖项。试图加载格式不正确的程序
出现问题如下: 解决办法: 这是由于没有开启32位程序兼容模式 具体操作如下:找到对应的程序池--------高级设置-------修改“启用32位应用程序”状态修改为true