android Intent(意图)

文章目录

 

 

目录

前言

一、今日回顾

1.《高等数学》:一元函数积分学的几何应用

2.阅读:《逻辑学入门》171页

3.英语:120个单词

二、编程的那些事

1.什么是Intent?

2.Intent的分类

3.Intent过滤器

4.Intent的组成及其基本用法

 

用法1: 利用setComponent(packageName, className)方法:

用法2: 利用setClass(Context pkgContext, String className)方法:

用法3:直接利用Intent提供的一个简化的构造器: 

5. Intent里的一些坑

 

 


前言

 


 

一、今日回顾

1.《高等数学》:一元函数积分学的几何应用

2.阅读:《逻辑学入门》171页

3.英语:120个单词

 

二、编程的那些事

1.什么是Intent?

Intent(意图)是一种消息传递机制。

它既可以在同一个应用程序内部的不同组件之间传递信息,也可以在不同应用程序的组件之间传递信息,还可以作为广播事件发布Android系统的相应信息。

Activity、Service和BroadcastReceiver之间是通过Intent进行通信的。

这四种组件之间的关系如图所示:

 

6c41caa82a2b4596bf9b8739c034df51.png

 

图3-1 四大组件关系图

 

 

 

2.Intent的分类

Intent可以分成以下两类:

显式意图(Explicit intention):通过Component name(组件名称)来指定目标组件。通常用于应用程序内部消息,如在一个Activity中,使用startActivity(intent)启动另一个Activity。比如:

startActivity(new Intent(MainActivity2.this, AwardActivity1.class));

这里第一个参数为“包上下文”,第二个参数是要跳转到的类文件(Activity)。对于context(上下文)原本我也不是很清楚,不过由于写这篇博客的需求,特地找了篇挺全面的博客,这也是为了能及时回顾用的。(绝对干货!)安卓Context到底是什么?带你深度解析_乘风入海的博客-CSDN博客_安卓context是什么

隐式意图(Implicit intention):不需要指定组件名称。通常用于激活其他应用程序中的组件。

 

3.Intent过滤器

Intent过滤器是一种根据Intent中的action(动作) 、category(类型)和data(数据)等内容,对适合接收该Intent的组件进行匹配和筛选的机制。

Activity、Service和BroadcastReceiver组件都能够定义多个Intent过滤器来通知系统它们可以处理哪些隐式Intent。每个过滤器描述组件的一种能力以及该组件可以接收的一组 Intent.

显式Intent不需要通过Intent过滤器就可以将信息发给其目标组件,而隐式Intent需要通过Intent过滤器才可以将信息发给其目标组件。

Intent过滤器使用<intent-filter>节点,在应用程序的配置文件(AndroidManifest.xml文件)中进行相关配置。

系统收到一个启动 Activity的隐式Intent后,将会通过比较Intent 过滤器的 Action Category 和Data 这三个部分来查找最适合的Activity。

4.Intent的组成及其基本用法

Intent对象由Component name、Action、Data、Category、Extras和Flags六个部分组成。

(1)ComponentName(组件名称):在显式Intent中,通过调用setComponent(ComponentName)方法或者setClass(Context, Class)方法,为Intent()设置component属性,进而实现Android的消息传递。

 

用法1: 利用setComponent(packageName, className)方法:

//实例化一个组件名称

方式1:

ComponentName component = new ComponentName("com.example.myapplication","com.example. myapplication.secondActivity");  

  ComponentName()的第一个参数是当前应用的包名,第二个参数是当前应用中要调用的Activity或者Service的全称(包名+类名)。

方式2.:

ComponentName component = new ComponentName(MainActivity.this,secondActivity.class);

 

//实例化一个Intent对象

Intent intent = new Intent();

//为Intent设置组件名称

intent.setComponent(component);

//启动Activity

startActivity(intent);

用法2: 利用setClass(Context pkgContext, String className)方法:

Intent intent = new Intent(); 
//为Intent设置组件名称
intent.setClass(MainActivity.this, secondActivity.class);
startActivity(intent);  

setClass()的第一个参数为Context上下文,可以为application(全局上下文)、自定义Context、或者当前Activity,一般为当前Activity。第二个参数为目标Activity,可以是Activity、Service等。

用法3:直接利用Intent提供的一个简化的构造器: 

Intent intent = new Intent(MainActivity.this, secondActivity.class);
startActivity(intent);

Intent()的参数与setClass()的参数相同。

(2)Action(动作):使用setAction()方法来设置Action属性,使用getAction()方法来获得Action属性。以下对这两个方法进行介绍。

setAction()方法:该方法用来为Intent设置动作,其语法格式如下:

public Intent setAction(String action) ;

其中,参数action是要设置的动作名称,通常为Android API提供的动作常量。

该方法的返回值是Intent对象。

getAction()方法:该方法用来获得Intent的动作名称,其语法格式如下:

public String getAction();

该方法的返回值是String字符串,表示Intent的动作名称。

Action常量

对应字符串

说明

ACTION_MAIN

android.intent.action.MAIN

应用程序入口

ACTION_VIEW

android.intent.actionVIEW

显示指定数据

ACTION_EDIT

android.intent.action.EDIT

编辑指定数据

ACTION_DIAL

android.intent.action.DIAL

