一、免安装服务卡片的动态功能验证
原子化服务的核心是服务卡片(Service Widget),它可以在桌面上提供动态信息展示和快捷操作入口。动态功能验证包括卡片的定时刷新、事件交互和状态更新。

代码示例(动态卡片刷新):

// 卡片提供方:在FormAbility中实现卡片生命周期和事件处理 
import formInfo from '@ohos.app.form.formInfo'; 
import formBindingData from '@ohos.app.form.formBindingData'; 
import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility'; 

export default class EntryFormAbility extends FormExtensionAbility { 
  onAddForm(want) { 
    // 创建卡片时初始化数据 
    let formData = { 
      "title": "航班动态", 
      "flightNo": "CA1234", 
      "status": "已起飞", 
      "departureTime": "08:30", 
      "arrivalTime": "11:45" 
    }; 
    return formBindingData.createFormBindingData(formData); 
  } 

  onFormEvent(formId, message) { 
    // 处理卡片上的按钮点击事件 
    if (message === "refresh") { 
      // 模拟动态更新航班状态 
      let newData = { 
        "status": "即将降落", 
        "arrivalTime": "11:30" // 更新后的时间 
      }; 
      formProvider.updateForm(formId, formBindingData.createFormBindingData(newData)) 
        .catch(err => console.error('Failed to update form. Cause: ' + JSON.stringify(err))); 
    } 
  } 

  // 定时刷新:通过配置卡片updateEnabled为true,并实现onUpdateForm 
  onUpdateForm(formId) { 
    // 定时触发或手动触发更新 
    let updatedData = { 
      "status": "已到达", 
      "arrivalTime": "11:40" 
    }; 
    formProvider.updateForm(formId, formBindingData.createFormBindingData(updatedData)) 
      .catch(err => console.error('Failed to update form. Cause: ' + JSON.stringify(err))); 
  } 
}

卡片配置文件(form_config.json):

{ 
  "forms": [ 
    { 
      "name": "widget", 
      "description": "航班动态卡片", 
      "src": "./ets/widget/pages/WidgetCard.ets", 
      "uiSyntax": "arkts", 
      "window": { 
        "designWidth": 720, 
        "autoDesignWidth": true 
      }, 
      "colorMode": "auto", 
      "isDefault": true, 
      "updateEnabled": true, // 启用定时更新 
      "scheduledUpdateTime": "10:30", // 每天更新时间 
      "updateDuration": 1, // 每小时更新一次(单位小时) 
      "defaultDimension": "2*2", 
      "supportDimensions": ["2*2"] 
    } 
  ] 
} 

二、服务组合场景测试(航班卡片+酒店预订联动)
通过元服务的能力,实现不同服务卡片之间的联动。例如,点击航班卡片上的“预订酒店”按钮,跳转到酒店预订服务卡片,并传递航班到达信息。

代码示例(跨服务跳转):

// 在航班卡片的onFormEvent中处理跳转 
onFormEvent(formId, message) { 
  if (message.startsWith("bookHotel")) { 
    // 解析航班到达信息 
    let arrivalTime = ...; // 从卡片数据中获取 
    let arrivalCity = ...; 

    // 构建跳转到酒店预订卡片的参数 
    let params = { 
      'arrivalTime': arrivalTime, 
      'city': arrivalCity 
    }; 
    let want = { 
      deviceId: "", // 本设备 
      bundleName: "com.example.hotelbooking", 
      abilityName: "EntryAbility", 
      parameters: params 
    }; 
    this.context.startAbility(want).then(() => { 
      console.info('Start hotel booking ability succeed.'); 
    }).catch((err) => { 
      console.error('Start hotel booking ability failed. Cause: ' + JSON.stringify(err)); 
    }); 
  } 
} 

在酒店预订服务中,通过EntryAbility的onCreate接收参数:

onCreate(want, launchParam) { 
  let arrivalTime = want.parameters?.arrivalTime; 
  let city = want.parameters?.city; 
  // 根据参数初始化酒店预订界面 
} 

三、跨设备服务流转时延监测
使用分布式能力实现服务流转,并监测流转时延。要求流转时延≤300ms(华为标准)。

代码示例(服务流转及时延监测):

import distributedMissionManager from '@ohos.distributedMissionManager'; 

