众所周知,Android开发中,Intent是个比较常见的应用组件,今天,我就参考Google官方文档书写一次详细的从头到尾的博文。

*Intent是一个消息传递对象,可以使用它从其他应用组件请求操作,基本用例包括启动Activity、启动服务和传递广播。

*Intent分为两种类型:显式Intent和隐式Intent。

显式Intent是完全限定类名指定要启动的组件,通常是在自己的应用中使用显示Intent,因为自己知道要启动的Activity或者服务的类名。创建显式Intent启动Activity或者服务时,系统将立即启动指定的应用组件。

隐式Intent不会指定特定的组件,而是声明要执行的操作,从而允许其他应用中的组件来处理。创建隐式Intent时,系统将Intent内容与设备上其他应用的清单文件中声明的Intent过滤器进行比较,从而找到要启动的应用程序,若Intent与Intent过滤器匹配,系统将启动该组件,并向其传递Intent对象,若有多个Intent过滤器匹配,则系统会显示对话框,支持用户选取将要使用的应用。

Intent过滤器是应用清单文件中的一个表达式,它指定该组件要接收的Intent类型,通过为Activity声明Intent过滤器,之后就可以在其他应用程序中直接使用某一特定类型的Intent启动Activity,若没有为Activity声明Intent过滤器,则Activity只能通过显示Intent启动。

