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 时,可以通过给 ...
随机推荐
- 为什么ARM的frq中断的处理速度比较快
FRQ向量位于异常向量表的最末端,不需要跳转就可以直接执行后面跟随的异常处理程序:FRQ模式中私有寄存器数量最多,在进行异常处理时不需要对这些寄存器进行压栈保存.
- js 统计字符串中出现次数最多的字符?
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- WP开发笔记——日期时间DateTime.Now函数
//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString(& ...
- SUID或SGID程序中能不能用system函数
system()函数的声明和说明如下: 注意它的描述那里,system()执行一个由command参数定义的命令,通过调用/bin/sh -c命令来实现这个功能.也就是说它的逻辑是这样的! 进程调用s ...
- 万能的SQLHelper帮助类
/// <summary> /// 数据库帮助类 /// </summary> public class SQLHelper { private static string c ...
- hbase meta表的结构
下面看下hbase:meta 表的结构,hbase:meta表中,保存了每个表的region地址,还有一些其他信息,例如region的名字,HRegionInfo,服务器的信息.hbase:meta表 ...
- Delphi XE5教程4:程序和单元概述
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...
- haproxy 安装与配置文件详解
本文主要阐述haproxy的安装配置详解,对于它的概念,作用,功能,和其它LB软件的区别,优点,缺点等不再进行说明. 一. haproxy 的安装配置 # cat /etc/redhat-releas ...
- php操作mysqli(示例代码)
<?php define("MYSQL_OPEN_LOGS",true); class mysqliHelp { private $db; public function _ ...
- windows鼠标消息处理与键盘模拟函数
1.鼠标坐标问题 BOOL GetWindowRect( HWND hWnd, LPRECT lpRect ); RECT x;//定义一个二维数组x ::GetWindowRect(hwn ...