HarmonyOS 鸿蒙Next 无法正常跳转到另一个Ability
HarmonyOS 鸿蒙Next 无法正常跳转到另一个Ability 麻烦各路大佬帮忙看看问题是什么原因
当前信息:
- 另一个Ability可以在Preview中正常浏览
- 在创建的对应的Ability中可以日志打印“Succeeded in loading the content. Data”
- 在跳转的回调函数中,也没有对应的错误码以及错误信息的日志打印
现象+日志
涉及代码
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
当前调试跟进,在新建的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,可能的原因包括:
-
Ability的配置问题:检查
config.json
文件中是否正确定义了目标Ability的路径和名称。确保目标Ability的visible
属性设置为true
,否则无法被其他Ability调用。 -
Intent的配置问题:跳转时使用的
Intent
对象必须包含目标Ability的bundleName
和abilityName
,且这些信息必须与config.json
中的配置一致。如果缺少或错误,跳转将失败。 -
权限问题:如果目标Ability需要特定权限,确保在
config.json
中声明了这些权限,并且在跳转前已经获取了相应的权限。 -
生命周期问题:确保当前Ability和目标Ability的生命周期状态正确。如果当前Ability处于
onBackground
或onStop
状态,可能无法正常跳转。 -
跨设备问题:如果目标Ability位于另一台设备上,确保设备之间的分布式能力已经正确配置,并且设备之间的连接正常。
-
代码逻辑问题:检查跳转代码的逻辑,确保在跳转前没有抛出异常或执行了错误的操作。
-
系统版本兼容性:确保使用的鸿蒙SDK版本与目标设备的系统版本兼容。某些API或功能在旧版本中可能不可用。
通过排查上述问题,可以解决鸿蒙Next无法正常跳转到另一个Ability的情况。