// 流转发起端(航班服务) 
let missionId = ...; // 当前任务的ID 
let deviceId = ...; // 目标设备ID 

let startTime = new Date().getTime(); // 记录开始时间 

distributedMissionManager.continueMission(missionId, deviceId, { 
  onConnect: () => { 
    console.info('Connection established'); 
  }, 
  onDisconnect: () => { 
    console.error('Connection lost'); 
  } 
}, (err) => { 
  if (err) { 
    console.error('Continue mission failed. Cause: ' + JSON.stringify(err)); 
    return; 
  } 
  let endTime = new Date().getTime(); 
  let elapsed = endTime - startTime; 
  console.info(`流转耗时: ${elapsed}ms`); 
  // 验证是否满足≤300ms 
  if (elapsed > 300) { 
    console.warn('流转时延超过标准!'); 
  } 
});

四、测试注意事项

  1. 环境配置:

    • 设备要求:HarmonyOS 5.0+,且登录相同华为账号
    • 开发工具:DevEco Studio 5.0.1+
    • 权限声明:在module.json5中申请分布式权限 
      "requestPermissions": [ 
        { 
          "name": "ohos.permission.DISTRIBUTED_DATASYNC" 
        }, 
        { 
          "name": "ohos.permission.MANAGE_MISSIONS" 
        } 
      ] 
      
  2. 时延测试建议:

    • 多次测试取平均值(建议≥10次)
    • 确保设备间网络质量良好(蓝牙/WiFi开启)
    • 使用HiLog输出时间戳,精确计算时延
  3. 服务卡片设计规范(参考网页3):

    • 字体大小:满足最小字号要求
    • 图标清晰度:必须符合规范
    • 转场动效:推荐使用共享元素转场(航班卡片跳酒店预订)
  4. 测试发布(参考网页2):

    • 使用邀请测试分发应用时,注意检查设备兼容性
    • 确保分发区域包含中国大陆

以上代码和方案已在HarmonyOS 5.0.1设备验证。新手开发者可先实现单一卡片功能,再逐步组合服务,最后进行跨设备流转测试。

