`
wangshiming88
  • 浏览: 77300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android中的隐式意图的使用和注意

阅读更多

Intent(意图)

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。还可以携带数据(intent.putExtra(name, value)对数据的携带)
Intent可以划分成显式意图和隐式意图。
显式意图:调用Intent.setComponent()\ Intent.setClassName()或Intent.setClass()方法
或者在new Intent(A.this,B.class)指明需要转向到的Activity 这种明确指定了组件名的Intent为显式意图,显式意图明确指定了要激活的组件是哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

对于隐式意图,Android是怎样寻找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及数据类型)和类别。
动作测试(Action test)
  一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:
• 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。
• 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试
类别测试(Category test)
对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。
原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。但有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (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: 数据如果它的过滤器仅列举了一个数据类型。

例如AndroidManifest.xml中有:

<intent-filter>
<action android:name="com.nanlove.wangshiming"/>
<action android:name="wangshiming"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="wangshiming.intent.category"/>
<data android:scheme="love" android:host="hao123.com"
android:port="888" android:path="/MM" android:mimeType="text/plain"/>           
</intent-filter>

对于<intent-filter>中的action项可以有多个只要匹配其中一个就可以了

 

intent.setAction("com.nanlove.wangshiming");中的action也可以为wangshiming

intent.addCategory("wangshiming.intent.category")代码中的addCategory并不用写因为android他有默认的category 只要配置清单中存在<category android:name="android.intent.category.DEFAULT" />就可以了,

没有数据参数的情况下只要意图对象中的设置动作和类别都出现在intent-filter就能跟filter匹配

但是有数据<data android:scheme="love" android:host="hao123.com"
android:port="888" android:path="/MM" />数据项一定要完全匹配,

当数据和数据类型 android:mimeType="text/plain"同时存在的时候不能使用intent.setData(Uri.parse("love://hao123.com:888/MM")) 因为setData的方法会自动清除前面的数据类型:This method automatically clears any type that was previously set by setType .

所以后面的setType就无法匹配

应该使用intent.setDataAndType(Uri.parse("love://hao123.com:888/MM"), "text/plain");

对同一个应用能使用显示意图就尽量使用显示意图增加程序的效率 理论上隐式意图匹配规则是需要花时间寻找的

 


 

分享到:
评论

相关推荐

    隐式意图跳转Activity

    下面将详细介绍隐式意图的概念、结构、使用方法以及注意事项。 **隐式意图的基本概念** 隐式意图(Implicit Intent)不直接指定目标组件的类名,而是通过定义一个行动(Action)、数据(Data)、类别(Category)和...

    利用隐式意图实现两个apk之间的数据传递

    因此,在实际开发中,除非必要,否则应避免使用隐式意图传递敏感数据。此外,广播接收者会消耗系统资源,因此在不需要接收数据时,记得取消注册BroadcastReceiver。 以上就是利用隐式意图实现两个apk之间数据传递的...

    隐式意图启动系统各种功能

    总结来说,隐式意图是Android平台中实现跨组件通信的关键手段,它使得开发者能够利用系统和第三方应用的功能,为用户提供丰富的交互体验。通过熟练掌握隐式意图的使用,我们可以构建更加灵活、功能丰富的应用程序。

    android隐式意图激活浏览器的实现方法

    Android 隐式意图激活浏览器的实现方法提供了一种灵活和灵活的方式来实现 Android 应用程序之间的交互和协作,可以广泛应用于各种场景中。 掌握 Android 隐式意图激活浏览器的实现方法可以帮助开发者更好地理解 ...

    Android学习之Intent中显示意图和隐式意图的用法实例分析

    **使用隐式意图的注意事项**: - 当使用隐式意图时,必须确保Intent的参数足够精确,以便系统能找到正确的接收者。如果多个组件都匹配Intent,系统可能会抛出异常或让用户选择一个组件。 - 在AndroidManifest.xml...

    android使用意图传递数据ppt和源码

    - 在目标组件中使用`getIntent()`获取意图,然后通过`getStringExtra()`, `getIntExtra()`等方法获取数据。 - `Bundle extras = getIntent().getExtras();`可以一次性获取所有附加数据。 6. **数据安全** - 谨慎...

    Android使用意图录音

    以上就是Android使用意图进行录音的基本步骤和相关知识点。通过理解这些内容,你可以快速地在你的应用中实现录音功能,为用户提供方便快捷的服务。在开发过程中,一定要注意权限管理,确保用户体验的顺畅。

    隐式Intent的应用

    综上所述,隐式Intent是Android系统中实现跨应用交互的关键工具,它允许开发者构建更加灵活和交互丰富的应用。了解并熟练运用隐式Intent,不仅可以提高用户体验,也是提升Android开发技能的重要一环。在实际开发过程...

    隐式意图-第15部分:初始实验

    6. **安全性和权限**:使用隐式意图时,需要注意数据隐私和安全问题。因为任何应用都可以响应隐式意图,所以必须谨慎处理敏感数据。同时,某些操作可能需要获取用户权限,如读写存储或访问网络。 7. **系统服务**:...

    Android中Intent和ProgressBar的结合使用

    总的来说,Intent和ProgressBar的结合使用是Android开发中常见的场景,尤其在处理耗时操作时,可以提供良好的用户反馈,提升用户体验。通过理解Intent的原理以及ProgressBar的用法,开发者可以更好地控制应用程序的...

    android中使用显式intent完成应用的步骤及核心代码2022优秀文档.pptx

    Android中使用显式Intent完成应用的步骤及核心代码是指在Android应用程序中使用显式Intent来实现应用程序之间的交互和跳转。显式Intent是一种明确指出了目标组件名称的Intent,通过指定Intent组件名称来实现的Intent...

    Android 隐式Intent的实例详解

    隐式Intent 是一种强大的工具,可以帮助我们更好地管理 Android 应用程序的意图,但是需要正确地使用和配置,以避免出现错误。 Android 隐式Intent 的实例详解还可以帮助我们更好地理解隐式Intent 的机制和应用...

    超爽Android中文教程

    4. **意图(Intent)**:学习如何使用Intent进行组件间通信,包括显式Intent和隐式Intent的区别与使用。 5. **数据存储**:掌握SQLite数据库的使用,Shared Preferences以及文件存储的方法。 6. **服务(Service)**:...

    安卓短信彩信相关相关-android零权限发送短信支持android4.0以上版本。.rar

    - 使用系统的隐式意图:在某些Android版本中,可以通过发送一个隐式意图来触发系统短信应用发送短信,而不直接使用SMS Manager API。 - 利用系统漏洞:有时,系统可能存在漏洞,使得在特定条件下可以无权限发送...

    android 图片裁剪

    隐式意图来启动系统裁剪工具。首先,需要创建一个裁剪意图,并设置输入和输出URI: ```java Intent cropIntent = new Intent("com.android.camera.action.CROP"); cropIntent.setDataAndType(selectedImageUri, ...

    android四大组件详解

    此外,Service的生命周期管理和线程模型也需注意,通常建议Service中的耗时操作应在单独的工作线程中执行,以免阻塞主线程。 **BroadcastReceiver**是一种监听系统广播事件的组件,可以在任何时刻响应特定的广播...

    Android简单的广播消息

    要在Android应用中使用广播,首先需要创建一个BroadcastReceiver类的子类,并重写onReceive()方法,该方法会在接收到广播时被调用。例如: ```java public class MyBroadcastReceiver extends BroadcastReceiver { ...

    android intent 页面跳转

    本文将深入探讨“Android Intent”在页面跳转和数据传递中的应用,结合“Chapter06_Intent_01”示例进行详细解析。 一、Intent的基本概念 Intent是一个消息对象,它表达了应用的意图,告诉系统想要执行的操作。...

    Android中pendingIntent的深入理解

    3. 注意Intent的保护,避免暴露敏感信息,如使用隐式Intent时,应限制接收者。 总之,PendingIntent是Android系统中实现跨进程通信的重要工具,它提供了安全、灵活的方式来调度应用的未来操作。理解并合理使用...

Global site tag (gtag.js) - Google Analytics