《Intent详解(一):显式Intent》
《Intent详解(二):隐式Intent》
《Intent详解(三):Intent的Flags》
《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的所有构造方法,如图所示:
公共的构造方法一共有如上六个,其中我们在显式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提供了很多重载的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。