什么是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. kernel启动console_init之前console不可用时发生crash的调试方法

    http://code.google.com/p/innosoc/wiki/KernelBootCrashDebug 注: 如在i386_start_kernel中加入:early_printk(&q ...

  2. 系统进程 zygote(一)—— 概述

    和蔼的春光,充满鸳鸯的池塘:快辞别寂寞的梦乡,来和我摸一会鱼儿,折一枝海棠.—— 徐志摩·醒!醒! ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 先看一张 ...

  3. AI(Adobe Illustrator)简单入门——骷髅

    成果: 步骤如下: 一.椭圆工具画正圆 按住shift+alt画一个正圆. 二.圆角矩形工具画矩形 用圆角矩形工具画一个矩形,然后全选水平垂直对齐. 三.画眼睛 利用椭圆工具画一只眼睛,然后按住alt ...

  4. Miller-Rabin素数快速检测

    满足费马小定理 a^(n-1) === 1(mod n) --->伪素数       对于所有a belong Zn*,总存在满足的合数n,称为Carmichael数 ------------- ...

  5. C#中Abstract和Virtual

    C#中Abstract和Virtual 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Vi ...

  6. Java面向对象:接口

    Java面向对象之接口 什么是接口:接口是一种规范和标准,他们可以约束类的行为,是一些方法特征的集合 语法: [修饰符] interface 接口名 extends 父接口1,夫接口2....... ...

  7. 用ccproxy + stunnel做个加密代理

    https://www.stunnel.org/downloads.html ccproxy + stunnel做个加密http代理和socks5代理 目前国内用户无法访问某些国外网站,如http:/ ...

  8. [No000008]发工资不仅仅是让你写代码的

    这是我对团队每个新进员工说的第一件事情.这句话的意思是,我并不关心你是如何快速完成任务的,哪怕代码很差,只要它像救生艇通气门一样管用就行.这句话也是我最喜欢的座右铭之一. 这个说法其实很合理:我们的工 ...

  9. java 22 - 5 多线程之获取和设置线程对象的名称

    如何获取线程对象的名称呢? public final String getName():获取线程的名称.如何设置线程对象的名称呢? public final void setName(String n ...

  10. http协议(十)实体首部字段

    1.定义 包含在请求和响应中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息 2.Allow 通知客户端能够支持的Request-URI指定资源的所有http方法 如果服务器接收到不支 ...