什么是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. Keil代码中for循环延时问题

  2. Puppet3在CentOS6.5集群下的安装

    环境:3台主机, IP分别为10.211.55.11.12.13 puppet master安装在10.211.55.11 puppet agent安装在10.211.55.11.12.13 1.安装 ...

  3. 用CSS开启硬件加速来提高网站性能(转)

    翻译文章,原文地址:http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-cs ...

  4. python-数据类型补充及文件处理操作

    ___数据类型____ 一.列表的复制 浅复制和深复制 浅复制只复制一层,深复制完全克隆,慎用 1.实现浅复制的三种方式: name=['song','xiao','nan'] import copy ...

  5. EF的入门使用 (电影管理)

    控制器代码: public class HomeController : Controller { private NewDBContext ndc = new NewDBContext(); pub ...

  6. linux运维中的命令梳理(三)

    ----------文本操作命令---------- sed命令:文本编辑工具 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特 ...

  7. Python的高级特性1:容易忽略的不可变类型

    python中有一些容易忽略的不可变类型(str,integer,tuple,None) #错误演示 In [45]: def demo(lst=[]): ....: lst.append(" ...

  8. ACA烤箱菜单各项温度

    说明书找不到了, 网上找到的各项温度说明, 记一个备用 casserole 218度 cake 171度 backery 177度 frozen food 238度 patato 232度 roast ...

  9. oracle小知识总结

    1,表列的五种约束 not null, unique,primary key, foreign key, check 2,权限分配 grant 权限 on 表 to 用户 3,表和视图的区别 视图是一 ...

  10. 深入运用js

    1,eval()函数 这个函数是获取参数的字符串,并将其作为js来处理,所以这里就有可能有人用这个来搞破坏(比如注入JS脚本文件等),所以最好的是方法是尽量少用,或者可以用new function() ...