`

Android简明开发教程七:Intents和Intent Filters

 
阅读更多

Android应用中的三个核心组件:Activities,Services和broadcast receivers都是通过称为“Intent”的消息来激活的。Android应用一个特点是“低耦合”,各个Activities,Services和broadcast receivers相当独立,可以看成是一个个“迷你应用”,而Intent是这些“迷你应用”的粘合剂,Intent不但可以用于同一个Application之间Activities,Services和broadcast receivers的交互,也可以用于不同Application之间Activities,Services和broadcast receivers的交互。
Intent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性。用个容易理解的概念,在访问网站时,我们需要提供网站的URL,有时还需要通过URL参数,在Android世界里,Intent 的功能类似于URL,Android操作系统根据Intent来触发对于的Activitives,Services或是Broadcast Receivers。

Android应用中的三个核心组件:Activities,Services和broadcast receivers都是通过Intent来触发的,当它们触发的机制各不相同,而且不会有重叠,也就是说发给Activity的Intent不会激活Service或是broadcast receivers,发给broadcast receivers的Intent也不会触发Activity和Service。

  1. Activity 通过方法 Context.startActivity() 和 Activity.startActivityForResult()来调用。以函数调用为参考startActivity() 相当于调用无返回值的函数,startActivityForResult()调用的Activity有返回值,可以通过Activity.setResult()来返回结果。
  2. Context.startService()用来初始化Service,Context.bindService()可以用来建立与目标Service之间的连接,如果Service没有运行,则会启动该Service。
  3. Broadcast Receiver是通过 Context.sendBroadcast(), Context.sendOrderedBroadcast(), 和Context.sendStickyBroadcast()来触发的。大部分的Broadcast消息来自于Android操作系统,如电池状态,来电,短消息等。

和URL不太一样的是,URL和网站一般是一一对应的,而一个Intent可以用来触发某个指定的Activity,Service或是Broadcast Receiver,或是触发多个满足Intent条件的Activities,Services或是Broadcast Receivers。

下面来看看Android OS如何根据Intent来找到满足触发条件的Activity,Service或是Broadcast Receiver. 借用SQL 数据库的概念可以更好的理解。

SELECT (Activitives|Services|Broadcast Receivers) AS Target
FROM (List in AndroidManifest.xml)
WHERE Intent Meet Target’s (Intent Filter)

意思就是从AndroidManifest.xml中定义的Activities,Services和Broadcast Receiver列表中查找符合Intent 条件的Activities,Services,或是Broadcast Receivers。所有能活被激活的Activity,Service和Broadcast Receiver都必须在AndroidManifest.xml有定义,否则Android OS无法查询到该目标,相当于数据库中无记录,即使你在代码中定义了该Activity,Service或Broadcast Receiver。

Intent
Intent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性。它主要包含下列信息:
Component name: 可以处理该Intent的组件名称,组件名称指定义Activity,Service的包和类的全名称。比如类名为com.pstreets.gisengine.AndroidGISEngineTutorial ,包名为com.pstreets.gisengine。 组件名称为可选项,如果指定了,意味明确指定用来响应该Intent的Activity,Service。
Action: 列出需要执行的操作名称。或者在Broadcast Intents的情况下给出发生的事件名称。

Constant Target component Action
ACTION_CALL activity 开始打电话.
ACTION_EDIT activity 显示编辑对话框.
ACTION_MAIN activity 作为一个任务(应用)的起始Activity,对于可以从Android应用列表的应用来说,都需要在AndroidManifest.xml 中设置ACTION_MAIN的Intent-Filter属性。
ACTION_SYNC activity 同步数据.
ACTION_BATTERY_LOW broadcast receiver 电池电量低告警.
ACTION_HEADSET_PLUG broadcast receiver 耳机插入或拔出.
ACTION_SCREEN_ON broadcast receiver 屏幕打开或关闭.
ACTION_TIMEZONE_CHANGED broadcast receiver 时区变动.

Data: 定义不数据的URL以及数据的MIME类型。不同的Action能够处理的Data类型也不一样,比如 ACTION_CALL,它处理的数据格式为tel: URI,URI为电话号码。
Category: 定义了可以响应Intent的附加信息,一个Intent可以指定多个Category类型。和Action类似,Android 预定义了一些Category类型:

Constant Meaning
CATEGORY_BROWSABLE 表示目标Activity可以使用浏览器安全显示指定连接,比如说一个图片或是Email消息.
CATEGORY_GADGET 表示该Activity可以当作一个Gadget嵌入到其它可以放置Gadget的Activity中。
CATEGORY_HOME 表示还Activity是Home Screen,可以设置这个属性来替换Android自带的Home Screen。
CATEGORY_LAUNCHER 该Activity可以显示在Android程序管理器中。一般应用的主Activity都会在AndroidManifest.xml 定义该属性。

Extra: 附加Key-Value列表,可以向目标Activity传送附加参数。可以理解成函数调用时的参数。
Flags: 指出Android启动目标Activity时的一些选项(比如目标Activity隶属于那个应用等)。

除非是Intent明确指定目标(Explicitly)Activity的类和包名称,这是Activity无需在AndroidManifest.xml定义intent-filter,其它情况也叫隐含(Implicit)方式启动目标Activity,在这种情况下Android 操作系统查找目标Activity,Service或是Broadcast Receiver时主要根据Intent 的Action,Data 和Category属性来匹配定义在AndroidManifest.xml 中 Activity,Service或是Broadcast Receiver的 Intent Filters。

Intent Filters

Android中没个有效的Activity,Service,Broadcast Receiver都必须在AndroidManifest.xml有对应的定义。除非只使用明确调用发生来启动目标Activity,每个Activity都需要定义一个intent-filter。下面是是明确指定目标Activity的示例代码:

1
2
Intent intent= new Intent(SplashActivity. this ,GNavigator. class );
startActivity(intent);

而更一般的情况,Activity在AndroidManifest.xml具有如下定义:

<activity android:name=”.AndroidGISEngineTutorial”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<action android:name=”com.example.project.SHOW_CURRENT” />
<action android:name=”com.example.project.SHOW_RECENT” />
<action android:name=”com.example.project.SHOW_PENDING” />

….
<category android:name=”android.intent.category.DEFAULT” />
<category android:name=”android.intent.category.BROWSABLE” />

<data android:mimeType=”video/mpeg” android:scheme=”http” . . . />
<data android:mimeType=”audio/mpeg” android:scheme=”http” . . . />
….
</intent-filter>
< /activity>

Activity的intent-filter可以包含action,category,data 子元素,给出了该Activity能够处理的Intent的Action,Category和数据类型。Android 操作系统就是根据Activity的intent-filter来匹配Intent,从而触发目标Activity,或是Service,Broadcast Receiver。

最常见的一个Intent Filter组合如下:

<intent-filter . . . >
<action android:name=”code android.intent.action.MAIN” />
<category android:name=”code android.intent.category.LAUNCHER” />
</intent-filter>

表示用户可以从Android设备的应用程序管理器启动该Activity,这个Activity为应用的主Activity,主Activity可以再使用Intent触发或是启动其它Activity。

分享到:
评论

相关推荐

    Android系列教程之十二:Intents and Intent Filters(三).docx

    本教程将深入讲解Intent和Intent Filters,特别是如何利用它们进行数据检测。 在Intent Filter中,`&lt;data&gt;`标签用于定义Intent可以携带的数据类型和URI。例如,以下是一个简单的Intent Filter配置: ```xml ...

    Android Intents and Intent Filters(一)

    Android Intents and Intent Filters(一) 对应博客地址:http://blog.csdn.net/michael__li/article/details/6947545

    Android开发之旅 Intents和Intent Filters(实例部分)(免费)

    ### Android开发之旅:深入理解Intents与Intent Filters 在Android开发中,`Intents`与`Intent Filters`是实现组件间通信的关键技术。通过这两项技术,开发者可以让应用程序中的不同组件,甚至不同的应用程序之间...

    Intents and Intent Filters 理论中英双文

    内含四个pdf文件,分别为 Intent and Intent-filter Intents and Intent Filters理论英文 Intents and Intent Filters理论中文 Intent入门指南 详尽介绍关于android intent

    Android Intents and Intent Filters(二)源代码

    Android Intents and Intent Filters(二)源代码 对应博客 http://blog.csdn.net/michael__li/article/details/6950127

    Android开发之旅

    Android开发之旅:环境搭建及HelloWorld 1 Android开发之旅:HelloWorld项目的目录结构 2 Android开发之旅:android架构 3 Android开发之旅:应用程序...Android开发之旅 Intents和Intent Filters(实例部分) 17

    Android Studio 实验二:Intent的使用

    在Android开发环境中,Intent是应用间通信的重要工具,它用于启动其他组件或传递数据。本实验将深入探讨Android Studio中Intent的使用,帮助你更好地理解如何在不同的Activity之间跳转和传递信息。 首先,让我们...

    Intents 和Intent filter 理论介绍

    Intent 在 Android 开发中扮演着至关重要的角色,它是应用程序组件间通信的关键机制,使得组件之间可以实现松散耦合的交互。Intent 不仅仅用于启动另一个 Activity,还可以启动 Service 或触发 Broadcast Receiver。...

    Learning Android Intents

    ### 学习Android Intents:理解与应用Intents的力量 #### 概述 在深入学习Android Intents之前,我们先来了解下什么是Intents以及它在Android开发中的重要性。Intents是Android平台中用于应用程序间通信的核心机制...

    Android-Intents-3

    通过配置Intent Filters和发送Intents,可以灵活地控制哪些Activity可以在Tab之间切换,并且通过自定义图标增强了用户体验。这种做法不仅适用于简单的应用,也可以扩展到更复杂的应用场景中。希望本章节的内容对您的...

    Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面.

    在 Android 开发中,Intent 是一个非常重要的概念,它允许不同的应用程序之间进行交互和通信。在本文中,我们将探讨如何使用 Intent 跳转到系统应用中的拨号界面、联系人界面、短信界面等。 拨号界面 要跳转到拨号...

    Android开发入门与实战+和第二版部分章节+第二版源代码

    本书主要内容为:Android开发环境搭建、Android SDK介绍、Android应用程序结构剖析,并对Android 中最重要的组件Activity、Intents&Intent Filters&Broadcast receivers、Intent、Service、Content Providers进行了...

    Android-Intents-1

    从显式 Intents 到隐式 Intents,再到 Intent Filters 的定义,我们逐步掌握了如何在 Android 应用程序中有效地进行 Activity 之间的跳转和数据传输。同时,也了解了如何通过 URI 启动 Activity 以及如何在 Tabbed ...

    android的intent跳转

    在Android开发中,Intent是应用程序之间以及应用程序内部组件之间通信的主要机制。Intent可以用来启动新的活动(Activity)、启动服务(Service)或者传递消息。在这个场景中,我们将关注Intent如何用于在Android...

    Android利用intent实现分享功能

    ### Android利用Intent实现分享功能详解 #### 概述 随着移动互联网的发展,用户越来越依赖于在不同的应用程序之间共享内容。为了满足这一需求,Android平台提供了多种解决方案,包括使用第三方库如友盟、ShareSDK...

    Android Apps for Absolute Beginners,

    - **第十一章:理解Intents和Intent Filters**:Intents是Android应用之间通信的重要机制,本章会详细讲解其工作原理和使用技巧。 - **第十二章:展望未来**:对未来Android开发的趋势和发展方向进行预测。 #### 四...

    intent:一个简单的Flutter插件,用于处理Android Intent,使用编写

    显示一些 :red_heart: 通过把 :star: intent尝试帮助您使用Android Intents启动另一个android活动。 此Dart API复制了Android Intent API,因此,有关如何有效使用它,何时发送何种数据的详细信息,您可能有兴趣在...

    Android中使用Intent启动手机系统功能的方法介绍.pdf

    总结起来,Intent在Android开发中扮演着连接不同组件的桥梁角色,通过设置不同的动作(action)和数据(data),我们可以方便地启动系统功能,如拨号、查看联系人、插入新联系人等。了解和熟练掌握这些方法,将有助...

Global site tag (gtag.js) - Google Analytics