HarmonyOS 鸿蒙Next 无法正常跳转到另一个Ability

HarmonyOS 鸿蒙Next 无法正常跳转到另一个Ability 麻烦各路大佬帮忙看看问题是什么原因

当前信息:

  1. 另一个Ability可以在Preview中正常浏览
  2. 在创建的对应的Ability中可以日志打印“Succeeded in loading the content. Data”
  3. 在跳转的回调函数中,也没有对应的错误码以及错误信息的日志打印

现象+日志

涉及代码

index.ets

import {Header} from '../Component/CommonComponents'
import Want from '@ohos.app.ability.Want'
import common from '@ohos.app.ability.common'
@Entry
@Component
struct DocumentListPage {
  private index: number = 1
  @State docs: number[] = []
  private context = this as common.UIAbilityContext
  build() {
    Row() {
      Column({space:20}) {
        Header({title: '文档列表'})
        Divider()
        Button('新建文档')
          .onClick(()=>{
            this.docs.push(this.index++)
          })
        ForEach(
          this.docs,
          (doc) => {
            Row({space:20}) {
              Image($r('app.media.ic_files_doc'))
                .width(25)
              Text(`文档${doc}`)
                .fontSize(25)

            }
            .width('100%')
            .justifyContent(FlexAlign.SpaceBetween)
            .onClick(()=>{
              // let  instanceKey: string = 'idx_' + doc
              let want: Want = {
                deviceId: '',   //deviceID为空表示本设备
                bundleName: 'com.example.uiabilitydemo',
                abilityName: 'DocumentAbility',
                moduleName: 'entry',      //非必选
                parameters: {
                  instanceKey: 'idx_' + doc
                }
              }

              console.info('idx_' + doc)
              this.context.startAbility(want, (error) =>{
                if (error.code) {
                  // 处理业务逻辑错误
                  console.log('DocumentAbilitytestTag——startAbility failed, error.code: ' + JSON.stringify(error.code) +
                  ' error.message: ' + JSON.stringify(error.message));
                  return;
                }
                // 执行正常业务
                console.log('startAbility succeed');
              })
            })

          }
        )
      }
      .width('100%')
      .height('100%')
      .padding(20)
    }
  }
}

DocumenPage.ets

import Want from '@ohos.app.ability.Want'
import common from '@ohos.app.ability.common'
@Entry
@Component
struct DocumentListPage {
  @State title: string = ''
  @State content: string = ''
  @State editTitle: boolean = true
  private context = this as common.UIAbilityContext
  build() {
    Row() {
      Column({space:20}) {
        Row() {
          Image($r('app.media.ic_public_back'))
            .width(30)
            .onClick(()=>{
              let want: Want = {
                deviceId: '',
                bundleName: 'com.example.uiabilitydemo',
                abilityName: 'EntryAbility',
              }
              this.context.startAbility(want)
            })
          if(!this.editTitle) {
            Text(this.title)
              .fontSize(30)
              .fontWeight(FontWeight.Bold)
              .onClick(()=> this.editTitle = true)
          } else {
            TextInput({
              placeholder: '请输入标题',
              text: this.title
            })
              .layoutWeight(1)
              .onChange(val => this.title = val)
            Button('确认')
              .onClick(()=>this.editTitle = false)
          }
        }
        .width('100%')

        Divider()
        TextArea({
          placeholder: '请编辑内容',
          text: this.content
        })
          .layoutWeight(1)
          .onChange(val => this.content = val)
      }
      .width('100%')
      .height('100%')
      .padding(20)
    }
  }
}

DocumentAbility.ts

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

