在HarmonyOS中,Intent是对象之间传递信息的载体。例如,当一个Ability需要启动另一个Ability时,或者一个AbilitySlice需要导航到另一个AbilitySlice时,可以通过Intent指定启动的目标同时携带相关数据。
Intent的构成元素包括Operation与Parameters。
Operation由表5-1所示的属性组成。
表5-1 Operation属性
除了上述属性之外,开发者也可以通过Parameters传递某些请求所需的额外信息。Parameters是一种支持自定义的数据结构。
当Intent用于发起请求时,根据指定元素的不同,分为两种类型:
· 如果同时指定了BundleName与AbilityName,则根据Ability的全称(例如com.waylau.hmos.PayAbility)来直接启动应用。
· 如果未同时指定BundleName和AbilityName,则根据Operation中的其他属性来启动应用。
注:Intent设置属性时,必须先使用Operation来设置属性。如果需要新增或修改属性,则必须在设置Operation后再执行操作。
通过构造包含BundleName与AbilityName的Operation对象可以启动一个Ability,并导航到该Ability。
在5.8节的ServiceAbilityLifeCycle应用中,启动本地服务的方式就是根据Ability的全称启动应用的一个例子。其代码如下:
在上面的代码中,通过Intent中的OperationBuilder类构造operation对象,指定设备标识(空串表示当前设备)、应用包名、Ability名称。
在有些场景下,开发者需要在应用中使用其他应用提供的某种能力,而不感知提供该能力的具体是哪一个应用。例如,开发者需要通过浏览器打开一个链接,而不关心用户最终选择哪一个浏览器应用,则可以通过Operation的其他属性(除BundleName与AbilityName之外的属性)描述需要的能力。如果设备上存在多个应用提供同种能力,系统则弹出候选列表,由用户选择由哪个应用处理请求。以下示例展示使用Intent跨Ability查询天气信息。
创建一个名为IntentOperationWithAction的应用作为演示。
通过DevEco Studio创建一个关于天气信息的Page——WeatherAbility,如图5-26所示。
图5-26 创建Page
自动创建了如下的WeatherAbilitySlice类:
WeatherAbility使用的布局名称是ability_weather。修改ability_weather.xml如下:
上述布局会在页面正中显示Weather字样。
修改配置文件,增加action.weather路由信息内容如下:
上述配置是为了配置路由,以便支持以此action导航到对应的AbilitySlice。
重写WeatherAbility类的onActive的方法,代码如下:
上述代码中:
· resultIntent是Intent的示例,用于返回结果。
· 通过Parameters的方式来传递天气信息。Parameters是一种支持自定义的数据结构,通过setParam方法将温度17放到resultIntent中。
· 调用setResult方法暂存返回结果。
MainAbilitySlice作为请求方,修改代码如下:
上述代码中:
· Text增加了点击事件以触发请求,并路由到action.weather。
· 重写了onAbilityResult方法,用来接收请求的返回值。注意resultData获取的返回参数的值是字符串,以此需要用getStringParam方法;如果是整型,则可以使用getIntParam方法。
运行应用,界面效果如图5-27所示。
图5-27 运行效果
点击“你好,世界”字样,触发路由到action.weather的请求,界面效果如图5-28所示。
图5-28 运行效果
此时,控制台HiLog输出内容如下:
08-30 23:12:16.912 12981-12981/com.waylau.hmos.intentoperationwithaction I 00001/MainAbilitySlice: before queryWeather 08-30 23:12:17.103 12981-12981/com.waylau.hmos.intentoperationwithaction I 00001/WeatherAbility: [a269a1f550dfbaf, 370df30, 22b4094] before onActive
点击模拟器返回按钮,返回“你好,世界”界面,效果如图5-29所示。
此时,控制台HiLog输出内容如下:
08-30 23:12:17.103 12981-12981/com.waylau.hmos.intentoperationwithaction I 00001/WeatherAbility: [a269a1f550dfbaf, 370df30, 22b4094] after onActive 08-30 23:13:57.338 12981-12981/com.waylau.hmos.intentoperationwithaction I 00001/MainAbilitySlice: onAbilityResult 08-30 23:13:57.338 12981-12981/com.waylau.hmos.intentoperationwithaction I 00001/MainAbilitySlice: code 1 result: 17
从上述日志文件可以看出,MainAbilitySlice已经能够拿到WeatherAbility的返回值,温度是17。
图5-29 运行效果
5.12.3节演示了通过指定Action来打开指定的应用,其实系统自带的应用也可以用类似的方式打开。
本节演示如何来打开系统应用拨号盘。创建名为IntentOperationWithActionDial的应用作为演示。
修改MainAbilitySlice代码如下:
上述代码中:
· Text增加了点击事件以触发请求,点击就会执行doCall方法。
· doCall构建了Intent,该对象指明了withAction为系统应用拨号盘。拨号盘的Action常量值定义在IntentConstants.ACTION_DIAL中。
· 使用startAbility方法来启动Ability。
IntentConstants定义了众多的系统应用常量值,比如搜索、发短信等,这些系统应用都可以参照拨号盘的方式来启动。IntentConstants源码如下:
运行应用,界面显示如图5-30所示。
图5-30 运行效果
点击“你好,世界”本文,触发点击事件。此时,界面切换到了系统应用拨号盘,如图5-31所示。
图5-31 运行效果
那么,能否在启动Ability的时候来设置参数呢?比如,启动拨号盘的时候设置拨号的号码。
可以将代码修改如下:
上述代码在Operation中通过withUri来传递电话号码。再次运行应用,可以看到界面效果如图5-32所示。
图5-32 运行效果