什么是Intent

    Intent是android开发中的重要对象,它作为一个信息承载对象存在。
    我们可以在使用其他一些组件的时候从Intent获取行为响应的准则(即应该做什么东西,如何做)
 
Intent的三种基本使用场景
启动一个Activity:
    通过传递一个Intent对象给startActivity(Intent intent)方法,可以启动一个Activity
 
启动一个服务:
    像启动Activity一样,我们也可以传递一个Intent对象给startService(Intent intent),从而启动一个服务。
 
发送一个广播:
    我们先不管广播是什么东西,现在我们只需要知道向sendBroadcast(Intent intent)方法传递一个Intent对象,就可以发送广播。
    当然,这不是创建广播的全部内容。
 
Intent的类型
intent类型有两种
    显式Intent:需要使用组件的类的全名创建。
               因为我们知道自己创建的类名称,所以一般这个方法在自己的程序内部使用。
显式Intent的创建方法: 
 
//this为应用程序的上下文,MyActivity是自定义类
Intent intent = new Intent(this, MyActivity.class)
 
    隐式Intent:可以在androidManifest注册组件的时候使用intentfilter标签创建。
               只要系统匹配到这个intentfilter,该组件就会被运行。
 
创建隐式Intent的例子(以启动Activity为例):
AndroidManifest文件中有如下Activity的定义
默认情况下,你的隐式intent必须包含 CATEGORY_DEFAULT category
如果没有,系统就找不到你的Activity
建议使用你的应用程序的包名+action名称作为action的字符串
<activity
android:name="com.example.intentdemo.IntentActivity"
android:label="@string/title_activity_intent" >
<intent-filter>
<action android:name="com.example.MYACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在程序中我们可以使用下面的代码启动这个Activity
Intent intent = new Intent("com.example.MYACTION");
startActivity(intent);
 
需要注意的是,当我们需要使用Intent启动一个服务的时候,最好使用显式Intent
因为我们并不知道系统中有多少个使用相同名称定义的服务组件,当启动服务的时候,
我们也不知道到底启动了哪个服务,也无法看到是哪个服务。
从android5.0开始,当我们使用隐式intent传递给bindService()函数的时候,
系统就会抛出异常。
 
Intent里面所包含的信息
既然intent是用来承载信息的,那么它到底可以装载什么信息呢?
1.组件名称:
如,Activity名称,Service名称等。当我们使用显式intent的时候,
我们就要使用这些组件的名称来构造Intent
2.Action(包含在AndroidManifest文件中)
    指定Intent执行什么动作的字符串
    系统已经为我们预先定义了一系列的字符串,我们拿来即可以用。
    具体可以看Intent的官方文档。
    我们也可以定义自己的字符串,只要在<intent-filter>标签里的<action />标签里定义即可
3.Data(包含在AndroidManifest文件中,具体可定义下面的内容)
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string" />

包括指向你要操作的数据的Uri或者你的组件可处理(接受)的数据的类型

例如你的action指定为ACTION_EDIT,那么你的Data包含的Uri就是你要编辑的文件的Uri(可以理解为文档路径)
 
android:scheme属性:用于指定Uri的类型,如网络类型的http,ContentProvider类型的content
android:scheme="http"
android:scheme="content"
如果scheme没有被设置,那么所有的Uri属性将被忽略
如果host没有被设置,那么所有的port属性和path属性将被忽略
如果你的<intent-filter>设置了数据类型(mimeType),但是没有设置scheme
那么系统假设你的Uri类型是content或者file
 
setDate()方法和setType()方法
    这两个方法用于设置组件的Uri和数据类型(对应AndroidManifest文件中的schema和mimeType)
    但是,当我们需要同时设置Uri和mimeType的时候,我们不能同时使用这两个方法,而是应该使用setDataAndType()方法。
 
4.Category
    我们可以使用系统预定义的分类,也可以定义自己的分类。
    还记得我们使用隐式intent的时候需要设置CATEGORY_DEFAULT分类吗。
 
5.Extras
    顾名思义,即额外的东西,以键值对的方式保存。
    你可以使用Intent来传递你可以想象得到的数据类型,如,int,String,Array等