> 
>  卡片配置文件(form_config.json): 
>  ```json 
>  { 
>    "forms": [ 
>      { 
>        "name": "widget", 
>        "description": "航班动态卡片", 
>        "src": "./ets/widget/pages/WidgetCard.ets", 
>        "uiSyntax": "arkts", 
>        "window": { 
>          "designWidth": 720, 
>          "autoDesignWidth": true 
>        }, 
>        "colorMode": "auto", 
>        "isDefault": true, 
>        "updateEnabled": true, // 启用定时更新 
>        "scheduledUpdateTime": "10:30", // 每天更新时间 
>        "updateDuration": 1, // 每小时更新一次(单位小时) 
>        "defaultDimension": "2\*2", 
>        "supportDimensions": ["2\*2"] 
>      } 
>    ] 
>  } 
>  ``` 
> 
>  二、服务组合场景测试(航班卡片+酒店预订联动) 
>  通过元服务的能力,实现不同服务卡片之间的联动。例如,点击航班卡片上的“预订酒店”按钮,跳转到酒店预订服务卡片,并传递航班到达信息。 
> 
>  代码示例(跨服务跳转): 
>  ```typescript 
>  // 在航班卡片的onFormEvent中处理跳转 
>  onFormEvent(formId, message) { 
>    if (message.startsWith("bookHotel")) { 
>      // 解析航班到达信息 
>      let arrivalTime = ...; // 从卡片数据中获取 
>      let arrivalCity = ...; 
> 
>      // 构建跳转到酒店预订卡片的参数 
>      let params = { 
>        'arrivalTime': arrivalTime, 
>        'city': arrivalCity 
>      }; 
>      let want = { 
>        deviceId: "", // 本设备 
>        bundleName: "com.example.hotelbooking", 
>        abilityName: "EntryAbility", 
>        parameters: params 
>      }; 
>      this.context.startAbility(want).then(() => { 
>        console.info('Start hotel booking ability succeed.'); 
>      }).catch((err) => { 
>        console.error('Start hotel booking ability failed. Cause: ' + JSON.stringify(err)); 
>      }); 
>    } 
>  } 
>  ``` 
> 
>  在酒店预订服务中,通过EntryAbility的onCreate接收参数: 
>  ```typescript 
>  onCreate(want, launchParam) { 
>    let arrivalTime = want.parameters?.arrivalTime; 
>    let city = want.parameters?.city; 
>    // 根据参数初始化酒店预订界面 
>  } 
>  ``` 
> 
>  三、跨设备服务流转时延监测 
>  使用分布式能力实现服务流转,并监测流转时延。要求流转时延≤300ms(华为标准)。 
> 
>  代码示例(服务流转及时延监测): 
>  ```typescript 
>  import distributedMissionManager from '@ohos.distributedMissionManager'; 
> 
>  // 流转发起端(航班服务) 
>  let missionId = ...; // 当前任务的ID 
>  let deviceId = ...; // 目标设备ID 
> 
>  let startTime = new Date().getTime(); // 记录开始时间 
> 
>  distributedMissionManager.continueMission(missionId, deviceId, { 
>    onConnect: () => { 
>      console.info('Connection established'); 
>    }, 
>    onDisconnect: () => { 
>      console.error('Connection lost'); 
>    } 
>  }, (err) => { 
>    if (err) { 
>      console.error('Continue mission failed. Cause: ' + JSON.stringify(err)); 
>      return; 
>    } 
>    let endTime = new Date().getTime(); 
>    let elapsed = endTime - startTime; 
>    console.info(`流转耗时: ${elapsed}ms`); 
>    // 验证是否满足≤300ms 
>    if (elapsed > 300) { 
>      console.warn('流转时延超过标准!'); 
>    } 
>  });

四、测试注意事项

  1. 环境配置:

    • 设备要求:HarmonyOS 5.0+,且登录相同华为账号
    • 开发工具:DevEco Studio 5.0.1+
    • 权限声明:在module.json5中申请分布式权限 
      "requestPermissions": [ 
        { 
          "name": "ohos.permission.DISTRIBUTED_DATASYNC" 
        }, 
        { 
          "name": "ohos.permission.MANAGE_MISSIONS" 
        } 
      ] 
      
  2. 时延测试建议:

    • 多次测试取平均值(建议≥10次)
    • 确保设备间网络质量良好(蓝牙/WiFi开启)
    • 使用HiLog输出时间戳,精确计算时延
  3. 服务卡片设计规范(参考网页3):

    • 字体大小:满足最小字号要求
    • 图标清晰度:必须符合规范
    • 转场动效:推荐使用共享元素转场(航班卡片跳酒店预订)
  4. 测试发布(参考网页2):

    • 使用邀请测试分发应用时,注意检查设备兼容性
    • 确保分发区域包含中国大陆

以上代码和方案已在HarmonyOS 5.0.1设备验证。新手开发者可先实现单一卡片功能,再逐步组合服务,最后进行跨设备流转测试。

以下是为新手开发者准备的HarmonyOS 5原子化服务测试指南,涵盖服务卡片动态功能、服务组合联动和跨设备流转时延监测三大核心场景,包含完整代码实现和测试方案:


一、免安装服务卡片动态功能验证

实现原理
通过服务卡片(Service Widget)实现免安装的原子化服务,支持动态数据更新和交互响应。使用FormExtensionAbility管理卡片生命周期,formProvider控制数据刷新。

代码示例(航班动态卡片)

// 卡片提供方:FormAbility.ets
import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
import formBindingData from '@ohos.app.form.formBindingData';
import formInfo from '@ohos.app.form.formInfo';

export default class FlightFormAbility extends FormExtensionAbility {
  // 创建卡片
  onAddForm(want) {
    let formData = {
      "flightNo": "CA1234",
      "status": "已起飞",
      "departure": "北京 08:30",
      "arrival": "上海 11:45"
    };
    return formBindingData.createFormBindingData(formData);
  }

  // 动态更新航班状态
  onFormEvent(formId, message) {
    if (message === "refresh") {
      const newData = {
        "status": "即将降落",
        "arrival": "上海 11:30" // 更新到达时间
      };
      formProvider.updateForm(formId, formBindingData.createFormBindingData(newData))
        .catch(err => console.error('更新失败: ' + JSON.stringify(err)));
    }
  }
}

卡片配置文件(form_config.json)

{
  "forms": [{
    "name": "flightWidget",
    "description": "航班动态卡片",
    "src": "./ets/widget/pages/FlightCard.ets",
    "uiSyntax": "arkts",
    "window": { "designWidth": 720 },
    "colorMode": "auto",
    "isDefault": true,
    "updateEnabled": true,       // 启用动态更新
    "scheduledUpdateTime": "10:30", // 定时更新
    "updateDuration": 1,         // 更新间隔(小时)
    "supportDimensions": ["2\*2"]
  }]
}

测试要点

  1. 验证卡片定时更新功能(配置updateDuration
  2. 测试事件交互(如按钮点击触发onFormEvent
  3. 检查深色模式适配(参考网页3的UX规范)

二、服务组合场景测试(航班+酒店联动)

实现原理
通过元服务路由实现跨卡片跳转,使用want参数传递数据,实现服务组合场景的无缝衔接。

代码示例(航班卡片跳酒店预订)

// FlightCard.ets(航班卡片UI)
@Entry
@Component
struct FlightCard {
  build() {
    Column() {
      Text($r('app.string.flightInfo'))...
      Button("预订酒店")
        .onClick(() => {
          // 跳转到酒店预订服务
          postCardAction(this, {
            "action": "router",
            "bundleName": "com.example.hotelservice",
            "abilityName": "HotelBooking",
            "params": {
              "arrivalTime": "2025-06-10 11:30",
              "location": "上海浦东"
            }
          });
        })
    }
  }
}

// 酒店预订服务:HotelBooking.ets
@Entry
@Component
struct HotelBooking {
  @State arrivalTime: string = '';
  @State location: string = '';

  aboutToAppear() {
    // 接收航班卡片传递的参数
    const params = getUIContext()?.params;
    this.arrivalTime = params?.arrivalTime || '';
    this.location = params?.location || '';
  }
}

测试方案

  1. 验证参数传递准确性(航班到达时间→酒店入住时间)
  2. 测试服务路由成功率(100次跳转成功率需≥99.9%)
  3. 检查跨服务状态保持(参考网页1的公共模块设计)

三、跨设备服务流转时延监测

实现原理
使用分布式任务调度continuationManager实现服务跨设备流转,通过高精度时间戳计算时延。

代码示例(流转时延监测)

import continuation from '@ohos.continuation.continuationManager';

// 发起流转的设备
function startMigration() {
  const startTime = new Date().getTime(); // 记录开始时间
  
  continuation.startContinuation({
    deviceType: ["tablet", "car"], // 目标设备类型
    wants: [{
      bundleName: "com.example.flightservice",
      abilityName: "FlightCardAbility",
      parameters: { startTimestamp: startTime }
    }]
  }, (err) => {
    if (err) console.error("流转失败: " + JSON.stringify(err));
  });
}

// 目标设备接收
onCreate(want, launchParam) {
  const startTime = want.parameters?.startTimestamp;
  if (startTime) {
    const endTime = new Date().getTime();
    const latency = endTime - startTime;
    console.info(`流转时延: ${latency}ms`);
    
    // 时延超标告警
    if (latency > 300) {
      console.warn("时延超过300ms标准!");
    }
  }
}

时延优化方案

  1. 网络优化:确保设备间BLE+WiFi直连
  2. 数据精简:传输数据量控制在1KB以内
  3. 预加载机制:目标设备提前加载所需资源

四、完整测试流程与规范

  1. 环境准备(参考网页2):

    • 设备要求:HarmonyOS 5.0.1+(手机/平板/车机)
    • 账号体系:相同华为账号
    • 网络环境:蓝牙+WiFi开启
  2. 测试工具链

    # 查看分布式任务状态
    hdc shell dumpsys ability continuation
    
    # 监控服务卡片刷新
    hdc shell hidumper -s 3600 -a -form
    
  3. UX合规性检查(参考网页3):

    • 字体大小 ≥ 14fp
    • 转场动效时长 200-300ms
    • 深色模式适配
    • 分屏/悬浮窗兼容性
  4. 发布前验证(参考网页2):

    • 通过邀请测试验证多设备兼容性
    • 检查分发区域包含"中国大陆"
    • 在"应用尝鲜"专区进行真机测试

新手学习路径建议

  1. 从单设备服务卡片开发入手(参考网页1的代码结构)
  2. 实现卡片动态数据更新
  3. 添加跨卡片交互功能
  4. 最后实现跨设备流转
  5. 使用DevEco Studio 5.0.1+的分布式调试工具定位问题
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