前面学习Activity时己经多次使用了 Intent,当一个Activity需要启动另一个Activity时, 程序并没有直接告诉系统要启动哪个Activity,而是通过Intent来表达自己的意图:需要启动哪个Activity。
Intent不仅是封装Android应用程序需要启动某个组件的“意图”,还是应用程序组件之间通信的重要媒介。本节开始来学习Intent的使用。
一、Intent介绍
Intent最常见的用途是绑定应用程序组件,并在应用程序之间进行通信。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:
1.启动 Activity
Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity(),可以启动新的 Activity 实例。Intent 描述了要启动的 Activity,并携带了任何必要的数据。
如果希望在 Activity 完成后收到结果,则可以调用 startActivityForResult()。在 Activity 的 onActivityResult() 回调中,Activity 将结果作为单独的 Intent 对象接收。
2.启动服务
Service 是一个不使用用户界面而在后台执行操作的组件。通过将 Intent 传递给 startService(),可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了要启动的服务,并携带了任何必要的数据。
如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService(),可以从其他组件绑定到此服务。
3.发送广播
广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),可以将广播传递给其他应用。
接下来通过一个表来列举Intent启动组件的常用的方法,具体如下表所示:
在上表中,列举了通过Intent来开启不同组件的常用方法。需要注意的是,使用Intent开启Activity和开启Service只有两个方法,而开启BroadcastReceiver有多个方法。
二、Intent类型
Android中Intent寻找目标组件的方式分为两种,一种是显式Intent,另一种是隐式Intent。接下来分别针对这两种Intent进行详细的讲解。
1、显式Intent
显式Intent,即在通过Intent启动Activity时,需要明确指定激活组件的名称。在程序中,如果需要在本应用中启动其他的Activity时,可以使用显式意图来启动Activity,其本例代码具体如下:
// 创建Intent对象
Intentintent=newIntent(this, SecondActivity.class);
// 开启Activity
startActivity(intent);
在上述示例代码中,通过Intent的构造方法来创建Intent对象。构造方法接收两个参数,第一个参数Context要求提供一个启动Activity的上下文,第二个参数Class则是指定要启动的目标Activity,通过构造方法就可以构建出Intent对象。
除了通过指定类名开启组件外,显式Intent还可以根据目标组件的包名、全路径名来指定开启组件,代码如下所示:
Intentintent=newIntent();
intent.setClassName("com.jinyu.cqkxzsxy.android.intent", "com.jinyu.cqkxzsxy.android.intent.SecondActivity");
startActivity(intent);
在上述实例代码中,通过setClassName(包名,类全路径名)方法指定要开启组件的包名和全路径名来启动另一个组件。
Activity类中提供了一个startActivity ( Intent intent )方法,该方法专门用于开启Activity,它接收一个Intent参数,这里将构建好的Intent传入该方法即可启动目标Activity。
使用这种方式开启的Activity,意图非常明显,因此称之为显式Intent,也叫做显式意图。
2、隐式Intent
没有明确指定组件名的Intent称为隐式Intent,又叫隐式意图。Android系统会根据隐式Intent中设置的动作(action )、类别(category )、数据(Uri和数据类型)找到最合适的组件。具体代码如下所示:
<activityandroid:name=".SecondActivity">
<intent-filter>
<!-- 设置action属性,需要在代码中根据所设置的name打开指定的组件 -->
<actionandroid:name="com.jinyu.cqkxzsxy.android.intent.action.xxx"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在上述代运中,<action>标明了当前Activity可以响应的动作为“com.jinyu.cqkxzsxy.android.intent.action.xxx”,而<category>标签则包含了一些类别信息,只有当<action>和<category>中的内容同时匹配时,Activity才会被开启。
使用隐式Intent开启Activity的示例代码如下所示:
Intentintent=newIntent();
intent.setAction("com.jinyu.cqkxzsxy.android.intent.action.xxx");
startActivity(intent);
在上述代码中,Intent置顶了setAction(“com.jinyu.cqkxzsxy.android.intent.action.xxx”);这个动作并没有指定category,这是因为清单文件中配置的“android.intent.category.DEFAULT”是一种默认的category,在调用startActivity()方法时,会自动将这个category添加到Intent中。
隐式 Intent启动Activity的示意图如下图所示。
在上图中,Activity A 创建包含操作描述的 Intent,并将其传递给 startActivity()。 Android 系统搜索所有应用中与 Intent 匹配的 Intent 过滤器。 找到匹配项之后,该系统通过调用匹配 Activity(Activity B)的 onCreate() 方法并将其传递给 Intent,以此启动匹配 Activity。
在上述两种Intent中,显式Intent开启组件时必须要指定组件的名称,一般只在本应用程序切换组件时使用。而隐式Intent的功能要比显示Intent更加强大,不仅可以开启本应用的组件,还可以开启其他应用的组件,例如打开系统自带的照相机、浏览器等。
今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!
共同学习,写下你的评论
评论加载中...
作者其他优质文章