intent的作用是什么隐式intent是怎样找到合适的目标组件的

intent的作用是什么隐式intent是怎样找到合适的目标组件的,第1张

android当中显式intent和隐式intent的区别

定义:

Intent定义:Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图。作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端。

显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent。

隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。

说明:Android系统使用IntentFilter

来寻找与隐式Intent相关的对象。

详细解释:

显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。

隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。

在显式Intent消息中,决定目标组件的唯一要素就是组件名称,因此,如果你的Intent中已经明确定义了目标组件的名称,那么你就完全不用再定义其他Intent内容。

而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。

Android系统寻找与Intent请求意图最匹配的组件具体的选择方法

是:Android将Intent的请求内容和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。

如果IntentFilter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。

Android如何知道应用程序能够处理某种类型的Intent请求呢?这需要应用程序在Android-Manifestxml中声明自己所含组件的过滤器(即可以匹配哪些Intent请求)。

一个没有声明Intent-Filter的组件只能响应指明自己名字的显式Intent请求,而无法响应隐式Intent请求。

而一个声明了IntentFilter的组件既可以响应显式Intent请求,也可以响应隐式Intent请求。在通过和

IntentFilter比较来解析隐式Intent请求时,Android将以下三个因素作为选择的参考标准。

Action

Data

Category

而Extra和Flag在解析收到Intent时是并不起作用的。

Android中intentputExtra(); 是用于Intent传递数据的。

Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Activity来浏览网页。 

Android的三个基本组件——Activity,Service和Broadcast Receiver——都是通过Intent机制激活的,不同类型的组件有不同的传递Intent方式:

要激活一个新的Activity,或者让一个现有的Activity做新的 *** 作,可以通过调用ContextstartActivity()或者ActivitystartActivityForResult()方法。 

要启动一个新的Service,或者向一个已有的Service传递新的指令,调用ContextstartService()方法或者调用ContextbindService()方法将调用此方法的上下文对象与Service绑定。

ContextsendBroadcast()、ContextsendOrderBroadcast()、ContextsendStickBroadcast()这三个方法可以发送Broadcast Intent。发送之后,所有已注册的并且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。

Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity,Service或者BroadcastReceiver作响应。所以,不同类型的Intent消息不会出现重叠,即Broadcast的Intent消息只会发送给BroadcastReceiver,而决不会发送给Activity或者Service。由startActivity()传递的消息也只会发给Activity,由startService()传递的Intent只会发送给Service。

1 AndroidManifestxml 权限

<!-- 微信权限-->

<uses-permission android:name="androidpermissionINTERNET"/>

<uses-permission android:name="androidpermissionACCESS_NETWORK_STATE"/>

<uses-permission android:name="androidpermissionACCESS_WIFI_STATE"/>

<uses-permission android:name="androidpermissionREAD_PHONE_STATE"/>

<uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE"/>

2在图一按钮上面,加上微信跳转方法、也就是启动微信登录的方法

private void loginToWeiXin(){

IWXAPI mApi = WXAPIFactorycreateWXAPI(this, WXEntryActivityWEIXIN_APP_ID, true);

mApiregisterApp(WXEntryActivityWEIXIN_APP_ID);

if (mApi != null && mApiisWXAppInstalled()) {

SendAuthReq req = new SendAuthReq();

reqscope = "snsapi_userinfo";

reqstate = "wechat_sdk_demo_test_neng";

mApisendReq(req);

} else

ToastmakeText(this, "用户未安装微信", ToastLENGTH_SHORT)show();

}

3在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity

package(项目报名)wxapiWXEntryActivityJava

回调方法onResp() 方法没有触发回调、请监测WXEntryActivity onCreate中是否调用此方法 mApihandleIntent(thisgetIntent(), this);

package comxxxxxxxandroidwxapi;

/

微信登录页面

@author kevin_chen 2016-12-10 下午19:03:45

@version v10

/

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

private static final String APP_SECRET = "填写自己的AppSecret";

private IWXAPI mWeixinAPI;

public static final String WEIXIN_APP_ID = "填写自己的APP_id";

private static String uuid;

@Override

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

mWeixinAPI = WXAPIFactorycreateWXAPI(this, WEIXIN_APP_ID, true);

mWeixinAPIhandleIntent(thisgetIntent(), this);

}

@Override

protected void onNewIntent(Intent intent) {

superonNewIntent(intent);

setIntent(intent);

mWeixinAPIhandleIntent(intent, this);//必须调用此句话

}

//微信发送的请求将回调到onReq方法

@Override

public void onReq(BaseReq req) {

LogUtilslog("onReq");

}

//发送到微信请求的响应结果

@Override

