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详解 (一) : 显式Intent_第1张图片

公共的构造方法一共有如上六个,其中我们在显式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构建新的Intent
Intent 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详解 (一) : 显式Intent_第2张图片

我们看到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为110
bundle.putInt("num", 110);
// 绑定bundle
intent.putExtras(bundle);
// 启动组件
startActivity(intent);

  在ActivityB中使用如下代码获取Bundle中的数据:

// 获取Intent
Intent intent1 = getIntent();
// 获取Intent中的Bundle
Bundle 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,intent,显式intent)