Android开发之Intent

之前我们介绍了什么是Activity组件,了解了它的相关生命周期,创建方法,配置布局以及内容注册。那么在一个Android的App中,一般会有多个Activity协同在一起互相联系,这样多个Activity才构成了整个App的展示界面以及展开对用户的接口方便交互,辣么多个Activity之间是如何相互调用的呢?好比按下一个BUTTON,转到了下一个Activity界面,前一个Activity则处于OnPause或OnStop状态,直到按下BACK键,才会发生退栈重新激活原Activity,这整个过程的内部是如何实现的呢?这里就要介绍与Activity联系十分紧密的Intent了。

一、Intent是什么?

我们来看官方参考文档里面关于Intent给出的解释:
Three of the core components of an application — activities, services, and broadcast receivers — are activated through messages, called intents.
所谓的Intent就是激活activity、service和broadcast receivers的消息。
我们可以把activity等想象成邮箱,而intent就是钥匙,只有得到正确邮箱的钥匙才能打开正确的邮箱,取得里面的信件,就是对应的数据以及操作。在Android中,Intent可以与以上三个组件对象建立密切的联系。一个Intent'对象包含了用来连接应用对象的地址消息,也可以包含一部分内容数据,下面我们来看看Android中如何建立Intent对象来关联我们的应用。

二、Intent基本操作

由于我们是用Intent来关联我们的Activity等应用组件对象的,所以这里为了方便就直接使用上文中的Activity了,当我们建立好了Activity类,注册完毕,布局设置OK,重写OnCreate函数完成,以及最后的setContentView(R.layout.activity_abc),我们的Activity相关设置就完成了。下面我们需要实现这样一个功能,在主布局上新建一个BUTTON,当我们按下这个BUTTON的时候,会切换到我们自己创建的Activity布局,实际上就是调用了我们自己的Activity(主布局对应的MainActivity都是系统生成的)。
第一步:建立BUTTON。
打开MainActivity的布局activity_main,点击activity_main.xml标签进入xml编辑界面,在其中根标签后添加<BUTTON></BUTTON>,设置button的相关属性,其中控件最主要的几个属性是android:id,android:layout_width,android:layout_height。BUTTON的相关设置如下图:

注意:android:id的书写请按照”@+id/id名称“这一规范,android:layout_width是控件的布局宽度,wrao_content表示的是与控件内容相适应,android:layout_height是布局高度。text是button的显示文本。

第二步:建立BUTTON的消息响应。
Ctrl+S保存之后,我们就建立了一个按钮在主Activity之中,当按下按钮的时候会进入子Activity,请看下面的代码:

请注意:联系实际操作,在那个界面(Activity)里实现操作,就在那个类文件里编写相关代码,一个类文件对应一个Activity。由于我们按下BUTTON的时候是在主界面下,所以我们应该进到MainActivity中实现相关操作,如上代码先定义了Button变量,这个是用来关联XML中的<BUTTON>标签的。这里我们需要熟悉如果从XML文件中得到想要的变量类型及变量本身。
上面这行代码有几个需要理解的地方:第一、我们通过findViewById这个函数来找到我们的Button,由于Button控件继承自View类,所以返回的值可以进行强制类型转换,关于强制类型转换的原理我会在C++的文章里进行解释。第二、findViewById这个函数的参数来自XML文件,它需要的是一个id,这个id就是我们之前在XML文件中定义的BUTTON控件id。R代表整个工程的资源文件,R.id.btnStartAty1就是通过资源文件找到所有的id集合,再找到xml中定义的id,得到目标控件,再利用函数转换成基类型View的对象,最后通过强制转换得到目标对象。
得到button对象之后,建立事件的消息响应:

调用setOnClickListener方法,并重新OnClick方法,注意我们要实现的是基于View的OnClickListenr,后面我们还会遇到基于Dialog的OnClickLister,两者是不同的。
在OnClick方法里,我们新建了Intent对象,我们可以想象一下,按下BUTTON之后,产生了一条信息指令,这个信息指令是去沟通后面要显示的子Activity的,这个信息指令就是intent对象。新建Intent对象的方法有很多,这里我们使用的是确定当前context与目标activity类的方法,前者表示在哪里生成的intent指令,后者表示要这个消息去沟通谁。
当我们新建好了intent对象之后,就可以使用startActivity(intent对象)来启动我们的Activity了。

三、新建Intent的方法

之前我们介绍了利用当前context对象参数与目标activity对象参数的方法建立了Intent对象。其实Android Apps中很多的Activity我们是无法直接找到它们的,那么我们就无法得到其class对象,那么该怎么办呢?
这里要提到ACTION,ACTION相当于一个地址,标记了对应Activity的位置,每一个Activity都有自己的ACTION。所以我们可以利用new Intent(ACTION)传入ACTION的值来建立Intent。有趣的事,Android操作系统为很多常用的Activity设置了ACTION宏。

例如ACTION_CALL就关联了启动打电话这个activity的地址,ACTION_VIEW就关联了图片浏览的Activity地址。我们可以使用下面的代码启动一个系统下的图片浏览Activity:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType("url","image/*")
startActivity(i);

四、Intent-filter

关于Intent-filter,它描述了一个Activity对象愿意接受怎么样的Intent对象。换句话说,描述了一个Activity对象愿意被怎么样的Intent对象钩住。
当程序员使用 startActivity(intent) 来启动另外一个 Activity 时,如果直接指定 intent 了对象的 Component 属性,那么 Activity Manager 将试图启动其 Component 属性指定的 Activity。否则 Android 将通过 Intent 的其它属性从安装在系统中的所有 Activity 中查找与之最匹配的一个启动,如果没有找到合适的 Activity,应用程序会得到一个系统抛出的异常。这个匹配的过程如下:

<intent-filter></intent-filter>标签的设置在对应的<activity></activity>标签内,文件位于AndroidManifest.xml中,描述了activity和intet-filter的对应关系,怎么样的intent才能连接到activity。
<intent-filter>的三个必须包含的内容分别是<action />、<category />、<data />。下面看下对应于匹配流程的三个匹配:ACTION匹配、CATEGORY匹配、DATA匹配。
ACTION匹配:action设置了访问得到该activity的地址或"动作",那么如果我们设置的intent参数里恰好有action列表里面的action(通过ACTION新建intent对象的时候),辣么就匹配成功。
CATEGORY匹配:<intent-filter >节点中可以为组件定义一个 Category 类别列表,当 Intent 中包含这个列表的所有项目时 Category 类别匹配才会成功.
DATA匹配:即URL匹配。一个intent可以通过Url来携带外部数据给activity,在携带的数据里进行了一些设置,如url、datatype等,此时就需要我们在activity标签下的intent-filter里设置<data />。<data />的设置有两个部分:分别是mimeType描述数据类型,如任意图片用"image/*";协议scheme,本地文件使用file:,web网页数据使用http:,电话数据使用tel:协议不同,具体的数据类别是不一样的,执行与获取方式都不一样。这一点很关键。

五、由Activity得到Intent

当我们单方向的由intent关联到了activity之后,可不可以从activity得到关联到我的intent对象呢?当然可以。
在activity文件里使用getIntent()就可以得到intent对象。getIntent().getStringExtra()还可以得到intent携带的数据等信息。具体大家可以参阅Android官方SDK手册,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值