购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.12 Intent

在HarmonyOS中,Intent是对象之间传递信息的载体。例如,当一个Ability需要启动另一个Ability时,或者一个AbilitySlice需要导航到另一个AbilitySlice时,可以通过Intent指定启动的目标同时携带相关数据。

Intent的构成元素包括Operation与Parameters。

5.12.1 Operation与Parameters

Operation由表5-1所示的属性组成。

表5-1 Operation属性

除了上述属性之外,开发者也可以通过Parameters传递某些请求所需的额外信息。Parameters是一种支持自定义的数据结构。

当Intent用于发起请求时,根据指定元素的不同,分为两种类型:

· 如果同时指定了BundleName与AbilityName,则根据Ability的全称(例如com.waylau.hmos.PayAbility)来直接启动应用。

· 如果未同时指定BundleName和AbilityName,则根据Operation中的其他属性来启动应用。

注:Intent设置属性时,必须先使用Operation来设置属性。如果需要新增或修改属性,则必须在设置Operation后再执行操作。

5.12.2 根据Ability的全称启动应用

通过构造包含BundleName与AbilityName的Operation对象可以启动一个Ability,并导航到该Ability。

在5.8节的ServiceAbilityLifeCycle应用中,启动本地服务的方式就是根据Ability的全称启动应用的一个例子。其代码如下:

在上面的代码中,通过Intent中的OperationBuilder类构造operation对象,指定设备标识(空串表示当前设备)、应用包名、Ability名称。

5.12.3 实战:根据Operation的其他属性启动应用

在有些场景下,开发者需要在应用中使用其他应用提供的某种能力,而不感知提供该能力的具体是哪一个应用。例如,开发者需要通过浏览器打开一个链接,而不关心用户最终选择哪一个浏览器应用,则可以通过Operation的其他属性(除BundleName与AbilityName之外的属性)描述需要的能力。如果设备上存在多个应用提供同种能力,系统则弹出候选列表,由用户选择由哪个应用处理请求。以下示例展示使用Intent跨Ability查询天气信息。

创建一个名为IntentOperationWithAction的应用作为演示。

1.创建Page

通过DevEco Studio创建一个关于天气信息的Page——WeatherAbility,如图5-26所示。

图5-26 创建Page

自动创建了如下的WeatherAbilitySlice类:

WeatherAbility使用的布局名称是ability_weather。修改ability_weather.xml如下:

上述布局会在页面正中显示Weather字样。

2.配置路由

修改配置文件,增加action.weather路由信息内容如下:

上述配置是为了配置路由,以便支持以此action导航到对应的AbilitySlice。

3.修改WeatherAbility

重写WeatherAbility类的onActive的方法,代码如下:

上述代码中:

· resultIntent是Intent的示例,用于返回结果。

· 通过Parameters的方式来传递天气信息。Parameters是一种支持自定义的数据结构,通过setParam方法将温度17放到resultIntent中。

· 调用setResult方法暂存返回结果。

4.修改MainAbilitySlice

MainAbilitySlice作为请求方,修改代码如下:

上述代码中:

· Text增加了点击事件以触发请求,并路由到action.weather。

· 重写了onAbilityResult方法,用来接收请求的返回值。注意resultData获取的返回参数的值是字符串,以此需要用getStringParam方法;如果是整型,则可以使用getIntParam方法。

5.运行应用

运行应用,界面效果如图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.4 实战:启动系统应用

5.12.3节演示了通过指定Action来打开指定的应用,其实系统自带的应用也可以用类似的方式打开。

本节演示如何来打开系统应用拨号盘。创建名为IntentOperationWithActionDial的应用作为演示。

1.修改MainAbilitySlice

修改MainAbilitySlice代码如下:

上述代码中:

· Text增加了点击事件以触发请求,点击就会执行doCall方法。

· doCall构建了Intent,该对象指明了withAction为系统应用拨号盘。拨号盘的Action常量值定义在IntentConstants.ACTION_DIAL中。

· 使用startAbility方法来启动Ability。

IntentConstants定义了众多的系统应用常量值,比如搜索、发短信等,这些系统应用都可以参照拨号盘的方式来启动。IntentConstants源码如下:

2.运行

运行应用,界面显示如图5-30所示。

图5-30 运行效果

点击“你好,世界”本文,触发点击事件。此时,界面切换到了系统应用拨号盘,如图5-31所示。

图5-31 运行效果

3.设置参数

那么,能否在启动Ability的时候来设置参数呢?比如,启动拨号盘的时候设置拨号的号码。

可以将代码修改如下:

上述代码在Operation中通过withUri来传递电话号码。再次运行应用,可以看到界面效果如图5-32所示。

图5-32 运行效果 9CbNqoTzb/rN25Su48OcWhqWWFFB89JLZUIxHNB9YrqW0eP0v/r4t7OcszIz2UFU

点击中间区域
呼出菜单
上一章
目录
下一章
×