1. Intent
Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,
Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Intent 来执行动作和产生事件。
使用 Intent 可以激活 Android 应用的三个核心组件:活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver)。
2. 显式意图、隐式意图
Intent可以划分成显式意图和隐式意图。
显式意图:调用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
如: 在 MainActicity 中打开一个新的 Acticity -- OtherActivity
1. Intent intent = new Intent();
2. intent.setComponent(new ComponentName(MainActivity.this, OtherActivity.class));
3. 第二行代码可以更换为:intent.setClass(MainActivity.this, OtherActivity.class);
4. 也可以使用构造器来指定组件: Intent intent = new Intent(MainActivity.this, OtherActivity.class)
三种 “显式意图” 指定方式等价
隐式意图:没有明确指定组件名的Intent为隐式意图。
Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(data: URI和数据类型)找到最合适的组件来处理这个意图
例如拨打电话的意图:
Uri uri = Uri.parse("tel:" + phoneCode);
Intent intent = new Intent(Intent.ACTION_CALL, uri);
对于隐式意图,Android是怎样寻找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。
动作测试(Action test)
一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:
+ 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。
<intent-filter><!-- 空的 --></intent-filter>
+ 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试
类别测试(Category test)
对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。
原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。
但有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。
因此自定义 Activity 的时候,不要以为光定义一个 action 就够了。这样用 startActivity() 来激活这个 Activity 的时候将一直报错。
原因就是,他内部要求去匹配 android.intent.category.DEFAULT 这个类别。
因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。
(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)
数据测试(Data test)
当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。
例如,如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;
如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;
如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。
当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。
数据测试同时比较意图对象和过滤器中指定的URI和数据类型。规则如下:
a. 一个既不包含URI也不包含数据类型的意图对象仅在过滤器也同样没有指定任何URIs和数据类型的情况下才能通过测试。
b. 一个包含URI但没有数据类型的意图对象仅在它的URI和一个同样没有指定数据类型的过滤器里的URI匹配时才能通过测试。
这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。
c. 一个包含数据类型但不包含URI的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个URI的情况下才能通过测试。
d. 一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。
如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。
换句话说,一个组件被假定为支持content:和file: 数据如果它的过滤器仅列举了一个数据类型。
分享到:
相关推荐
本篇将深入探讨Android中的两种主要意图类型:显示意图(Explicit Intent)和隐式意图(Implicit Intent),以及它们在实际应用中的角色和用法。 首先,我们来理解一下**显示意图**。显示意图是明确指定目标组件的...
### Android显示意图和隐式意图的区别 在Android开发过程中,`Intent`是应用内部各组件之间进行通信的重要机制之一。通过`Intent`可以启动Activity、Service等组件,并且可以在组件间传递数据。根据使用场景的不同...
**隐式意图**:隐式意图则不指定具体的组件,而是通过设置动作(Action)、类别(Category)、数据(URI和数据类型)等信息,让Android系统根据这些信息自动找到最合适的组件来处理Intent。比如,拨打电话的Intent,...
Intent分为两种类型:显式意图和隐式意图。 **显式意图**: 显式意图主要用于在同一应用程序内部启动Activity。通过调用`Intent.setComponent()`或`Intent.setClass()`方法,我们可以明确指定目标组件的名称,使得...
总的来说,IntentFilter是Android系统中组件间交互的桥梁,通过隐式意图过滤规则,可以让不同的组件协同工作,实现了系统的高度可扩展性和灵活性。理解和掌握IntentFilter的使用,对于编写健壮、交互丰富的Android...
隐式意图(Implicit Intent)不直接指定目标组件的类名,而是通过定义一个行动(Action)、数据(Data)、类别(Category)和额外的数据(Extras)来表达开发者想要执行的操作。系统会根据这些信息遍历...
如果Intent是隐式的,系统会根据Intent的数据和动作来查找合适的Activity。 6. **启动Service** 通过`startService(Intent)`或`bindService(Intent, ServiceConnection, int)`来启动Service。前者仅启动服务并执行...
总结来说,隐式意图是Android平台中实现跨组件通信的关键手段,它使得开发者能够利用系统和第三方应用的功能,为用户提供丰富的交互体验。通过熟练掌握隐式意图的使用,我们可以构建更加灵活、功能丰富的应用程序。
Intent分为显式意图和隐式意图,显式意图明确指定了要启动的组件,而隐式意图则没有。 2. **Action**: Action是Intent的一个关键属性,表示要执行的动作,如ACTION_VIEW、ACTION_SEND等。系统和第三方应用可以注册...
当我们需要在两个不同的apk之间进行数据交换时,隐式意图(Implicit Intent)提供了一种灵活的方式。下面我们将深入探讨如何利用隐式意图实现两个apk之间的数据传递。 隐式意图与显式意图的主要区别在于,显式意图...
总结来说,Intent是Android应用程序间通信的关键工具,通过显式、隐式、系统和`startActivityForResult`的方式,实现了组件间的灵活交互和系统服务的调用。理解并熟练运用Intent,对于开发高效且功能丰富的Android...
在 Android 中,隐式意图可以通过设置 Intent 的 action 和 URI 来实现。其中,action 表示要执行的操作,而 URI 则表示要操作的数据。在本例中,我们使用 Intent.ACTION_VIEW 作为 action,以便打开浏览器,并使用 ...
在Android开发中,Intent是一种非常重要的组件,它用于在应用程序的不同组件之间建立通信桥梁,尤其在窗口(Activity)之间的切换和数据传递上扮演着核心角色。Intent不仅可以启动新的Activity,还可以启动Service、...
在Android系统中,Intent分为显式Intent和隐式Intent两种类型。 1. 显式Intent:明确指定要启动的组件(Activity、Service等)的类名。这种Intent通常用于在同一应用内部进行组件间的通信,确保消息只发送到预设的...
综上所述,隐式Intent是Android系统中实现跨应用交互的关键工具,它允许开发者构建更加灵活和交互丰富的应用。了解并熟练运用隐式Intent,不仅可以提高用户体验,也是提升Android开发技能的重要一环。在实际开发过程...
本文将深入探讨“Android Intent”在页面跳转和数据传递中的应用,结合“Chapter06_Intent_01”示例进行详细解析。 一、Intent的基本概念 Intent是一个消息对象,它表达了应用的意图,告诉系统想要执行的操作。...
显式Intent通过指定组件的全名(包括包名和类名)来直接启动目标组件,而隐式Intent则是通过设置Action、Data、Category等元数据来匹配能够处理该Intent的组件。 1. 显式Intent的使用: 在创建显式Intent时,我们...
首先,Intent分为显式Intent和隐式Intent两种类型。显式Intent明确指定要启动的目标组件,通过组件的全限定类名(包名+类名)来指定。而隐式Intent则是不指定具体组件,而是通过Action、Data、Category等元数据来...