Android 意图(Intent) 理论详解
Intent( 意图) 简 介
- Android 意图(Intent)是一个要执行操作的抽象描述,是 Android 四大组件间之间的枢纽,通信的桥梁,比如可以通过:
- startActivity(Intent)、startActivityForResult(Intent):启动一个Activity
- startService(Intent)、bindService(Intent):启动一个Service
- sendBroadcast:发送广播到指定 BroadcastReceiver
- 假如现在需要在 Android 设备上通过浏览器打开一个 URL 地址,则可以发送 ACTION_WEB_SEARCH 意图到 Android 意图处理器来在浏览器中打开给定的 URL 。意图处理器通过解析一系列活动,并选择最适合本意图的活动(本例中为 Web 浏览器),意图处理器将传递设置好的网页地址到 Web 浏览器,并打开 Web 浏览器活动,代码如下所示:
String q = "https://www.baidu.com";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);
- 上面几行代码只是一个简单的例子,后面会逐一说明其中的作用,Intent(意图)是 Android 开发至关重要的一个点,必须重点掌握。
- public class Intent implements Parcelable, Cloneable{ 位于 android.content 包,常用构造器如下:
public Intent()
public Intent(String action)
public Intent(String action, Uri uri)
Intent 常用属性
- Intent(意图)对象是一组信息,包括如下的组件,具体取决于通信方式。
Action( 动作)
- Action 是意图对象中必须的部分,被表现为一个字符串。
- 意图对象中的动作可以通过 setAction() 方法来设置,也可以在创建 Intent 的同时进行设置,通过 getAction() 方法来读取。
- 动作将很大程度上决定意图的其它部分如何被组织,Intent 类定义了一系列动作常量对应不同的意图。
常见的 Activity Intent Action 常量 |
||
---|---|---|
常量名称 | 常量值 | 意义/描述 |
ACTION_MAIN | android.intent.action.MAIN | 应用程序入口 |
ACTION_VIEW | android.intent.action.VIEW | 显示数据给用户 |
ACTION_ATTACH_DATA | android.intent.action.ATTACH_DATA | 指明附加信息给其他地方的一些数据 |
ACTION_EDIT | android.intent.action.EDIT | 显示可编辑的数据 |
ACTION_PICK | android.intent.action.PICK | 选择数据 |
ACTION_CHOOSER | android.intent.action.CHOOSER | 显示一个Activity选择器 |
ACTION_GET_CONTENT | android.intent.action.GET_CONTENT | 获得内容 |
ACTION_DIAL | android.intent.action.GET_CONTENT | 显示打电话面板 |
ACITON_CALL | android.intent.action.DIAL | 直接打电话 |
ACTION_SEND | android.intent.action.SEND | 直接发短信 |
ACTION_SENDTO | android.intent.action.SENDTO | 选择发短信 |
ACTION_ANSWER | android.intent.action.ANSWER | 应答电话 |
ACTION_INSERT | android.intent.action.INSERT | 插入数据 |
ACTION_DELETE | android.intent.action.DELETE | 删除数据 |
ACTION_RUN | android.intent.action.RUN | 运行数据 |
ACTION_SYNC | android.intent.action.SYNC | 同步数据 |
ACTION_PICK_ACTIVITY | android.intent.action.PICK_ACTIVITY | 选择Activity |
ACTION_WEB_SEARCH | android.intent.action.WEB_SEARCH | Web搜索 |
ACTION_FACTORY_TEST | android.intent.action.FACTORY_TEST | 工厂测试入口点 |
ACTION_SEARCH | android.intent.action.SEARCH | 搜索 |
常见的 BroadcastIntent Action 常量 |
|
常量名称 | 意义/描述 |
ACTION_TIME_TICK | 系统时间每过一分钟发出的广播 |
ACTION_TIME_CHANGED | 系统时间通过设置发生了变化 |
ACTION_TIMEZONE_CHANGED | 时区改变 |
ACTION_BOOT_COMPLETED | 系统启动完毕 |
ACTION_PACKAGE_ADDED | 新的应用程序apk包安装完毕 |
ACTION_PACKAGE_CHANGED | 现有应用程序apk包改变 |
ACTION_PACKAGE_REMOVED | 现有应用程序apk包被删除 |
ACTION_UID_REMOVED | 用户id被删除 |
Data( 数据)
- 添加Data(数据)到 Intent(意图)过滤器,Data 类型可以是元数据类型、或者一条 URI、或者同时包括元数据类型与 URI 。
- URI 由不同部分的属性来指定,属性是可选的,相互独立。赋值使用 setXxx 方法,对应着取值的 getXxx 方法。
Intent setData(@Nullable Uri data) ——以 URI 来指定数据
Intent setType(@Nullable String type) ——以元类型指定数据
Intent setDataAndType(@Nullable Uri data, @Nullable String type) ——同时指定 URI 和元类型Uri getData() ——获取 UIR 数据
String getType() ——获取元数据
- 如下所示为调用系统内置的短信应用发送信息:
/**为 10086 发送短信* 也可以使用 Intent(String action, Uri uri) 构造器同时设置Action(动作)与Data(数据)* */
Uri uri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(uri);
/**sms_body:设置短信的内容*/
intent.putExtra("sms_body", "Hello");
startActivity(intent);
- 由此可见,不同的 Action 对应着不同的 Data,下表为常见的组合:
Action 与 Data 属性匹配 |
|
动作/数据组合 | 描述/说明 |
ACTION_VIEW content://contacts/people/1 | 显示ID为1的用户的信息。 |
ACTION_DIAL content://contacts/people/1 | 显示电话拨号器,并填充用户1的数据。 |
ACTION_VIEW tel:114 | 显示电话拨号器,并填充给定的号码。 |
ACTION_DIAL tel:114 | 显示电话拨号器,并填充给定的号码。 |
ACTION_EDIT content://contacts/people/1 | 编辑ID为1的用户信息 |
ACTION_VIEW content://contacts/people/ | 显示用户列表,以便查看 |
ACTION_VIEW http://www.google.com | 在浏览器中浏览该网站 |
ACTION_VIEW file://sdcard/mymusic.mp3 | 播放MP3 |
ACTION_VIEW geo:39.2456,116.3523 | 显示地图 |
category( 类别)
- 类别是意图中可选的部分,包含该类型组件需要处理的意图的附加信息,和 Action 一样也是一个字符串。
- addCategory() 方法为意图对象添加类别,removeCategory() 方法删除之前添加的类别,getCategories() 获取所有被设置到意图对象中的类别。
- 如下所示是一段根据应用的包名来调用第三方 APP 打开的例子,如 微信的包名:com.tencent.mm、微博的包名:com.sina.weibo、网易有道的包名:com.youdao.dict :
String packageName = "com.youdao.dict";
PackageManager packageManager = getPackageManager();
Intent intent = packageManager.getLaunchIntentForPackage(packageName);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction("android.intent.action.MAIN");
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
常见 Category 常量 |
|
常量名称 | 意义/描述 |
CATEGORY_BROWSABLE | 目标Activity能通过在网页浏览器中点击链接而激活(比如,点击浏览器中的图片链接) |
CATEGORY_GADGET | 表示目标Activity可以被内嵌到其他Activity当中 |
CATEGORY_HOME | 目标Activity是HOME Activity,即手机开机启动后显示的Activity,或按下HOME键后显示的Activity |
CATEGORY_LAUNCHER | 表示目标Activity是应用程序中最优先被执行的Activity |
CATEGORY_PREFERENCE | 表示目标Activity是一个偏爱设置的Activity |
extra( 附加数据)
- 以键值对描述的附加信息,传递给需要处理意图的组件。
- 通过 putExtras() 方法设值,getExtras() 方法取值。
- 如下所示为一段发送邮件的代码:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, "someone@domain.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("text/plain");
startActivity(intent);
常见 Extra 常量 |
|
常量名称 | 意义/描述 |
EXTRA_BCC | 装有邮件密送地址的字符串数组 |
EXTRA_CC | 装有邮件抄送地址的字符串数组 |
EXTRA_EMAIL | 装有邮件发送地址的字符串数组 |
EXTRA_INTENT | 使用ACTION_PICK_ACTIVITY动作时装有Intent选项的键 |
EXTRA_KEY_EVENT | 触发该Intent的案件的KeyEvent对象 |
EXTRA_PHONE_NUMBER | 使用拨打电话相关的Action时,电话号码字符串的键,类型为String |
EXTRA_SHORTCUT_ICON:使用ACTION_CREATE_SHORTCUT在HomeActivity创建快捷方式时,对快捷方式的描述信息。其中ICON和ICON_RESOURCE描述的是快捷方式的图标,类型分别为Bitmap和ShortcutIconResource。INTENT描述的是快捷方式相对应的Intent对象。NAME描述的是快捷方式的名字 | |
EXTRA_SHORTCUT_ICON_RESOURCE EXTRA_SHORTCUT_INTENT EXTRA_SHORTCUT_NAME EXTRA_SUBJECT :描述信息主题的键 | |
EXTRA_TEXT | 使用ACTION_SEND动作时,用来描述要发送的文本信息,类型为CharSequence |
EXTRA_TITLE | 使用ACTION_CHOOSER动作时,描述对话框标题的键,类型为CharSequence |
EXTRA_UID | 使用ACTION_UID_REMOVED动作时,描述删除的用户id的键,类型为int |
flags( 标记)
- 标记是意图的可选部分,说明Android系统如何来启动活动,启动后如何处理等。
标记 | 说明 |
FLAG_ACTIVITY_CLEAR_TASK | 如果在意图中设置,并通过 Context.startActivity 传递,这个标记将导致与该活动相关联的所有已存在的任务在活动启动前被清空。活动将成为一个空任务的根,所有旧的活动被结束。该标记可以与 FLAG_ACTIVITY_NEW_TASK 结合使用。 |
FLAG_ACTIVITY_CLEAR_TOP | 如果设置该标记,活动将在当前运行的任务中被启动。这并不会启动一个新的活动实例,所有的在它之上的活动被关闭,这个意图作为一个新的意图被传递到已有的(目前在顶部的)活动。 |
FLAG_ACTIVITY_NEW_TASK | 这个标记一般用于使得活动用于"启动器"风格的行为:为用户提供一个可以独立完成运行的数据,并启动完整儿独立的活动。 |
FLAG_ACTIVITY_SINGLE_TOP | 栈顶单实例(当该activity处于task栈顶时,可以复用,直接onNewIntent) |
··············下一篇《Android 显式意图(Intent) 与 隐式意图》
Android 意图(Intent) 理论详解相关推荐
- 【Android】 Intent应用详解
转载:http://blog.csdn.net/liuhe688/article/details/7162988 看似尋常最奇崛,成如容易卻艱辛.北宋.王安石 看似普通的事情其实最不同寻常,并不是简简 ...
- Android应用开发—Intent组件详解
转载自:Android中Intent组件详解 Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件. Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的 ...
- Android Intent机制详解
什么是Intent Intent 是一个将要执行的动作的抽象描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯.比如说调用startActivity()来启动一 ...
- Android自定义属性,format详解
1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name="名称"><attr name="bac ...
- Android的Logcat命令详解:翻译Enabling logcat Logging
Android的Logcat命令详解 --翻译Enabling logcat Logging 田海立@CSDN 2011/07/28 Android LOG系统提供了收集和查看系统调试输出的功能.各种 ...
- Android WebView(一) WebView详解
WebView,在Android开发中,我们总是会遇到,它是Google封装的,使用WebKit渲染引擎加载显示网页.接下来,我们就详细看看WebView的介绍以及使用.如果你想了解WebView主要 ...
- Android网页浏览器开发详解(一)
Android网页浏览器开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的csdn博客) Androi ...
- 《Android NFC开发实战详解》——6.4节Android NFC P2P开发进阶
本节书摘来自异步社区<Android NFC开发实战详解>一书中的第6章,第6.4节Android NFC P2P开发进阶,作者 赵波,更多章节内容可以访问云栖社区"异步社区&q ...
- Android设备扫描机制详解
Android设备扫描机制详解 本文基于Android pie,对Android的设备扫描机制做一个全面的解析,由于本人掌握的知识有限,如有讲错的地方还请大家指出来. Android提供了一套扫描机制 ...
- ANDROID L——Material Design详解(动画篇)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...
最新文章
- Docsify个人网站搭建详细教程
- 用stm32f10x建立新的工程重要步骤
- RDKit | 可视化分子来自于xyz文件
- 为什么品牌商纷纷搭建自己的商城小程序?
- 变分模态分解_Android小部件示例中的模态对话框(弹出)
- X.509证书的介绍
- IOS开发基础之模拟科技头条项目案例32
- jeesite的junit,数据没有插入?
- 美团点评基于MGR的CMDB高可用架构搭建之路【转】
- JAVA——实现json bean实体类的传参校验模板及注解详解
- 计算机普通话培训开班简报,普通话培训第四期简报.doc
- 腾讯2018春招笔试题,翻转数列
- 斯坦福NLP名课带学详解 | CS224n 第6讲 - 循环神经网络与语言模型(NLP通关指南·完结)
- 超级详细的pytest测试和allure测试报告
- go浏览器java_GO浏览器JAVAWP版下载_GO浏览器JAVA2016最新版_GO浏览器JAVA1.2.2-华军软件园...
- virtualbox安装.img文件
- Windows系统压缩卷时可压缩空间远小于实际剩余空间解决方法
- App开发者如何选择移动广告平台1 - 开发者规模分析
- 国产化机器视觉嵌入式主板RK3399
- cesium 关于feature的知识点
热门文章
- Android类参考---Fragment(二)
- 用例规约要细致到万无一失吗?
- 英伟达最大gpu_摩尔定律未死,黄律定律已出!英伟达要用GPU推动AI性能逐年翻倍...
- 拓端tecdat|python主题建模可视化LDA和T-SNE交互式可视化
- python和django的关系_Django一对一关系实践
- python和Java实现斐波那契Fibonacci数列
- Java之面试基础知识学习笔记
- 25张图让你读懂神经网络架构
- matlab iir滤波器设计 实验报告,IIR数字滤波器的设计实验报告
- 营山天气预报软件测试,营山天气预报15天