Intent与IntentFilter

接上一篇,介绍总结一下Intent

那么,什么是Intent呢?
Intent本意为目的意图

我对官方文档拙劣的翻译和理解:

Intent是对一个操作执行的抽象描述,是系统各组件或应用程序之间进行数据传递的数据负载者,换句话说,Intent封装了程序想要启动的程序的意图,是Android应用程序之间或应用程序内部各组件之间进行交互的一种重要方式

Intent类型可以分为显示(Explicit intents)隐式(Implicit intents)两种。

  • 显示Intent直接用组件的名称定义目标组件,通过指定组件的具体类名,通知应用启动对应的组件(就是指定了Component属性~)。当你需要启动一个明确的组件时,就直接给出组件名启动即可。

  • 隐式Intent没有指定组件名的Intent(没有指定Component属性)。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

对于显示Intent,Android不需要去做解析,因为目标组件已经很明确,而对于那些隐式Intent,Android则需通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。

Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。如果有多个IntentFilter匹配,则系统会显示一个对话框供用户选择想要的程序或组件。

创建一个Intent

  • 组件名(Component name):要开启的组件的具体类名。指定了该属性的Intent就是显示Intent,意味着该Intent将被交付给用该名称定义的app组件。没有指定该属性即为隐式Intent,那么要开启什么样的组件则要通过其他属性来判断。
    :使用隐式Intent来开启一个service是危险的,因为你不知道哪一个service会响应你的Intent。从Android5.0开始,如果你用bindService()配合隐式Intent启动一个service,系统会抛出异常。

方法:我们可以通过setComponent()setClass()setClassName()方法或者通过Intent构造方法来设置该属性,通过getComponent()读取。其中,setComponent()接受一个接收一个ComponentName类实例。

  • 行为(Action):一个用来指明要实施的动作是什么的字符串常量。
    Android.content.intent里可以查到所有的Actions。

    下面列举一些常用的Actions:

ACTION_CALL //activity 启动一个电话.
ACTION_EDIT //activity 显示用户编辑的数据.
ACTION_MAIN //activity 作为Task中第一个Activity启动
ACTION_SYNC //activity 同步手机与数据服务器上的数据.
ACTION_BATTERY_LOW //broadcast receiver 电池电量过低警告.
ACTION_HEADSET_PLUG //broadcast receiver 插拔耳机警告
ACTION_SCREEN_ON //broadcast receiver 屏幕变亮警告.
ACTION_TIMEZONE_CHANGED //broadcast receiver 改变时区警告.

你可以使用setAction()方法或者通过Intent来设置Action。

  • 数据(Data):表示动作要操作的数据,更精确地指定当前活动能够响应什么类型的数据。data属性的声明中要指定访问数据的Uri和MIME类型(如text/html,text/xml,image/jpg等)。
    MINE——Multipurpose Internet Mail Extensions多用途互联网邮件扩展

  • 分类(Category):类型为字符串,用于对被执行的动作进行分类。一个Intent对象可以有多个Category。

只有和中的内容同时能够匹配上Intent中指定的action和category时,这个activity才能响应该Intent。

系统提供了很多类别,如:
CATEGORY_BROWSABLE(允许使用浏览器打开activity)CATEGORY_LAUNCHER(系统应用程序启动入口activity)等,
其中,android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法时会自动将category添加到Intent中。
方法:可以使用addCategory()来指定Category;
我们也可以自定义类别,方法和自定义Action一样。在Intent中可以通过setCategory()添加。

  • 扩展信息(Extra):顾名思义,附加信息,是其他所有附加信息的总和。一般用来携带一些数据信息,通过额外的键值对(key-value)把数据保存在Intent对象中。
    举个栗子,比如你想发送一个邮件,你可以将邮件的标题和正文的键保存在Extra里,传给电子邮件发送组件。
    方法:Android为Intent对象提供了一系列put…()和set…()方法来设定和获取附加信息。其实,我们还可以将所有的附加信息放入Bundle里,然后使用putExtra()将这个Bundle作为Extra放入Intent。
    Intent类为标准化数据定义了大量的”EXTRA_* “常量,我们也可以Extra常量,但一定要加上app包名。

    static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";

  • Intent运行模式(Flags):Intent类定义了各种各样的标志,它指明了Android系统如何去启动一个活动(比如这个activity属于哪个返回栈)。
    详细的关于Flags的内容可以看下面的官方文档链接。

大量的已经定义好的Intent属性的常量,可以在Android官方文档查询:
Intent

知识点参考自Android官方文档及《第一行代码》/郭霖

你可能感兴趣的:(Android入门小结)