在HarmonyOS中,实况窗(Widget)允许应用程序展示小部件视图,并与用户进行简单的交互。要在自己的应用中调用实况窗,需要按照以下步骤进行:


1. 准备环境

确保你已经安装了DevEco Studio,并配置好了开发环境。


2. 创建实况窗工程

在你的应用项目中添加实况窗模块

打开DevEco Studio。

在项目根目录下新建一个名为“entry”的模块。

配置config.json

在config.json文件中添加实况窗的相关配置:

{
  "app": {
    // 应用信息
  },
  "deviceConfig": {
    // 设备配置
  },
  "module": {
    "type": "ability",
    "name": "entry",
    "label": "$string:app_name",
    "description": "$string:app_description",
    "icon": "$media:icon",
    "abilities": [
      {
        "name": ".MainAbility",
        "label": "$string:app_name",
        "description": "$string:app_description",
        "icon": "$media:icon",
        "type": "page",
        "tools": [
          "FA"
        ],
        "uri": "pages/index",
        "forms": [
          {
            "name": "MyWidget",
            "description": "$string:widget_description",
            "window": {
              "designWidth": 720,
              "autoDesignHeight": true
            }
          }
        ]
      }
    ],
    // 其他配置项...
  }
}

forms:定义实况窗的名称和描述等信息。

3. 创建实况窗布局

在entry/src/main/resources/base/layout目录下创建一个XML文件用于定义实况窗的布局,例如my_widget_layout.xml:


<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:width="match_parent"
    ohos:height="match_parent"
    ohos:orientation="vertical"
    ohos:padding="16vp">
    
    <Text
        ohos:id="$+id:text_title"
        ohos:width="match_parent"
        ohos:height="wrap_content"
        ohos:text="Hello, HarmonyOS!"
        ohos:text_size="24fp"
        ohos:text_color="#000000"/>
        
    <!-- 其他UI组件 -->

</DirectionalLayout>

4. 实现实况窗的Ability

在entry/src/main/java/包名目录下创建一个新的Java类继承自FormAbility,例如:


package com.example.myapplication;

import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.bundle.IBundleManager;
import ohos.data.DatabaseHelper;
import ohos.data.preferences.Preferences;

public class MyWidgetAbility extends FormAbility {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 初始化代码
    }

    @Override
    public void onCreate(Intent intent) {
        super.onCreate(intent);
        // 创建实况窗
    }

    @Override
    protected void onActive() {
        super.onActive();
        // 激活时的处理
    }

    @Override
    protected void onInactive() {
        super.onInactive();
        // 失活时的处理
    }

    @Override
    protected void onStop() {
        super.onStop();
        // 停止时的处理
    }
}

5. 注册实况窗Ability

在entry/src/main/resources/base/config.json中注册新的实况窗Ability:


{
  "app": {
    // 应用信息
  },
  "deviceConfig": {
    // 设备配置
  },
  "module": {
    "type": "ability",
    "name": "entry",
    "label": "$string:app_name",
    "description": "$string:app_description",
    "icon": "$media:icon",
    "abilities": [
      {
        "name": ".MainAbility",
        "label": "$string:app_name",
        "description": "$string:app_description",
        "icon": "$media:icon",
        "type": "page",
        "tools": [
          "FA"
        ],
        "uri": "pages/index",
        "forms": [
          {
            "name": "MyWidget",
            "description": "$string:widget_description",
            "window": {
              "designWidth": 720,
              "autoDesignHeight": true
            }
          }
        ]
      },
      {
        "name": ".MyWidgetAbility",
        "label": "$string:widget_label",
        "description": "$string:widget_description",
        "icon": "$media:widget_icon",
        "type": "form",
        "forms": [
          {
            "name": "MyWidget",
            "description": "$string:widget_description",
            "window": {
              "designWidth": 720,
              "autoDesignHeight": true
            }
          }
        ]
      }
    ],
    // 其他配置项...
  }
}

6. 调用实况窗

在你的主应用的代码中,可以通过Intent启动实况窗Ability:


import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;

public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 启动实况窗Ability
        Intent formIntent = new Intent();
        formIntent.setOperation(
            new Intent.OperationBuilder()
                .withDeviceId("")
                .withBundleName(getBundleName())
                .withAbilityName("com.example.myapplication.MyWidgetAbility")
                .build());
        startAbility(formIntent);
    }
}

小结

通过以上步骤,你可以在自己的应用中调用HarmonyOS的实况窗。需要注意的是,实际操作中可能会遇到一些细节问题,如权限配置、窗口管理等,建议参考HarmonyOS的官方文档进行详细配置和调试。