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 时,可以通过给 ...
随机推荐
- 3月3日(4) Binary Tree Inorder Traversal
原题: Binary Tree Inorder Traversal 和 3月3日(2) Binary Tree Preorder Traversal 类似,只不过变成中序遍历,把前序遍历的代码拿出来, ...
- 【转】常用插件和mvn test命令
自定义构建Maven项目,需要包括额外的插件或者配置已存在的插件参数. 1. maven-compiler-plugin 指定JDK版本和编码方式 compiler插件能解决2个问题: 第一: mav ...
- WCF + EF 遇到的问题
此文承接上一文章 基于WCF的API实现 http://www.cnblogs.com/heyixiaoran/p/4000695.html 由于上一次Entity部分没怎么写,到Services里识 ...
- 5、WPF实现简单计算器-非常适合初学者练习
Sample Calculator 这是微软社区WPF的一个示例,在源程序的基础上我进行了一点点修改,非常适合初学者练习,详细代码解释. 源程序的下载地址 http://code.msdn.micro ...
- apache配置VirtualHost(windows)
以下方式适合原生 Apache, XAMPP 和WAMP 套件. 1. 打开目录 {Apache2 安装目录}\conf\extra\, 找到 httpd-vhosts.conf 文件. 2. 仿照例 ...
- QQ群里收集的外企iOS开发的笔试题
一组外企iOS开发的笔试题,您能回答出来吗?从群里收集来的. 1 why can't NSArray contain NSInteger Instance? with which extra step ...
- 【BZOJ 1188】 [HNOI2007]分裂游戏
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- 微软职位内部推荐-Principal Dev Manager
微软近期Open的职位: Title: Principal Dev Manager Location: Beijing The R&D of Shared Data Platform at S ...
- backup site collection
http://stackoverflow.com/questions/5376380/sharepoint-2010-change-sitecollection-urlstsadm -o backup ...
- 精灵的属性Zorder的设置
1.Zorder是CCSprite从父类CCNode那继承来的protected属性: class CCNode{ protected: int m_nZOrder; ...