显示拨号面板

ACTION_CALL

android.intent.action.CALL

直接向指定用户打电话

ACTION_SEND

android.intent.action.SEND

向其他人发送数据

ACTION_SENDTO

android.intent.action.SENDTO

向其他人发送消息

ACTION_ANSWER

android.intent.action.ANSWER

接听电话

为了指定可接受的Intent Action,Intent过滤器通过< action >标签进行声明。例如以下动作验证设置该活动为启动活动(程序入口) :

<intent-filter>

    <action android:name="android.intent.action.MAIN" />

...

</intent-filter>

 

(3)Data(数据):数据是作用于Intent上的数据的URI和数据的MIME类型,不同动作有不同的数据规格。

例如,如果动作字段是ACTION_CALL,那么数据字段就应该是一个tel:URI和要拨打的电话;如果动作字段是ACTION_VIEW,那么它的数据字段就应该是一个http:URI。

Intent数据应用相关的方法:

setData()方法:该方法用来为Intent设置URI数据,其语法格式如下:

public Intent setData(Uri data) 

其中,参数data是要设置的数据的URI。该方法的返回值是Intent对象。

setType()方法:该方法用来为Intent设置数据的MIME类型,其语法格式如下:

public Intent setType(String type)

其中,参数type是要设置的数据的MIME类型。该方法的返回值是Intent对象。

setDataAndType()方法:该方法用来为Intent设置数据及其MIME类型,其语法格式如下:

public Intent setDataAndType(Uri data, String type)

其中,参数和返回值同setData ()方法和setType()方法。

getData()方法:该方法用来获得与Intent相关的数据,其语法格式如下:

public Uri getData()

该方法的返回值是URI,表示获取到的与Intent相关的数据。

getType()方法:该方法用来获得与Intent相关的数据,其语法格式如下:

public String getType()

该方法的返回值是String字符串,表示获取到的MIME类型。

为了指定可接收的Intent类型,Intent过滤器通过< category >标签进行声明。为了指定可接收的Intent数据,Intent过滤器通过< data >标签进行声明。例如:

<intent-filter>

    <data android:mimeType="video/mpeg" android:scheme="http" ... />

    ...

</intent-filter>

每个<data>标签都可以指定一个URI和一个数据类型(MIME 媒体类型)。URI的每个部分都对应有单独的属性scheme、host、 port和path,格式如下:

<scheme>://< host>:< port>/< path>

//例如以下URI地址:

http://www.studyonline.com:8080/index.htm

其中,scheme是http ,host(主机)是www.studyonline.com ,port(端口)是8080 ,路径是index.htm 。

(4)Category(类型):Category(类型)指定以何种方式去服务Intent请求的动作。

表   常用Category

属性值

说明

CATEGORY_DEFAULT

Android系统中默认的执行方式,按照普通Activitv的执行方式执行

CATEGORY_HOME

设置该组件为Home Activity

CATEGORY _REFERENCE

设置该组件为Preference

CATEGORY_LAUNCHER

设置该组件为在当前程序中优先被启动,通常与入口ACTION MAIN配合使用

CATEGORY_BROWSABLE

设置该组件可以使用浏览器启动

为了指定可接收的Intent类型,Intent过滤器通过< category >标签进行声明。例如以下类型验证设置通常和android.intent.action.MAIN 动作一起使用,表明该活动是一个启动活动(程序入口):

<intent-filter>

    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />

    ...

</intent-filter>

为了通过类型验证,Intent中每个Category都必须与过滤器中相匹配。Intent中声明的Category 少于过滤器中声明的Category,验证可以通过。

(5)Extras(附加信息):Extras(附加信息)是Intent应用中需要关联到的某些特定信息。

Intent对象中有一系列的putXxx()方法用于插入各种附加数据,还有一系列getXxx()方法用于读取相应数据。这些方法与Bundle对象的方法类似,并且附加信息可以作为一个Bundle对象,使用putExtras()方法和getExtras()方法来插入和读取。

putExtra ()/ putExtras()方法:该方法用来为Intent添加附加信息,它有多种重载形式,其常用的重载的语法格式如下:

public Intent putExtra(String name, Parcelable value)

public Intent putExtra(String name, byte value)

public Intent putExtra(String name, CharSequence value)

public Intent putExtra(String name, Bundle value)

public Intent putExtra(String name, String value)

public Intent putExtras(Intent src)//Copy all extras in 'src' in to this intent.

public Intent putExtras(Bundle extras)//Add a set of extended data to the intent.

getExtras()方法:该方法用来获取Intent附加信息,其常用的重载的语法格式如下:

public Intent getExtras()

5. Intent里的一些坑

虽然使用时就那么短短的几行代码,但本人在用Intent进行页面或模块跳转(尤其是模块)时,总会出现一些bug。

25b2c985cdcf43c9ab3a54679938dfb3.jpeg

出现这种错误是你在做模块跳转时,没有在当前模块的Manifest.xml中声明活动,由于没有声明,然后系统找不到,所以就报错咯。 如果是活动间的跳转问题不大,要是用它来做组件间的跳转的话,你一定会遇到问题,有些问题,虽然你解决了,但你可能依然不知道它是啥问题,你有这种经历吗?


 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天真小巫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值