Android中的IntentFilter与安全

  次阅读 作者:智能小宝 来源:互联网 2016-01-14 09:27 我要评论(0)

Intent是Android应用程序核心组件之间通信和传递信息的核心机制。与之相关的IntentFilter也具有相关的安全机制(测试)来进行约 束。本文将对其进行详细介绍。

一、Intent和IntentFilter简介

一个应用程序的三个核心组件(活动,服务和广播接收器)都是通过消息即意图(Intents)来激活的。Intent消息传送是相同或不同应用中组 件运行时晚绑定的一种机制。意图本身(一个意图对象)是一个包含被执行操作抽象描述的被动的数据结构。或,对于广播而言,是某件已经发生并被声明的事情的 描述。存在如下几种不同的机制来传送意图到每种组件中:

一个意图对象是传递给Context.startActivity()或 者Activity.startActivityForResult()来 启动一个活动或者让一个存在的活动去做某些新的事情。

一个意图对象是传递给Context.startService()来 发起一个服务或者递交新的指令给运行中的服务。类似的,一个意图能被传递给Context.bindService() 来在调用组件和一个目标服务之间建立连接。作为一个可选项,它可以发起这个服务如果还没运行的话。

传递给任意广播方法(例如Context.sendBroadcast(),Context.sendOrderedBroadcast(), 或者Context.sendStickyBroadcast()) 的意图对象被传递给所有感兴趣的广播接收者。许多种广播产生于系统代码

在每个例子里,Android系统找到合适的活动、服务或者一组广播接收者来回应这个意图,必要时实例化它们。这些消息传送系统没有重叠:广播意图 仅被传递给广播接收者,永远不会给活动或者服务。一个传送给startActivity()的意图是只会被传递给一个活动,永远不会给一个服务或广播接收 者,如此类推。

为了通知系统它们可以处理哪些意图,活动、服务和广播接收器可以有一个或多个意图过滤器。每个过滤器描述组件的一个能力,一系列组件想要接收的意 图。它实际上按照一个期望的类型来进行意图滤入,同时滤出不想要的意图-但是只有不想要的隐式意图会被滤出(那些没有命名目标的对象类)。一个显式意图总 能够被递交给它的目标,而无论它包含什么。这种情况下过滤器不起作用。但是一个显式意图仅当它能通过组件的一个过滤器时才可以被递交到这个组件。

组件为它能做的每项工作,每个呈现给用户的不同方面分有不同的过滤器。比如,范例记事本应用程序中的主要活动有三个过滤器:一个是空白板,另一个是 用户可以查看、编辑、或选择的一个指定的记事目录,第三是在没有初始目录说明的情况下查找一个特定的记录。一个意图过滤器是IntentFilter类 的一个实例。但是,由于Android系统在启动一个组件前必须知道这个组件的能力,意图过滤器通常不会用Java代码来设置,而是在应用程序清单文件 (AndroidManifest.xml)中设置<intent-filter>元素。(有一个例外,通过调用Context.registerReceiver()来 注册的广播接收器的过滤器;它们是作为意图过滤器对象而被直接创建的。

二 、过滤器与安全Filters and security

我们不能信赖一个意图过滤器的安全性。当它打开一个组件来接收某些特定类型的隐式意图,它并不能阻止以这个组件为目标的显式意图。即使过滤器对组件 要处理的意图限制某些动作和数据源,总有人能把一个显式意图和一个不同的动作及数据源组合在一起,然后命名该组件为目标。

一个过滤器和意图对象有同样的动作、数据以及类别字段。一个隐式意图在过滤器的所有三个方面都被测试。为了递交到拥有这个过滤器的组件,它必须通过 所有这三项测试。即便只有一个不通过,Android系统都不会把它递交给这个组件。不过,由于一个组件可以包含多个意图过滤器,一个不能通过其中一个组 件过滤器的意图可能在另外的过滤器上获得通过。

与之相关的三个测试详细描述如下:

测试一:动作测试(Actiontest)

清单文件中的意图过滤器元素里列举了动作元素,比如:

<intent-filter. . . >

<action android:name="com.example.project.SHOW_CURRENT" />

<action android:name="com.example.project.SHOW_RECENT" />

<action android:name="com.example.project.SHOW_PENDING" />

. . .

</intent-filter>

如同例子所示,一个意图对象只对单个动作命名,而一个过滤器可能列举多个。列表不能为空;一个过滤器必须包含至少一个动作元素,否则它将阻塞所有的 意图。

为了通过这个测试,在意图对象中指定的动作必须匹配过滤器中所列举的动作之一。如果意图对象或过滤器不指定一个动作,结果将是:如果这个过滤器没有 列出任何动作,那意图就没有什么可匹配的,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。另一方面,一个未指定动作的意图对象自动通过这个测 试-只要过滤器包含至少一个动作。

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...