export default class DocumentAbility extends UIAbility {
  onCreate(want, launchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

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

    windowStage.loadContent('pages/DocumentPage', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the DocumentPage content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

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

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

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

MyAbilityStage.ts

import AbilityStage from '@ohos.app.ability.AbilityStage';
import Want from '@ohos.app.ability.Want';
export default class MyAbilityStage extends AbilityStage {
  onAcceptWant(want: Want): string {
    if (want.abilityName === 'DocumentAbility') {
      console.log(`MyAbilityStage: DocumentAbilityInstance_${want.parameters.instanceKey}`);
      return `DocumentAbilityInstance_${want.parameters.instanceKey}`
    }
    return ''
  }
}

module.json5

{
  "module": {
    "name": "entry",
    "type": "entry",
    "srcEntry": './ets/mystageability/MyAbilityStage.ts',
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ts",
        "description": "$string:EntryAbility_desc",
        "icon": "$media:icon",
        "label": "$string:EntryAbility_label",
        "startWindowIcon": "$media:icon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ]
      },
      {
        "name": "DocumentAbility",
        "srcEntry": "./ets/documentability/DocumentAbility.ts",
        "description": "$string:documentability_desc",
        "icon": "$media:icon",
        "label": "$string:documentability_label",
        "startWindowIcon": "$media:icon",
        "startWindowBackground": "$color:start_window_background",
        "launchType": "specified"
      }
    ]
  }
}

app.json5

{
  "app": {
    "bundleName": "com.example.uiabilitydemo",
    "vendor": "example",
    "versionCode": 1000000,
    "versionName": "1.0.0",
    "icon": "$media:app_icon",
    "label": "$string:app_name"
  }
}

更多关于HarmonyOS 鸿蒙Next 无法正常跳转到另一个Ability的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

当前调试跟进,在新建的DocumentAbility.ts文件中将pages/DocumentPage修改为

pages/Index,可以跳转到Index页面,但是重新改回新建的DocumentPage页面,依然显示白屏,就好像没有识别到对应的第二个Ability对应的页面。这是啥情况,有大佬遇到过吗

更多关于HarmonyOS 鸿蒙Next 无法正常跳转到另一个Ability的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你手动创建的 DocumentPage 没有在 resources/base/profile 中注册,

没有在路由中注册,所以无法跳转。

搞定了 ,的确是这个问题,把这个配置忘记了。大佬麻烦在帖子下回复下吧,现在没法选择“采纳回答”,

当前,如果你不使用模拟器或真机,是不可能实现UIAbility跳转的,因为在预览模式下跳转UIAbility的功能是不支持的。


没有将模拟器运行的截图上传。请问大佬,如果是在模拟器上运行的,还是无法跳转到另一个ability,是啥原因呢。模拟器的现象是跳转后就是白色屏幕

我用着是没问题的,没看到你详细的代码,我也不知道你哪里可能有问题,

在HarmonyOS中,Ability是应用的基本组成部分,负责处理用户界面和业务逻辑。如果鸿蒙Next无法正常跳转到另一个Ability,可能的原因包括:

  1. Ability的配置问题:检查config.json文件中是否正确定义了目标Ability的路径和名称。确保目标Ability的visible属性设置为true,否则无法被其他Ability调用。

  2. Intent的配置问题:跳转时使用的Intent对象必须包含目标Ability的bundleNameabilityName,且这些信息必须与config.json中的配置一致。如果缺少或错误,跳转将失败。

  3. 权限问题:如果目标Ability需要特定权限,确保在config.json中声明了这些权限,并且在跳转前已经获取了相应的权限。

  4. 生命周期问题:确保当前Ability和目标Ability的生命周期状态正确。如果当前Ability处于onBackgroundonStop状态,可能无法正常跳转。

  5. 跨设备问题:如果目标Ability位于另一台设备上,确保设备之间的分布式能力已经正确配置,并且设备之间的连接正常。

  6. 代码逻辑问题:检查跳转代码的逻辑,确保在跳转前没有抛出异常或执行了错误的操作。

  7. 系统版本兼容性:确保使用的鸿蒙SDK版本与目标设备的系统版本兼容。某些API或功能在旧版本中可能不可用。

通过排查上述问题,可以解决鸿蒙Next无法正常跳转到另一个Ability的情况。

回到顶部