在上一次讲述Activity的时候,还有一个非常重要且常用的知识点没有讲,就是不同Activity之间的跳转和数据传递。我们在平常在使用app应用的时候,Activity的跳转和数据传递是经常会接触到。基本上每一款app都会有,除非这个应用只有一个界面。例如,我现在要做一款通讯app,当我在通讯录界面(假设为ContactActivity)点击其中的一个联系人,此时就会跳转到该联系人的详情界面(假设为DetailActivity);这其实就是Activity之间的跳转。那么有时候我们在跳转的过程可能会携带一些数据传递给要跳转的界面,这就是Activity之间的数据传递。但要实现这两个功能单靠Activity是不够的,我们还需要使用 Intent来帮忙。
1.Intent概述
Intent的中文意思是 意图、目的、意向;
百度百科:
Intent(意图)主要是解决Android应用的各项组件之间的通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给被调用的组件,并完成组件的调用。
简单来讲,Intent就是就是用于组件的通讯,当我们想在当前Activity去启动另外一个Activity的时候,程序并不会直接去通知或告诉系统要启动哪一个Activity,而是通过Intent进行封装,来表明意图。除了Activity的通讯,Service、BroadcastReciver的通讯我们都会用到Intent。当然这里我们主要还是讲Activity。
那么Activity之间的跳转是怎么通过Intent来实现的呢?
我们先来看一段常用的跳转代码
Intent intent = new Intent(MainActivity.this,DemoActivity.class);
startActivity(intent);
//startActivity(new Intent(MainActivity.this,DemoActivity.class));
上面的代码就实现了MainActivity和DemoActivity之间的跳转。(上面两行和下面注释的一行实现效果是一样的)Activity提供了两种方法来启动启动Activity,其中一个就是startActivity(Intent intent); 另外一个在下面会讲到,使用方式就是传入一个Intent对象。也就是说通过Intent封装好意图后,此时我们还需要通过startActivity才能启动对应的Activity。我们可以通过一张图来更深刻的理解上边的代码。
根据上图其实就可以很好理解上面的跳转代码。这其实是显式跳转的其中一种方式。其实页面跳转是可以通过多种方式来实现的,而这么多方式又分为两大类,第一类是显式跳转,第二类是隐式跳转;下面会讲到,但在讲解这两种跳转方式之前,我们还需要先了解下Intent的各种属性。因为Android应用根据Intent来启动哪个组件或者以哪种方式来启动组件其实就是取决于Intent的各种属性的。
2.Intent的属性
Component
翻译为组件。在Android中,对于Component这个属性我们主要要了解的是ComponentName对象,通过官方解释可以知道ComponentName是特定应用组件的标识符,通常我们通过封装两个属性来标识一个组件:包名以及该组件所的类的完整路径名
//包名:我们在AndroidMainifest中可以看到
package="com.example.demo"
//com.example.demo就是包名,现在假设要找的组件类名就是DemoActivity,所以我们可以知道该组件所在的类的完整路径名就是com.example.demo.DemoActivity。将这两个属性封装成一个ComponentName对象,我们就可以确定一个组件。
确定好组建后,我们就可以通过Intent中的方法给其对象设置好属性:
//还是实现从MainActivity跳转到DemoActivity
ComponentName componentName = new ComponentName("com.example.demo","com.example.demo.DemoActivity");
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
通过上面代码我们可以看到,和之前讲的一样,先将两个属性封装起来,然后就可以找到特定的组件了。其实ComponentName对象中包含了多个构造方法,下面我们再看一种:
//改变一下ComponentName对象构造方法中的参数,其余不变
ComponentName componentName = new ComponentName(MainActivity.this,DemoActivity.class);
然后我们在DemoActivity中获取一下intent中封装的Component属性。
ComponentName componentName = getIntent().getComponent();
Log.d(TAG, "componentName----->"+componentName);
Log.d(TAG, "pkgName----->"+componentName.getPackageName());
Log.d(TAG, "
本文介绍了Android中Intent的使用,包括Intent概述、属性(Component、Action、Category、Data、Extra)以及Flag,详细阐述了如何实现Activity之间的跳转和数据传递,同时讨论了显式和隐式Intent的区别与应用场景。
最低0.47元/天 解锁文章
1067

被折叠的 条评论
为什么被折叠?