Intent和Intent Filters的更多相关文章

  1. Android开发-API指南-Intent和Intent过滤器

    Intents and Intent Filters 英文原文:http://developer.android.com/guide/components/intents-filters.html 采 ...

  2. android intent和intent action大全

    1.Intent的用法:(1)用Action跳转1,使用Action跳转,如果有一个程序的AndroidManifest.xml中的某一个 Activity的IntentFilter段中 定义了包含了 ...

  3. intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

    ActivityA到ActivityBintent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);//ActivityB不加入后退栈android:noHisto ...

  4. ActivityGroup相关--getLocalActivityManager() 以及intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)用法

    ActivityGroup简介 1.ActivityGroup的核心就是继承了该类,能够通过getLocalActivityManager()得到一个LocalActivityManager 如,Lo ...

  5. Android菜鸟的成长笔记(9)——Intent与Intent Filter(下)

    原文:[置顶] Android菜鸟的成长笔记(9)——Intent与Intent Filter(下) 接着上一篇的内容,下面我们再来看看Intent的Data与Type属性. 一.Data属性与Typ ...

  6. Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)

    原文:[置顶] Android菜鸟的成长笔记(8)——Intent与Intent Filter(上) Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指 ...

  7. Android——Intent和Intent过滤器

    http://www.cnblogs.com/XP-Lee/p/3613830.html Intent就是一个激活组件的消息对象,用于组件之间的通信.需要注意的是,能被Intent激活通信的组件只有三 ...

  8. Android之旅-Intent与Intent Filter[上]

    Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性. 一.显式的Intent 明确指定了要启动 ...

  9. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)用法

    如果已经启动了四个Activity:A,B,C和D.在D Activity里,我们要跳到B Activity,同时希望C finish掉,可以在startActivity(intent)里的inten ...

随机推荐

  1. python 笔记(一) —— 不要误用 ++i、--i

    ilocker:关注 Android 安全(新手) QQ: 2597294287 在 python 中也可以写 ++i,但含义完全不同于 c/c++.python 的 ++i 并不是将 i 自增 1, ...

  2. java报表工具FineReport的JS编辑框和URL地址栏语法简介

    JS编辑框: 1.FineReport的js. 作为一款BS产品,browser端的JavaScript是必不可少的. FineReport中的js是已经调用了finereport.js的. 大家知道 ...

  3. 《2016ThoughtWorks技术雷达峰会----雷达新趋势》

    雷达新趋势    徐昊,ThoughtWorks中国区CTO 1.Open Source  open source 已经从一个简简单单的软件代码组织方式变成一种文化,一种运动.当谈到Open Sour ...

  4. poj1001 Exponentiation 大数的幂

    Description Problems involving the computation of exact values of very large magnitude and precision ...

  5. Java深入 - Java 内存分配和回收机制

    Java的GC机制是自动进行的,和c语言有些区别需要程序员自己保证内存的使用和回收. Java的内存分配和回收也主要在Java的堆上进行的,Java的堆中存储了大量的对象实例,所以Java的堆也叫GC ...

  6. SQL Server系统表sysobjects介绍与使用(转))

    这就让sysobjects表格有了用武之地.虽然我不建议你更新这个表格,但是你当然有权对其进行审查. sysobjects 表  在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等)在表中 ...

  7. flask表单提交的两种方式

    一.通用方式 通用方式就是使用ajax或者$.post来提交. 前端html <form method="post" action="/mockservice&qu ...

  8. Docker简明教程(以安装wget程序为例)

    本文计划: 一.安装Docker(Centos) 二.注册Docker官网帐号 三.下载基础centos镜像,安装需要的软件和环境后,push到自己的repository 一.安装Docker(Cen ...

  9. php 中的curl

    ① curl上传文件 <?php $postData=array( 'name'=>'123', 'upload'=>'@E:/wamp/www/function/result.zi ...

  10. XAMPP部署

    1,直接从官网上下载,然后安装即可 2,出现的问题: a,启动Apache服务器的时候,出现打开端口失败,原因80号端口已被占用,解决方案,更改config文件,将端口设置为8090 b,给phpmy ...