专栏首页分享达人秀四大组件的纽带——Intent

四大组件的纽带——Intent

前面学习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启动组件的常用的方法,具体如下表所示:

组件类型

启动方法

Activity

ØstartActivity(Intent intent)ØstartActivityForResult(Intent intent, int requestCode)

Service

ØComponentName startService( Intent service)Øboolean bindService(Intent service, ServiceConnection conn, int flags)

BroadcastReceiver

ØsendBroadcast(Intent intent)ØsendBroadcast(Intent intent, String receiverPermission)ØsendOrderedBroadcast(Intent intent. String receiverPermission, BroadcastReceiver resuItReceiver, Handler scheduler, int initialCode, String initialData,Bundle initialExtras) ØsendOrderedBroadcast(Intent intent, String receiverPermission)ØsendStickyBroadcast(Intent intent)ØsendStickyOrderedBroadcast(Intent intent,BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

在上表中,列举了通过Intent来开启不同组件的常用方法。需要注意的是,使用Intent开启Activity和开启Service只有两个方法,而开启BroadcastReceiver有多个方法。

二、Intent类型

Android中Intent寻找目标组件的方式分为两种,一种是显式Intent,另一种是隐式Intent。接下来分别针对这两种Intent进行详细的讲解。

01显式Intent

显式Intent,即在通过Intent启动Activity时,需要明确指定激活组件的名称。在程序中,如果需要在本应用中启动其他的Activity时,可以使用显式意图来启动Activity,其本例代码具体如下:

// 创建Intent对象
Intent intent = new Intent(this,  SecondActivity.class);// 开启ActivitystartActivity(intent);

在上述示例代码中,通过Intent的构造方法来创建Intent对象。构造方法接收两个参数,第一个参数Context要求提供一个启动Activity的上下文,第二个参数Class则是指定要启动的目标Activity,通过构造方法就可以构建出Intent对象。

除了通过指定类名开启组件外,显式Intent还可以根据目标组件的包名、全路径名来指定开启组件,代码如下所示:

Intent intent = new Intent();
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,也叫做显式意图。

02隐式Intent

没有明确指定组件名的Intent称为隐式Intent,又叫隐式意图。Android系统会根据隐式Intent中设置的动作(action )、类别(category )、数据(Uri和数据类型)找到最合适的组件。具体代码如下所示:

<activity android:name=".SecondActivity" >   
 <intent-filter>       
  <!-- 设置action属性,需要在代码中根据所设置的name打开指定的组件 -->        
  <action android:name="com.jinyu.cqkxzsxy.android.intent.action.xxx" />        
  <category android:name="android.intent.category.DEFAULT" />    
 </intent-filter>
</activity>

在上述代运中,<action>标明了当前Activity可以响应的动作为“com.jinyu.cqkxzsxy.android.intent.action.xxx”,而<category>标签则包含了一些类别信息,只有当<action>和<category>中的内容同时匹配时,Activity才会被开启。

使用隐式Intent开启Activity的示例代码如下所示:

Intent intent = new Intent();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更加强大,不仅可以开启本应用的组件,还可以开启其他应用的组件,例如打开系统自带的照相机、浏览器等。

本文分享自微信公众号 - 分享达人秀(ShareExpert),作者:鑫鱻

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-10-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Intent 属性详解(下)

    上一期学习了Intent的前三个属性,本期接着学习其余四个属性,以及Android系统常用内置组件的启动。 四、Data和Type属性 Dat...

    分享达人秀
  • Intent 属性详解(上)

    Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,则取决于Intent的各属性。本期将详细介绍Intent的各属性值,以及 A...

    分享达人秀
  • Activity中启动和关闭其他Activity

    上一期我们学习了Activity的创建和配置,当时留了一个悬念,如何才能在默认启动的Activity中打开其他新建的Activity呢?那么本期一起来学...

    分享达人秀
  • 人生巅峰的梦想之初!—Intent全解析

    Hi,新的征程开始啦,关于各种控件我们给大家介绍的已经差不多了,各位花粉已经陪伴着我们走过了一个阶段,本篇就是我们新征程的开始,当然,我们会在新征程之中偶尔穿插...

    下码看花
  • Android:Intent介绍 & 使用方法

    Intent在Android开发的应用非常常见,今天我就带给大家简单讲一下Intent的相关知识及其用法。

    Carson.Ho
  • Intent详细介绍及使用实例

    一个Android程序通常有多个组件构成。如果要从一个Activity切换到另一个,必须用Intent来激活。实际上,Activity,Service和Broa...

    提莫队长
  • 【Android基础】Android中的Intent详解

    前言: 每个应用程序都有若干个Activity组成,每一个Activity都是一个应用程序与用户进行交互的窗口,呈现不同的交互界面。因为每一个Acticity...

    程序员互动联盟
  • Android Intents and Intent Filters(一)

    看过前面的几节教程的应该都会留意到一个很重要的东西,那就是Intent。Intent是什么呢?我们都知道Android有四大核心组件 Activity、Serv...

    飞雪无情
  • 【Android基础】Android利用Intent与其他应用交互

    前言: 上一篇博客给大家聊了Intent的定义,分类、属性和功能,相信大家对于Intent在Android中的作用已经清楚,这一篇博客将会给大家聊Intent...

    程序员互动联盟
  • Android:关于 Intent组件的那些小事(介绍、使用方法等)

    a. 8种基本数据类型(boolean byte char short int long float double)、String b. Intent、Bu...

    Carson.Ho

扫码关注云+社区

领取腾讯云代金券