public void onResp(BaseResp resp) {

LogUtilslog("onResp");

switch (resperrCode) {

case BaseRespErrCodeERR_OK:

LogUtilslog("ERR_OK");

//发送成功

SendAuthResp sendResp = (SendAuthResp) resp;

if (sendResp != null) {

String code = sendRespcode;

getAccess_token(code);

}

break;

case BaseRespErrCodeERR_USER_CANCEL:

LogUtilslog("ERR_USER_CANCEL");

//发送取消

break;

case BaseRespErrCodeERR_AUTH_DENIED:

LogUtilslog("ERR_AUTH_DENIED");

//发送被拒绝

break;

default:

//发送返回

break;

}

}

/

获取openid accessToken值用于后期 *** 作

@param code 请求码

/

private void getAccess_token(final String code) {

String path = ">

SiriKit是您通过Siri提供内容的一种方式。 它还允许您向 Maps 应用添加对服务的支持。 要支持 SiriKit ,您可以使用 Intents 框架和 Intents UI 框架来实现一个或多个扩展,然后将这些扩展包含在iOS应用程序中。 当用户通过Siri或Maps请求特定类型的服务时,系统会使用您的扩展来提供这些服务。

仅当您的应用程序实现以下类型的服务之一时才添加SiriKit支持:

汽车制造商可以使用 CarPlay intents 允许用户使用语音命令控制汽车功能。

每种类型的服务代表您可以支持的功能域,每个域定义一个或多个意图供您支持。 意图是表示用户意图的对象。 Siri和Maps创建意图对象以响应用户请求,并使用任何用户指定的信息填充它们。 例如,发送消息的意图可能包括消息的接收者和内容。 您使用intent对象提供适当的响应并执行相关的任务。 有关支持的域及其意图的更多信息,请参阅 Intents Domains 。

Siri 和 Maps 通过两种不同类型的扩展与您的应用服务进行互动:

您必须提供 Intents 扩展才能支持 SiriKit 。您的Intents扩展程序负责处理意图并提供Siri和Maps可用于与用户通信的信息。提供 Intents UI 扩展是可选的,但是通过Siri与您的应用进行交互的方式对您的用户来说似乎很熟悉。例如,Intents UI扩展可以显示横幅和其他特定于应用的信息,以强化您的应用正在提供响应。

有关用于实现Intents扩展的类的信息,请参阅 Intents Framework Reference 。有关用于实现 Intents UI 扩展的协议的信息,请参阅 Intents UI Framework Reference 。

Siri处理将用户的语音请求转换为扩展可以处理的可 *** 作意图所需的语言处理和语义分析。 Siri和Maps应用程序管理所有用户交互,并使用标准系统界面向用户显示结果。 您的角色主要是提供要显示的数据。 如果您的应用程序包含Intents UI扩展,您还可以提供自定义界面来补充默认系统界面。

乘车预订和餐厅预订主要由 Maps 应用程序处理,尽管用户也可以使用Siri预订游乐设施。 您的Intents扩展程序处理源自Maps应用程序的交互,其处理方式与处理来自Siri的请求的方式相同。 如果您自定义用户界面,您的 Intents UI 扩展可以根据请求来自Siri还是Maps来进行不同的配置。

Siri 和 Maps 通过您的 Intents 扩展程序与您的应用互动。 Intents扩展的入口点是 INExtension 对象,其唯一的工作是将Siri指向能够响应用户请求的对象。实现 Intents 扩展时,您经常使用三种类型的对象:

当您的扩展程序有意图处理时,Siri会询问您的 INExtension 对象是否有能够处理该意图的对象。处理程序对象可以是您想要的任何类型,但它必须实现处理给定意图所需的特定方法。每个 intent 都有一个与其处理程序必须采用的关联协议。该协议的方法分为三组:解决方法,确认方法和处理方法。您可以实现所需的方法,并向Siri提供有关您计划如何处理意图的信息。

图2-1说明了Siri与扩展中的处理程序对象之间的高级别流程。在该示例中,当用户要求使用乘车预订服务预订乘车时,Siri创建具有乘坐参数的意图对象并将其发送给处理者。处理程序将intent对象中的数据解析为可用于完成行程的值。当所有骑行参数都已解决后,Siri要求处理者确认其计划如何处理乘坐请求并执行任何最终验证。在确认阶段,处理程序提供一个响应对象,其中包含骑行的详细信息,Siri可能会向用户显示。如果用户接受了乘坐,Siri要求乘车请求处理者处理该意图。处理程序通过预订车辆并回复预订车辆的详细信息来回应。

有关如何创建扩展的一般信息,请参阅 App Extension Programming Guide 。

要支持 SiriKit ,请在您的iOS应用中添加 Intents extension 。

Xcode提供的 Intents 扩展模板包含一个 INExtension 子类供您自定义。 您可以使用该类来创建处理意图所需的处理程序对象。 Siri使用您的扩展的 Infoplist 文件来发现它支持的意图。 Xcode提供的 Infoplist 文件主要是配置的,但您必须修改它的一部分以指定扩展程序处理的意图。

这个key是必需的。您可以支持给定域中的所有或部分意图,并且您的扩展可以支持任意数量的域。该值必须包含扩展支持的所有 intent 类。

此键是可选的。该值包含您需要解锁设备的 intent 类的子集。如果处理意图涉及访问磁盘上的受保护文件或 *** 纵敏感用户数据,则可能在此列表中包含 intent 。

实现扩展的行为涉及以下任务:

有关可用意图的列表以及为每个意图实现的关联类和协议,请参阅 Intents Domains 。

在使用Intents扩展程序之前,在注册任何特定于用户的词汇表之前,您的iOS应用程序必须请求授权才能使用Siri。 要请求授权,请执行以下 *** 作:

您的iOS应用首次调用 requestSiriAuthorization: 方法时,系统会显示一条alertd窗,提示用户授权您的应用。d窗包括您在应用的 Infoplist 文件的 NSSiriUsageDescription 键中提供的使用说明字符串。用户可以批准或拒绝您的应用程序的授权请求,并可以稍后在“设置”应用中更改您应用的授权状态。系统会记住您的应用程序的授权状态,以便后续调用 requestSiriAuthorization: 方法不会再次提示用户。

您的 Intents 扩展程序是代表您的应用程序执行的代理程序,应该能够执行与您的应用程序相同的服务。由于您的iOS应用和 Intents 扩展执行许多相同的任务,请考虑以下事项:

要测试 Intents 扩展,必须在设备上运行它。 Xcode支持直接从Xcode项目启动Intents扩展,并在设备上运行时对其进行调试。

当您向项目添加Intents扩展时,Xcode会自动创建一个运行该扩展的 scheme 。

您无法在模拟器中调试 Intents 扩展。

Xcode构建您的应用和扩展,将它们安装在设备上,然后启动Siri。

首次安装您的扩展程序时,Siri可能无法立即识别您的应用扩展程序。您可能需要等待几分钟才能发出任何相关命令。同样,在更新Infoplist文件时,您可能需要等待几分钟,然后Siri才能识别出更改。

您的iOS应用程序使用 Intents 框架执行特定任务:

用户可以为Siri配置与设备其余部分不同的语言。 在iOS应用程序中,系统使用特定于设备的语言设置检索本地化内容。 在 Intents 扩展中,系统使用Siri语言检索本地化内容。 如果您的应用与扩展程序共享本地化内容,则必须使用 Siri 语言共享该内容,您的应用可以使用 INPreferences 类的 siriLanguageCode 方法检索该语言。

有关获取Siri语言的更多信息,请参阅 INPreferences Class Reference 。

在 Intents 扩展中,处理程序对象执行解析,确认和处理Siri发送的intent对象的关键工作。每个intent对象都有一个专门为处理该intent而设计的相关协议。例如, INRequestRideIntent 对象的处理程序采用 INRequestRideIntentHandling 协议。

每种协议的方法分为三组:

实现处理程序时,必须始终实现处理intent的方法。所有其他方法都是可选的,但建议使用。解决和确认方法是您在尝试处理意图之前验证意图内容的机会。您还可以使用这些方法来标识或创建处理意图所需的内部数据对象。

有关意图列表和相应的意图处理协议,请参阅 Intents Domains 。

在意图的解决阶段,Siri要求您的处理程序解析关键参数并确认您打算使用的值。因为说出了来自用户的数据,所以可能存在丢失或模糊的信息。解决阶段是您验证所提供数据的机会,并让Siri知道您是否需要澄清或更多信息。建议您为给定的处理程序协议实现所有解析方法。虽然您可能不会使用所有参数,但每种方法都会告诉Siri您是否在自己的数据结构中找到了适当的值。

您使用解析结果对象将解析结果传回 SiriKit ,解析结果对象是 INIntentResolutionResult 类的实例。您可能需要解析每种参数类型的不同子类。例如,在以 INPerson 对象的形式解析联系人时,将返回 INPersonResolutionResult 类的实例。实例化子类时,请使用与解析工作结果相对应的创建方法。表3-1列出了可能的结果,并说明了何时使用每种结果。

Table 3-1 Possible outcomes when resolving intent parameters

解析参数时,尝试尽快达成成功的解决方案。 询问更多信息会导致额外的用户交互以及对处理程序的额外调用,从而导致延迟并可能使用户感到沮丧。 相反,尝试根据用户的模式和习惯选择合理的值,并仅在需要时要求消除歧义或确认。

Listing 3-1 显示了乘坐预订应用程序的示例,该应用程序验证了乘车的下车位置。 如果存在一个下车位置,则该方法返回一个成功的结果;否则,该方法返回表示需要该值的结果。

以上就是关于intent的作用是什么隐式intent是怎样找到合适的目标组件的全部的内容,包括:intent的作用是什么隐式intent是怎样找到合适的目标组件的、Android中intent类PUTEXTRA调用、我的微信被Android登录了,是不是被盗了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9337191.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存