写点什么

HarmonyOS 学习路之开发篇——Intent

发布于: 2 小时前
HarmonyOS学习路之开发篇——Intent

Intent

基本概念

Intent 是对象之间传递信息的载体。例如,当一个 Ability 需要启动另一个 Ability 时,或者一个 AbilitySlice 需要导航到另一个 AbilitySlice 时,可以通过 Intent 指定启动的目标同时携带相关数据。Intent 的构成元素包括 Operation 与 Parameters,具体描述参见表 1。

表 1 Intent 的构成元素


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


  • 如果同时指定了 BundleName 与 AbilityName,则根据 Ability 的全称(例如“com.demoapp.FooAbility”)来直接启动应用。

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


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


关于 Intent 最简单的使用方法,可参见快速入门的示例代码。其中“实现页面跳转”重点描述了使用 Intent 实现两个页面跳转关系的操作。

根据 Ability 的全称启动应用

通过构造包含 BundleName 与 AbilityName 的 Operation 对象,可以启动一个 Ability、并导航到该 Ability。示例代码如下:


Intent intent = new Intent();
// 通过Intent中的OperationBuilder类构造operation对象,指定设备标识(空串表示当前设备)、应用包名、Ability名称Operation operation = new Intent.OperationBuilder() .withDeviceId("") .withBundleName("com.demoapp") .withAbilityName("com.demoapp.FooAbility") .build();
// 把operation设置到intent中intent.setOperation(operation);startAbility(intent);
复制代码


作为处理请求的对象,会在相应的回调方法中接收请求方传递的 Intent 对象。以导航到另一个 Ability 为例,导航的目标 Ability 可以在其 onStart()回调的参数中获得 Intent 对象。根据 Operation 的其他属性启动应用有些场景下,开发者需要在应用中使用其他应用提供的某种能力,而不感知提供该能力的具体是哪一个应用。例如开发者需要通过浏览器打开一个链接,而不关心用户最终选择哪一个浏览器应用,则可以通过 Operation 的其他属性(除 BundleName 与 AbilityName 之外的属性)描述需要的能力。如果设备上存在多个应用提供同种能力,系统则弹出候选列表,由用户选择由哪个应用处理请求。以下示例展示使用 Intent 跨 Ability 查询天气信息。


请求方


在 Ability 中构造 Intent 以及包含 Action 的 Operation 对象,并调用 startAbilityForResult()方法发起请求。然后重写 onAbilityResult()回调方法,对请求结果进行处理。


private void queryWeather() {    Intent intent = new Intent();    Operation operation = new Intent.OperationBuilder()            .withAction(Intent.ACTION_QUERY_WEATHER)            .build();    intent.setOperation(operation);    startAbilityForResult(intent, REQ_CODE_QUERY_WEATHER);}
@Overrideprotected void onAbilityResult(int requestCode, int resultCode, Intent resultData) { switch (requestCode) { case REQ_CODE_QUERY_WEATHER: // Do something with result. ... return; default: ... }}
复制代码


处理方 1、作为处理请求的对象,首先需要在配置文件中声明对外提供的能力,以便系统据此找到自身并作为候选的请求处理者。


{    "module": {        ...        "abilities": [            {                ...                "skills":[                    {                        "actions":[                            "ability.intent.QUERY_WEATHER"                        ]                    }                ]                ...            }        ]        ...    }    ...}
复制代码


2、在 Ability 中配置路由以便支持以此 action 导航到对应的 AbilitySlice。


@Overrideprotected void onStart(Intent intent) {    ...    addActionRoute(Intent.ACTION_QUERY_WEATHER, DemoSlice.class.getName());    ...}
复制代码


3、在 Ability 中处理请求,并调用 setResult()方法暂存返回结果。


@Overrideprotected void onActive() {    ...    Intent resultIntent = new Intent();    setResult(0, resultIntent);   //0为当前Ability销毁后返回的resultCode。    ...}
复制代码


发布于: 2 小时前阅读数: 2
用户头像

公众号【美男子玩编程】 2020.05.07 加入

精通移动开发、Android开发; 熟练应用java/JavaScript进行HarmonyOS开发; 熟练使用HTML/CSS语言进行网页开发。

评论

发布
暂无评论
HarmonyOS学习路之开发篇——Intent