在HarmonyOS中,Intent是对象之间传递信息的载体。例如,当一个Ability需要启动另一个Ability时,或者一个AbilitySlice需要导航到另一个AbilitySlice时,可以通过Intent指定启动的目标同时携带相关数据。
Intent的构成元素包括Operation与Parameters。
Operation由表5-1所示的属性组成。
表5-1 Operation的属性
除上述属性之外,开发者也可以通过Parameters传递某些请求所需的额外信息。Parameters是一种支持自定义的数据结构。
当Intent用于发起请求时,根据指定元素的不同,启动分为两种类型:
(1)如果同时指定了BundleName与AbilityName,则根据Ability的全称(如com.waylau.hmos. PayAbility)直接启动应用。
(2)如果未同时指定BundleName和AbilityName,则根据Operation中的其他属性启动应用。
通过构造包含BundleName与AbilityName的Operation对象,可以启动一个Ability,并导航到该Ability。
在5.8节的ServiceAbilityLifeCycle应用中,启动本地服务的方式就是根据Ability的全称启动应用的一个示例,代码如下:
在上述代码中,通过Intent中的OperationBuilder类构造operation对象,指定设备ID(空串表示当前设备)、应用包名和Ability名称。
有些场景下,开发者需要在应用中使用其他应用提供的某种能力,而不感知提供该能力的具体是哪一个应用。例如,开发者需要通过浏览器打开一个链接,而不关心用户最终选择哪一个浏览器应用,则可以通过Operation的其他属性(除BundleName与AbilityName之外的属性)描述需要的能力。如果设备上存在多个应用提供同种能力,系统则弹出候选列表,由用户选择由哪个应用处理请求。以下示例展示使用Intent跨Ability查询天气信息。
创建一个名为IntentOperationWithAction的Car设备类型应用。
1. 创建Page
通过DevEco Studio创建一个关于天气信息的Page,如图5-26所示。
图5-26 创建Page
自动创建如下WeatherAbilitySlice类:
WeatherAbility使用的布局名称是ability_weather。修改ability_weather.xml,内容如下:
上述布局会在页面正中显示Weather字样。
2. 配置路由
修改配置文件,增加action.weather路由信息,内容如下:
上述配置,是为了配置路由以便支持以此action导航到对应的AbilitySlice。
3. 修改WeatherAbility
重写WeatherAbility类的onActive()方法,代码如下:
上述代码中:
(1)resultIntent是Intent的示例,用于返回结果。
(2)通过Parameters的方式传递天气信息。Parameters是一种支持自定义的数据结构,通过setParam()方法,将温度17放到resultIntent中。
(3)调用setResult()方法暂存返回结果。
4. 修改MainAbilitySlice
MainAbilitySlice作为请求方,修改代码如下:
上述代码中:
(1)Text中增加了单击事件以触发请求,并路由到action.weather。
(2)重写了onAbilityResult()方法,用来接收请求的返回值。注意,resultData获取的返回参数的值是字符串,因此需要用getStringParam()方法;如果是整型,则可以使用getIntParam()方法。
5. 运行应用
运行应用,界面效果如图5-27所示。
单击文本Hello World,触发路由到action.weather的请求,界面效果如图5-28所示。
图5-27 应用运行效果
图5-28 Weather界面
此时,控制台HiLog输出内容如下:
单击模拟器返回按钮,返回Hello World界面,如图5-29所示。
图5-29 返回Hello World界面
此时,控制台HiLog输出内容如下:
从上述日志文件中也可以看出,MainAbilitySlice已经能够获取WeatherAbility的返回值,温度是“17”。