<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>intent</title>
	<atom:link href="https://www.aitaocui.cn/tag/264114/feed" rel="self" type="application/rss+xml" />
	<link>https://www.aitaocui.cn</link>
	<description>翡翠玉石爱好者聚集地</description>
	<lastBuildDate>Mon, 28 Nov 2022 18:43:09 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://www.aitaocui.cn/wp-content/uploads/2022/11/taocui.png</url>
	<title>intent</title>
	<link>https://www.aitaocui.cn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>intent(解决安卓应用的各项组件之间的通讯)</title>
		<link>https://www.aitaocui.cn/article/376400.html</link>
					<comments>https://www.aitaocui.cn/article/376400.html#respond</comments>
		
		<dc:creator><![CDATA[林教头]]></dc:creator>
		<pubDate>Mon, 28 Nov 2022 18:43:09 +0000</pubDate>
				<category><![CDATA[知识]]></category>
		<category><![CDATA[intent]]></category>
		<guid isPermaLink="false">https://www.aitaocui.cn/?p=376400</guid>

					<description><![CDATA[Intent（意图）主要是解决Android应用的各项组件之间的通讯。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述，Android则根据此Intent的描...]]></description>
										<content:encoded><![CDATA[</p>
<article>
<p>Intent（意图）主要是解决Android应用的各项组件之间的通讯。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述，Android则根据此Intent的描述，负责找到对应的组件，将Intent传递给调用的组件，并完成组件的调用。因此，Intent在这里起着一个媒体中介的作用，专门提供组件互相调用的相关信息，实现调用者与被调用者之间的解耦。</p>
<p>例如，在一个联系人维护的应用中，当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上，点击某个联系人后，希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)为了实现这个目的，listActivity需要构造一个Intent，这个Intent用于告诉系统，我们要做“查看”动作，此动作对应的查看对象是“某联系人”，然后调用startActivity(Intentintent)，将构造的Intent传入，系统会根据此Intent中的描述，到ManiFest中找到满足此Intent要求的Activity，系统会调用找到的Activity，即为detailActivity，最终传入Intent，detailActivity则会根据此Intent中的描述，执行相应的操作。</p>
</article>
<article>
<h1>抽象描述要描述什么</h1>
<p>在Android参考文档中，对Intent的定义是执行某操作的一个抽象描述(确实很抽象)。我们先来看看这里的抽象描述，到底描述了什么。</p>
<p>首先，是要执行的动作(action)的一个简要描述，如VIEW_ACTION(查看)、EDIT_ACTION(修改)等，Android为我们定义了一套标准动作：</p>
<p>MAIN_ACTION</p>
<p>VIEW_ACTION</p>
<p>EDIT_ACTION</p>
<p>PICK_ACTION</p>
<p>GET_CONTENT_ACTION</p>
<p>DIAL_ACTION</p>
<p>CALL_ACTION</p>
<p>SENDTO_ACTION</p>
<p>ANSWER_ACTION</p>
<p>INSERT_ACTION</p>
<p>DELETE_ACTION</p>
<p>RUN_ACTION</p>
<p>LOGIN_ACTION</p>
<p>CLEAR_CREDENTIALS_ACTION</p>
<p>SYNC_ACTION</p>
<p>PICK_ACTIVITY_ACTION</p>
<p>WEB_SEARCH_ACTION</p>
<p>此外，我们还可以根据应用的需要，定义我们自己的动作，并可定义相应的Activity来处理我们的自定义动作。</p>
<p>其次，是执行动作要操作的数据（data），Android中采用指向数据的一个URI来表示，如在联系人应用中，一个指向某联系人的URI可能为：content://contacts/1。</p>
<p>这种URI表示，通过ContentURI这个类来描述，具体可以参考android.net.ContentURI类的文档。</p>
<p>以联系人应用为例，以下是一些action/data对，及其它们要表达的意图：</p>
<p>VIEW_ACTION content://contacts/1&#8211;显示标识符为&quot;1&quot;的联系人的详细信息</p>
<p>EDIT_ACTION content://contacts/1&#8211;编辑标识符为&quot;1&quot;的联系人的详细信息</p>
<p>VIEW_ACTION content://contacts/&#8211;显示所有联系人的列表</p>
<p>PICK_ACTION content://contacts/&#8211;显示所有联系人的列表，并且允许用户在列表中选择一个联系人，然后把这个联系人返回给父activity。例如：电子邮件客户端可以使用这个Intent，要求用户在联系人列表中选择一个联系人</p>
<p>另外，除了action和data这两个重要属性外，还有一些附加属性：</p>
<p>category（类别），被执行动作的附加信息。例如LAUNCHER_CATEGORY表示Intent的接受者应该在Launcher中作为顶级应用出现；而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个，这些动作可以在同一块数据上执行。</p>
<p>type（数据类型），显式指定Intent的数据类型（MIME）。一般Intent的数据类型能够根据数据本身进行判定，但是通过设置这个属性，可以强制采用显式指定的类型而不再进行推导。</p>
<p>component（组件），指定Intent的的目标组件的类名称。通常Android会根据Intent中包含的其它属性的信息，比如action、data/type、category进行查找，最终找到一个与之匹配的目标组件。但是，如果component这个属性有指定的话，将直接使用它指定的组件，而不再执行上述查找过程。指定了这个属性以后，Intent的其它所有属性都是可选的。</p>
<p>extras（附加信息），是其它所有附加信息的集合。使用extras可以为组件提供扩展信息，比如，如果要执行“发送电子邮件”这个动作，可以将电子邮件的标题、正文等保存在extras里，传给电子邮件发送组件。</p>
<p>总之，action、data/type、category和extras一起形成了一种语言。</p>
<p>这种语言使系统能够理解诸如“查看某联系人的详细信息”之类的短语。随着应用不断的加入到系统中，它们可以添加新的action、 data/type、category来扩展这种语言。应用也可以提供自己的Activity来处理已经存在的这样的“短语”，从而改变这些“短语”的行为。</p>
<h1>解析方式</h1>
<p>在应用中，我们可以以两种形式来使用Intent：</p>
<p>直接Intent：指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context,Class)来指定)。通过指定具体的组件类，通知应用启动对应的组件。</p>
<p>间接Intent：没有指定comonent属性的Intent。这些Intent需要包含足够的信息，这样系统才能根据这些信息，在在所有的可用组件中，确定满足此Intent的组件。</p>
<p>对于直接Intent，Android不需要去做解析，因为目标组件已经很明确，Android需要解析的是那些间接Intent，通过解析，将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。</p>
<p>Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent，最终找到匹配的Intent。在这个解析过程中，Android是通过Intent的action、type、category这三个属性来进行判断的，判断方法如下：</p>
<p>如果Intent指明定了action，则目标组件的IntentFilter的action列表中就必须包含有这个action，否则不能匹配;如果Intent没有提供type，系统将从data中得到数据类型。和action一样，目标组件的数据类型列表中必须包含Intent的数据类型，否则不能匹配。</p>
<p>如果Intent中的数据不是content:类型的URI，而且Intent也没有明确指定它的type，将根据Intent中数据的scheme(比如http:或者mailto:) 进行匹配。同上，Intent的scheme必须出现在目标组件的scheme列表中。</p>
<p>如果Intent指定了一个或多个category，这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别：LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY，解析得到的目标组件必须至少包含这两个类别。</p>
<h1>显式调用和隐式调用</h1>
<p>显式Intent直接用组件的名称定义目标组件，这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称，因此，显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内，一个Activity启动一个Service。</p>
<p>隐式Intent恰恰相反，它不会用组件名称定义需要激活的目标组件，它更广泛地用于在不同应用程序之间传递消息。</p>
<p>在显式Intent消息中，决定目标组件的唯一要素就是组件名称，因此，如果你的Intent中已经明确定义了目标组件的名称，那么你就完全不用再定义其他Intent内容。</p>
<p>而对于隐式Intent则不同，由于没有明确的目标组件名称，所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。</p>
<p>（Intent定义：Intent是一种在不同组件之间传递的请求消息，是应用程序发出的请求和意图。作为一个完整的消息传递机制，Intent不仅需要发送端，还需要接收端。</p>
<p>显式Intent定义：对于明确指出了目标组件名称的Intent，我们称之为显式Intent。</p>
<p>隐式Intent定义：对于没有明确指出目标组件名称的Intent，则称之为隐式Intent。</p>
<p>说明：Android系统使用IntentFilter来寻找与隐式Intent相关的对象。</p>
<p>显式Intent直接用组件的名称定义目标组件，这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称，因此，显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内，一个Activity启动一个Service。</p>
<p>隐式Intent恰恰相反，它不会用组件名称定义需要激活的目标组件，它更广泛地用于在不同应用程序之间传递消息。</p>
<p>在显式Intent消息中，决定目标组件的唯一要素就是组件名称，因此，如果你的Intent中已经明确定义了目标组件的名称，那么你就完全不用再定义其他Intent内容。</p>
<p>而对于隐式Intent则不同，由于没有明确的目标组件名称，所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。</p>
<p>Android系统寻找与Intent请求意图最匹配的组件具体的选择方法是：Android将Intent的请求内容和一个叫做IntentFilter的过滤器比较，IntentFilter中包含系统中所有可能的待选组件。</p>
<p>如果IntentFilter中某一组件匹配隐式Intent请求的内容，那么Android就选择该组件作为该隐式Intent的目标组件。</p>
<p>Android如何知道应用程序能够处理某种类型的Intent请求呢？这需要应用程序在Android-Manifest.xml中声明自己所含组件的过滤器（即可以匹配哪些Intent请求）。</p>
<p>一个没有声明Intent-Filter的组件只能响应指明自己名字的显式Intent请求，而无法响应隐式Intent请求。</p>
<p>而一个声明了IntentFilter的组件既可以响应显式Intent请求，也可以响应隐式Intent请求。在通过和IntentFilter比较来解析隐式Intent请求时，Android将以下三个因素作为选择的参考标准：</p>
<p>Action</p>
<p>Data</p>
<p>Category</p>
<p>而Extra和Flag在解析收到Intent时是并不起作用的。</p>
</article>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.aitaocui.cn/article/376400.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
