HarmonyOS 鸿蒙Next中关于UIAbility的配置问题

HarmonyOS 鸿蒙Next中关于UIAbility的配置问题 我创建一个UIAbility,想要改变运行时为新建的那个UIAbility的page页面

cke_37787.png

过程如下

1.新建一个项目

cke_1844.png

2.先建一个UIAbility

cke_8372.png

3.在pages夹下先建一个Page2页面

cke_9582.png

代码:

@Entry
@Component
struct Page2 {
  build() {
    Column(){
      Text("2222222222222")

    }

  }
}

4.修改module.json5文件,结果如下

{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "description": "$string:EntryAbility_desc",
        "icon": "$media:layered_image",
        "label": "$string:EntryAbility_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": false,//原值为true
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "ohos.want.action.home"
            ]
          }
        ]
      },
      {
        "name": "EntryAbility2",
        "srcEntry": "./ets/entryability2/EntryAbility2.ets",
        "description": "$string:EntryAbility2_desc",
        "icon": "$media:layered_image",
        "label": "$string:EntryAbility2_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true ,//新增字段
        "skills": [ //该字段为原始Ability的字段内容,复制粘贴过来
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "ohos.want.action.home"
            ]
          }
        ]
      }
    ],
    "extensionAbilities": [
      {
        "name": "EntryBackupAbility",
        "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",
        "type": "backup",
        "exported": false,
        "metadata": [
          {
            "name": "ohos.extension.backup",
            "resource": "$profile:backup_config"
          }
        ],
      }
    ]
  }
}

5.修改EntryAbility2的启动页面为Page2

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

const DOMAIN = 0x0000;

export default class EntryAbility1 extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy(): void {
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Page2', (err) => {//修改启动Page
      if (err.code) {
        hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
        return;
      }
      hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

6.运行结果

cke_791.png


更多关于HarmonyOS 鸿蒙Next中关于UIAbility的配置问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

尊敬的开发者,您好!请问通过项目新建UIAbility和Page2,配置module.json5,以达成入口文件页面的方案实现,以下方案能否满足您的需求:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/preload-application

更多关于HarmonyOS 鸿蒙Next中关于UIAbility的配置问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


【背景知识】

在EntryAbility中,通过调用startAbility()方法启动UIAbility,want为UIAbility实例启动的入口参数,其中bundleName为待启动应用的Bundle名称,abilityName为待启动的Ability名称,moduleName在待启动的UIAbility属于不同的Module时添加,parameters为自定义信息参数。示例中的context的获取方式请参见获取UIAbility的上下文信息

【解决方案】

import { common, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = '[Page_UIAbilityComponentsInteractive]';
const DOMAIN_NUMBER: number = 0xFF00;

@Entry
@Component
struct Page_UIAbilityComponentsInteractive {
  private context = this.getUIContext().getHostContext() as common.UIAbilityContext;

  build() {
    Column() {
      //...
      List({ initialIndex: 0 }) {
        ListItem() {
          Row() {
            //...
          }
          .onClick(() => {
            // context为Ability对象的成员,在非Ability对象内部调用需要
            // 将Context对象传递过去
            let wantInfo: Want = {
              deviceId: '', // deviceId为空表示本设备
              bundleName: 'com.samples.stagemodelabilitydevelop',
              moduleName: 'entry', // moduleName非必选
              abilityName: 'FuncAbilityA',
              parameters: {
                // 自定义信息
                info: '来自EntryAbility Page_UIAbilityComponentsInteractive页面'
              },
            };
            // context为调用方UIAbility的UIAbilityContext
            this.context.startAbility(wantInfo).then(() => {
              hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.');
            }).catch((error: BusinessError) => {
              hilog.error(DOMAIN_NUMBER, TAG, 'startAbility failed.');
            });
          })
        }
        //...
      }
      //...
    }
    //...
  }
}

【问题背景】:用户的多Ability项目中,更换Ability的启动设置不生效且报错

【解决思路】:

1. 检查module.json5的 Ability 可见性配置

将您的启动Ability中的visible设置为true,不启动的那个Ability设置为false试试看

2. 验证 Ability 名称与包名的一致性

启动命令中-a EntryAbility -b com.example.myapplication21需与module.json5中配置完全匹配:

  • 确认abilitiesname字段为EntryAbility
  • 确认package字段为com.example.myapplication21
  • 若包名或 Ability 名称不一致,需统一修改后重新编译。

3. 清理项目并重新部署

若配置无误仍报错,可通过 “清理 - 重建 - 重装” 流程排除编译缓存问题:

  • 在 DevEco Studio 中点击 Build > Clean Project
  • 再点击 Build > Build HAP(s) 重新构建安装包;
  • 卸载设备(或模拟器)上的旧应用,重新运行项目。

三、额外排查点

若上述步骤解决无效,需检查:

  • Ability 类型是否正确EntryAbilitytype需为"page"(页面 Ability),若误设为"service"(服务 Ability)会导致启动逻辑不兼容;
  • DevEco Studio 版本与 SDK 兼容性:确保 IDE 版本和鸿蒙 SDK 版本匹配,可通过File > Settings > HarmonyOS SDK检查并同步最新 SDK。.

若还是无法解决您的问题,建议提交工单进行反馈

工单提交链接

ErrorCode:00402028 ErrorDescription:Ability is not visible. Error while Launching ability,又试了一下,结果还是不行

设备屏幕息屏或者没有解锁,运行是需要保持亮屏并且处于解锁状态,

ErrorCode:00402028 ErrorDescription:Ability is not visible. Error while Launching ability,又试了一下,结果还是不行,

在HarmonyOS Next中,UIAbility的配置需在module.json5文件中定义。每个UIAbility需声明为独立对象,包含name、srcEntry、description等属性。launchType可设置为standard或singleton模式,分别支持多实例与单实例启动。skills部分需配置actions与entities,以定义Ability可处理的意图与场景。注意abilities数组内需正确引用UIAbility路径,确保系统能识别并调度。配置时需遵循严格语法,避免字段缺失或格式错误。

在HarmonyOS Next中配置UIAbility启动指定页面时,需要确保module.json5中abilities配置与UIAbility代码中的页面路径正确对应。

从您的配置来看,主要问题在于:

  1. EntryAbility2的配置中skills字段保留了entity.system.home,这会使系统将两个Ability识别为桌面入口,导致冲突
  2. 建议将EntryAbility2的skills配置修改为其他action或移除,避免与EntryAbility冲突

正确的做法:

{
  "name": "EntryAbility2",
  "srcEntry": "./ets/entryability2/EntryAbility2.ets",
  "exported": true,
  "skills": [
    {
      "entities": ["entity.system.default"],
      "actions": ["ohos.want.action.view"]
    }
  ]
}

同时检查Page2页面的文件路径是否正确,确保在pages目录下存在对应的Page2.ets文件。修改后重新编译运行即可正常启动指定的Page2页面。

回到顶部