四大组件的纽带——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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏移动开发

Andorid检测支付宝客户端是否安装

21140
来自专栏程序员互动联盟

【Android基础】Android中的Intent详解

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

43670
来自专栏非著名程序员

Android 图片选择到裁剪之步步深坑

前言 最近在自己的项目里实现了一个头像选择的功能,就是先从相册里选取一张图片再调用系统的裁剪功能来制作头像,效果就像下面这样: ? 本以为很小的一个功能,却远远...

40680
来自专栏飞雪无情的博客

Android Intents and Intent Filters(一)

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

7430
来自专栏yang0range

Activity的启动模式

privatestaticStack mActivityStack;Activity的启动模式,不仅仅是我们面试的时候经常被问到的面试题目,也是我们日常开发当中...

12340
来自专栏梦里茶室

Activity篇章参考

附上学习这部分知识的时候收集的一些比较好的链接: Task and backStack|Android Developer adb shell dumpsys ...

20090
来自专栏小巫技术博客

Activity启动模式解析

11030
来自专栏拭心的安卓进阶之路

Android 进阶2:Activity 的 Task 与启动模式

Android 中的 Task 是什么 我们知道,一个应用中可能有多个 Activity,而这些 Activity 被以栈的形式管理。当我们新打开 Activi...

21050
来自专栏Android干货

Android项目实战(四十九):Andoird 7.0+相机适配

一、在AndroidManifest.xml 文件中添加 四大组件之一的 <provider>

9400
来自专栏程序员互动联盟

【Android基础】Android利用Intent与其他应用交互

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

371100

扫码关注云+社区

领取腾讯云代金券