Intent详解 (一) : 显式Intent
《Intent详解(一):显式Intent》
《Intent详解(二):隐式Intent》
《Intent详解(三):Intent的Flags》
《Intent详解(四):使用隐式Intent》
Intent简介
Intent是Android中用来传递消息的组件,启动Activity、Service、BroadcastReceiver都离不开Intent。
在之前的Activity详解教程中我们使用过Intent,最简单的Intent用法如下:
// 创建Intent对象Intent intent = new Intent(ActivityA.this, ActivityB.class);startActivity(Intent);
上面的代码是最简单的Intent应用情况,首先我们通过new创建一个Intent对象,两个参数分别制定了从ActivityA要跳转到ActivityB,然后将Intent对象传递给Activity的startActivity方法,系统就会根据这个Intent的信息来启动对应的组件了。
上面的例子太简单,体现不出来Intent的实例,接下来我们就详细的了解一下Intent到底都能干什么。
Intent分类
Intent分为两种类型:
- 显式Intent:按名称(完全限定类名)指定要启动的组件。通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,启动新 Activity 以响应用户操作,或者启动服务以在后台下载文件。
- 隐式Intent:不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。
Intent分为上面两种类型,但是从上述的描述中我们还是看不出具体Intent的用法和相关细节。我们就上面两种类型来一一讲解。
显式Intent
我们先来看看Intent的所有构造方法,如图所示:
公共的构造方法一共有如上六个,其中我们在显式Intent中常用的有1、2、5这三个。
显式Intent比较简单,主要的特点就是要指定要启动组建的信息(包名、类名)。下面我们就通过几种不同构造Intent的方式来演示一下显式Intent的用法。
1)Intent()
// 使用无参数构造构建Intent对象Intent intent = new Intent();// 设置要启动组件的信息intent.setClass(ActivityA.this, ActivityB.class);// 传递数据intent.putExtra("data", "StringData");startActivity(intent);
这里我们是调用的setClass方法来指定要启动组件的信息的。这个方法的参数与方式三构造中的参数一样。
2)Intent(Intent o)
// 使用无参数构造构建Intent对象Intent intent = new Intent();// 设置要启动组件的信息intent.setClass(ActivityB.this, ActivityB.class);// 传递数据intent.putExtra("data", "StringData");// 使用一个已经构建好的Intent构建新的IntentIntent intent1 = new Intent(intent);startActivity(intent);
3)`Intent(Context packageContext, Class<?> cls)
// 创建Intent对象时指定要启动组件的信息Intent intent = new Intent(ActivityA.this, ActivityB.class);intent.putExtra("data", "StringData");startActivity(intent);
我们看到上面的方式大同小异,区别只是指定要启动组件信息的方式或方法不同,相同的确实不管用什么方式来构建Intent都要指定要启动组件的信息,因为系统会根据这些信息去启动对应的组件。
我们看到上面的例子中我们调用了putExtra方法,这个方法是传送数据使用的,例如我们要在ActivityA传送一些数据到ActivityB,那么我们就可以使用Intent提供的一些putExtra方法。如图所示:
我们看到Intent提供了很多重载的putExtra方法,通过场面的方法我们可以传送所有的基本数据类型、String类型、序列化对象、数组等类型数据。
其中的有一个参数为Bundle,关于Bundle我们后续有专门文章讲解,这里我们只需要知道Bundle也可以传递数据即可,使用Bundle传递数据代码如下:
// 创建Intent对象时指定要启动组件的信息Intent intent = new Intent(ActivityA.this, ActivityB.class);// 创建一个Bundle对象Bundle bundle = new Bundle();// 携带一个int类型的数据key为num,value为110bundle.putInt("num", 110);// 绑定bundleintent.putExtras(bundle);// 启动组件startActivity(intent); 在ActivityB中使用如下代码获取Bundle中的数据:// 获取IntentIntent intent1 = getIntent();// 获取Intent中的BundleBundle bundle1 = intent1.getExtras();// 获取bundle中的数据int num = bundle1.getInt("num");
这里我们总结一下使用Intent传递数据的具体步骤:
1)构建Intent,并指定要启动组件的信息。
2)调用Intent的putExtra方法指定key-value。如果使用Bundle则先创建Bundle对象,然后调用Bundle的put系列方法指定key-value,然后在调用Intent的putExtras方法,将Bundle传递进去即可。
3)调用Activity的startActivity方法传入构件好的Intent即可启动其他组件。
4)在被启动的组件中调用getIntent()方法获取Intent对象,(这里只针对Activity,其他的组件我们后续其他文章讲解)这个Intent对象就是我们上面构件好的Intent,其中携带者我们想要的数据。
5)调用intent的get系列方法并指定key,这里的key与第二步中的key必须一致。获取数据。
一般情况下使用显示Intent就使用上述步骤即可。关于显示Intent我们就讲到这里,我们接下来重点讲解隐式Intent。
更多相关文章
- Android启动过程图解
- mldn andoird
- Android——Framework目录分析及系统启动过程以及目录简介
- android一键退出
- 大话Fragment管理
- 【自定义View系列】android的UI结构
- 关于Android(安卓)Studio开发环境变量的设置(avd启动黑屏)
- Android开发中的优化方案
- Android中四大组件概述以及各自作用