【Java与智能设备】ch0501 Intent的使用

Intent概述

概念
  1. Activity基本设计理念是:减少组件间的耦合;因此在Android中提供了Intent来实现在应用程序组件与组件之间交互。

高内聚,低耦合

  1. Intent:意图, 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述;Android根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。
  2. Intent最主要的作用就是,使用Intent启动三大核心组件 活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver),

四大核心组件:Activity,BroadcastReceiver,Service,ContentProvider


intent对各个组件

在这里插入图片描述


Intent组成
  1. Component(组件):目的组件。
  2. Action (动作):用来表现意图的行动。
  3. Category (类别)ArrySet:用来表现动作的类别。
  4. Data (数据):表示与动作要操纵的数据。
  5. Type (数据类型):对于data范例的描写。
  6. Extras (扩展信息)Bundle:扩展信息。
  7. Flags (标志位)int:期望这个意图的运行模式。
Intent 的使用
  1. 显式Intent对象:直接指明Intent的目的组件

如直接给Component 赋值

  1. 隐式Intent对象:没有直接指明Intent目的组件,而是通过Intent其它属性来隐式指出Intent待加载的组件类

    这里的其他组件指的是 Action Category Data Type



显式Intent

显式Intent:明确指定了当前Intent应该传递给哪个组件的Intent。

使用方法
  1. setClass(Context packageContext, Class<?> cls)
  2. setClassName(Context packageContext, String className),(content,目的组件的全限定名)
  3. setClassName(String packageName, String className),(目的组件所在的Pakage名,目的组件的全限定名)

    这个方法可以调用其他App的Activity(目标Activity),需要在manifest中将目标Activity的exported属性设置为true,这样表示可以被其他程序调用



隐式Intent

隐式Intent:未明确指明待加载的组件类,但是在Intent属性中给出了待加载组件需要满足的特征。那么对应被启动的组件中接受此种属性。

  • 组件的特征取决于在Activity配置中<intent-filter…/>元素的配置。<intent-filter…/>就是用于描述Intent的各种属性, <intent-filter…/>元素通常可包含如下子元素。
    • 0~N个 <action…/> 子元素
    • 0~N个 <category…/> 子元素
    • 0~1个 <data…/> 子元素
  • Action和Category属性都是普通的字符串,Action代表想要完成的一个“动作”,Category代表此动作的额外信息。
  • 被启动的组件是不明确的,取决于Activity的<intent-filter…/>属性。例如:我提供的Action是=“com.example.intent.AAA”,那么就启动指定intent-filter的组件。Action和Category属性要结合使用

Action属性使用时注意事项:
  1. Intent对象只能设定一个Action属性;表明某一个Intent只能加载一个组件。
  2. 若Intent为隐式Intent,且指明了Action属性,则待加载组件必须在AndroidManifest.xml文件中进行注册,且添加< intent-filter>元素并声明< action>子元素。
  3. 在AndroidManifest.xml文件中,一个组件的< intent-filter>元素中可以包含多个< action>子元素,表明该组件可以被不同的Intent加载。
  4. Action属性值可以使用内置的,也可以使用用户自定义的。
  5. 若符合Intent对象的待加载组件有多个,将以列表形式显示出来以供用户选择。

Category属性使用时注意事项:
  1. Intent对象可以添加多个Category属性;使用addCategory( )和removeCategory( )来添加或删除属性。ArraySet()
  2. 若Intent为隐式Intent,且指明了Category属性,则待加载组件需要在AndroidManifest.xml文件中进行注册,且添加< intent-filter>元素声明< category>子元素。
  3. 在AndroidManifest.xml文件中,一个组件的< intent-filter>元素中可以包含多个< category>子元素。
  4. category属性值可以使用内置的,也可以使用用户自定义的。
  5. 若Intent对象指明了action属性,但未指明category属性,则使用默认的category属性Intent.DEFAULT

    android.intent.category.DEFAULT

在这里插入图片描述


data属性
  1. Data属性通常用于向Action属性提供操作的数据,Data属性接受一个Uri对象,Uri对象通过如下形式的字符串表示
    • 使用setData()方法

scheme://host:port/path
content://com.android.contacts/contacts/1

  1. scheme部分是content
  2. host部分是com.android.contacts
  3. port部分被省略了
  4. path部分是/contacts/1 (加上斜杠)
    在这里插入图片描述
//设置data属性  “ data://net.onest.demo:1234/exm ”
             intent.setData(Uri.parse("data://net.onest.demo:1234/exm"));//将字符串解析为URI对象
Type属性
  1. Type属性用于指定Data属性的MIME类型,这种MIME类型可以是任何自定义的类型,只要符合abc/xyz格式的字符串即可。
    • 需要在data结点中设置mineType属性
    • 使用setType()方法

data和type属性一般只需要一个
通过setData方法会把type属性设置为null,
相反设置setType方法会把data设置为null,
如果想要两个属性同时设置,要使用**setDataAndType()**方法。

配置Type

intent.setDataAndType(Uri.parse("data://net.onest.demo:1234/exm"),"language/java");

Extra属性

(见Activity的跳转)

Flags属性
  1. Activity和Task(活动栈)的关系。
    • Task就像一个容器,而Activity就相当于填充这个容器的内容,第一个Activity会处于最下面,最后添加的Activity会在最顶端。从Task中取出Activity是从最顶端取出。
  2. Flags(标志位)表示Intent的运行模式。
// 如果Activity在Task存在,拿到最顶端,不会启动新的Activity
intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
// 如果Activity在Task存在,将Activity之上的所有Activity结束掉
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// 默认的跳转类型,将Activity放到一个新的Task中
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 如果Activity已运行到了Task,再次跳转不会再运行这个Activity
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值