(注意:由于使用隐式Intent时,无法确定哪些服务奖响应Intent,故使用隐式Intent存在安全隐患,为了确保应用的安全,启动Service时,务必始终使用显示Intent

构建Intent

Intent中包含:组件名称、操作、数据、类别、Extra、标志。

组件名称,是可选项,若没有组件名称则Intent是隐式的。(注,启动service时,应始终指定组件名称)可以使用setComponent(), sestClass(), setClassName()或Intent构造函数设置组件名称。

操作,在很大程度上决定其余Intent的构成,特别是数据和Extra中的内容。可以指定自己的操作,但通常是使用由Intent类或其他框架类定义的操作常量。启动Activity的常见操作是:ACTION_VIEW, ACTION_SEND等。

数据,创建Intent时,最好是同时指定URI和数据类型(MIME类型)。设置数据URI调用setData(),设置MIME类型调用setType(),若同时设置二者调用setDataAndType()。

类别,大多数Intent不需要类别,常见的类别有CATEGORY_BROWSABLE, CATEGORY_LAUNCHER等。

Extra,可以使用各种putExtra()方法添加extra数据,每种方法均接受两个参数:键名和值,还可以创建一个包含所有extra数据的Bundle对象,然后使用putExtras()将Bundle插入Intent中。

标志,可以指示Android系统如何启动Activity,以及启动后如何处理。setFlag()

显式Intent示例:

Intent intent = new Intent(this, Example.class);
intent.setData(Uri.parse(uri));      //uri为一个stringURI
startService(intent);

隐式Intent示例:

需要注意,用户可能没有任何应用处理发送到startActivity()的隐式Intent,若出现这种情况,则调用将会失败,且程序会崩溃,所以,使用隐式Intent一定要注意验证Activity是否会接收到Intent,对Intent对象调用resolveActivity()方法,若结果非空,则至少有一个应用能处理该Intent,且可以安全调用startActivity(),若结果为空,则不应使用这个Intent,此时若可能,应停用发出该Intent的功能。

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, textMessage);
intent.setType("text/plain");
if(intent.resolveActivity(getPackageManager()!=null){startActivity(intent);
}

在调用startActivity()时,系统将检查已安装的所有应用,确定哪些应用能够处理这种Intent(即:含有ACTION_SEND操作并携带”text/plain“数据的Intent)。

强制使用应用选择器:

若要显示选择器,使用createChooser()创建Intent,并将其传递给startActivity():

Intent sendIntent = new Intent(Intent.ACTION_SEND);
//使用string类型的资源作为UI文本。
String title = getResources().getString(R.string.choose_title);
Intent chooser = Intent.createChooser(sendIntent, title);
if(sendIntent.resolveActivity(getPackageManager()!= null){startActivity(chooser);
}

这将显示一个对话框,其中有响应传递给createChooser()方法的Intent应用列表,并且将提供的文本用作对话框标题。

接收隐式Intent:

每个Intent过滤器均由应用清单文件中的<intent-filter>元素定义,并嵌套在相应的应用文件中,在<intent-filter>内部,可以使用以下三个元素中一个或多个指定要接受的Intent类型:

<action>, 在name属性中,声明接受的Intent操作,该值必须是操作的文本字符串值,而不是类常量。

<data>, 使用一个或多个指定数据URI各个方面(scheme、host、port、path等)和MIME类型的属性,声明接受的数据类型。

<category>, 在name属性中,声明接受的Intent类别,该值必须是操作的文本字符串值,而不是类常量。

注意,为了接收隐式Intent,必须将CATEGORY_DEFAULT类别包括在Intent过滤器中,startActivity()和startActivityForResult()将按照已声明CATEGORY_DEFAULT类别的方式处理所有Intent,若未在Intent过滤器中声明此类别,则隐式Intent不会解析Activity。

以下是一个使用包含Intent过滤器的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"/></intent-filter>
</activity>

特别说明:

使用Intent过滤器时,无法安全地方式其他应用启动组件,尽管Intent过滤器将组件限制为仅响应特定类型的隐式Intent,但如果开发者确定您的组件名称,则其他应用有可能通过使用显示Intent启用你的应用组件,如果必须确保只有自己的应用才能启动的某一组件,则针对该组件将exported属性设置为false。

对于所有Activity,必须在清单文件中声明Intent过滤器牡丹石广播接收器的过滤器可以通过调用registerReceiver()动态注册。稍后可以使用unregisterReceiver()注销该接收器, 这样应用便可以仅在应用运行时的某一指定时间段内侦听特定的广播。

过滤器示例:

下面是一个社交共享应用的清单文件中的片段:

<activity android:name="MainActivity"><!-- This activity is the main entry, should appear in app launcher --><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity><activity android:name="ShareActivity"><!-- This activity handles "SEND" actions with text data --><intent-filter><action android:name="android.intent.action.SEND"/><category android:name="android.intent.category.DEFAULT"/><data android:mimeType="text/plain"/></intent-filter><!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data --><intent-filter><action android:name="android.intent.action.SEND"/><action android:name="android.intent.action.SEND_MULTIPLE"/><category android:name="android.intent.category.DEFAULT"/><data android:mimeType="application/vnd.google.panorama360+jpg"/><data android:mimeType="image/*"/><data android:mimeType="video/*"/></intent-filter>
</activity>

第一个ActivityMainActivity是应用的主要入口点,当用户最初使用启动器图标启动应用时,该Activity将打开:

ACTION_MAIN操作指示这里是主要入口点,且不要求输入任何Intent数据。

CATEGORY_LAUNCHER类别指示此Activity的图标应放入系统的应用启动器,若<activity>元素未使用icon指定图标,则系统将使用<application>元素中的图标。

这两个元素必须配对使用,Activity才会显示在应用启动器中。

第二个Activity ShareActivity 旨在便于共享文本和媒体内容。尽管用户可以通过从MainActivity导航进入此Activity,但也可以从发出隐式Intent的另一应用中直接进入ShareActivity。

注:MIME类型application/vnd.google.panorama360+jpg是一个指定全景照片的特殊数据类型,可以使用Google panoramaAPI对其进行处理。

使用待定Intent:

PendingIntent对象是Intent对象的包装器,PendingIntent的主要目的是授权外部应用使用包含的Intent,就像是它从应用本身的进程中执行一样。

待定Intent的主要用例包括:

*声明用户使用通知执行操作时所要执行的Intent(Android系统的NotificationManager执行Intent)。

*声明用户使用应用小部件执行操作时要执行的Intent(主屏幕应用执行Intent)。

*声明未来某一特定时间要执行的Intent(Android系统的AlarmManger执行Intent)。

由于每个Intent对象均设计为由特定类型的应用组件(Activity、Service或BroadcastReceiver)进行处理,因此还必须基于相同的考虑因素创建PendingIntent。

*PendingIntent.getActivity(),适用于启动Activity的Intent。

*PendingIntent.getService(),适用于启动Service的Intent。

*PendingIntent.getBroadcast(),适用于启动BroadcastReceiver的Intent。

Intent解析:

当系统收到隐式Intent启动Activity时,根据以下三个方面将该Intent与Intent过滤器进行比较,搜索该Intent的最佳Activity:

*Intent 操作 <action android:name="android.intent.action.EDIT/>

*Intent 数据(URI和数据类型)<category android:name="android.intent.category.DEFAULT"/>

*Intent 类别 <data android:mimeType="audio/mpeg"android:scheme="http".../>

<data android:mimeType="image/*"/>

Android中Intent和Intent过滤器详解相关推荐

  1. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  2. android 中的悬浮按钮,Android 中FloatingActionButton(悬浮按钮)实例详解

    android 中floatingactionbutton(悬浮按钮)实例详解 一.介绍 这个类是继承自imageview的,所以对于这个控件我们可以使用imageview的所有属性 二.使用准备, ...

  3. Android中联系人和通话记录详解(2)

    在文章Android中联系人和通话记录详解(1)中对通话记录进行了分析,本章将对联系人的数据库表.字段以及Insert,Query,Delelte,Update四大基本数据操作进行分析. 与联系人相关 ...

  4. Android中内存泄漏超级精炼详解

    一.前期基础知识储备 (1)什么是内存? JAVA是在JVM所虚拟出的内存环境中运行的,JVM的内存可分为三个区:堆(heap).栈(stack)和方法区(method). 栈(stack):是简单的 ...

  5. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

  6. android文件下载功能实现,Android中DownloadManager实现文件下载实例详解

    Android中DownloadManager实现文件下载 下载 创建下载链接 DownloadManager.Request request = new DownloadManager.Reques ...

  7. Android 中Scheme协议的使用详解唤起Activity或App

    1. 什么是URL Scheme? 是一种页面内跳转协议:通过定义自己的scheme协议,可以非常方便跳转app中的各个页面. 2.什么时候使用 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相 ...

  8. Android 中 Scheme 协议的使用详解

    什么是 URL Scheme? 简单的说就是 android 中的一种页面内跳转协议,方便 app 页面的内的跳转 2.什么时候使用 服务器下发跳转路径,客户端根据 服务器下发跳转路径跳转相应的页面 ...

  9. Android 中Scheme协议的使用详解

    1. 什么是URL Scheme? 简单的说就是android中的一种页面内跳转协议,方便app页面的内的跳转 2.什么时候使用 服务器下发跳转路径,客户端根据 服务器下发跳转路径跳转相应的页面 H5 ...

  10. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)

    在之前一篇博文中<< Android中View绘制流程以及invalidate()等相关方法分析>> ,简单的阐述 了 Android View 绘制流程的三个步骤,即: 1. ...

最新文章

  1. 带标签的循环语句、switch
  2. 【机器学习基础】9 大主题!机器学习算法理论面试题大汇总
  3. ValueError: No engine for filetype: 'csv'解决与书本7-2代码改写
  4. ElasticSearch优化系列二:机器设置(内存)
  5. UltraCompare如何使用比较 zip、rar、jar格式文件功能
  6. 解决windows 下 mysql命令行导入备份文件 查询时乱码的问题
  7. Alexa工具条遭清洗,其排名逐渐淡出中国(转)
  8. instagram图片下载_如何使用Python下载Instagram个人资料图片
  9. 乐鑫Esp32学习之旅 17 全网首发,esp32 sdk直连京东微联·小京鱼·IoT开放平台,实现叮咚音响语音智能控制。
  10. 关于C语言颜色改变方法
  11. 陶哲轩实分析 3.2 节 习题试解
  12. MariaDB 10.6.10离线安装
  13. 效率篇-定时任务管理系统,替代crontab
  14. 《零基础掌握 Python 入门到实战》笔记
  15. 无锡华润上华公司实习感想
  16. 太阳能电池基本特性实验报告_太阳能电池基本特性测定实验
  17. 保护信息安全,实名认证该怎么选?
  18. Java如何dump文件
  19. 对物联网的感悟_请谈谈你对物联网的看法?
  20. 超级玛丽马里奥版下载_将超级马里奥赋予生命

热门文章

  1. html获取text值_Python小程序2获取href的值
  2. BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [
  3. .net core Entity Framework 与 EF Core
  4. python设计模式-观察者
  5. linux常见操作命令及相关延伸
  6. Codeforces Round#433 简要题解
  7. java构造函数使用方法总结
  8. 17.2?Replication Implementation 复制实施:
  9. Maven无法上传到到私服
  10. “挨踢民工”的奇葩生活录