HarmonyOS鸿蒙Next中多实例模式启动没有效果

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS鸿蒙Next中多实例模式启动没有效果

“launchType”: “multiton” 加了,但是启动没有效果,还是只有一个实例

![cke_1400.png](data-originheight=“882” data-originwidth=“1371” src="https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/377/415/895/2850086000377415895.20241105123459.53936651751720062557535719504796:50001231000000:2800:A8D084C0CFB9BAF5D6C53F7B6280C630EB19C20DD0A2FB3859232542C40B84C3.png)


更多关于HarmonyOS鸿蒙Next中多实例模式启动没有效果的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

EntryAbility也是可以多实例开启的,多实例配置完成后在EntryAbility.ets中使用如下代码:

onForeground() {
    let want: Want = {
      bundleName: 'com.example.myapplication',
      abilityName: 'EntryAbility'
    };
    let options: StartOptions = {
      displayId: 0
    };

    try {
      this.context.startAbility(want, options)
        .then(() => {
          // 执行正常业务
          console.info('startAbility succeed');
        })
        .catch((err: BusinessError) => {
          // 处理业务逻辑错误
          console.error(`startAbility failed, code is ${err.code}, message is ${err.message}`);
        });
    } catch (err) {
      // 处理入参错误异常
      let code = (err as BusinessError).code;
      let message = (err as BusinessError).message;
      console.error(`startAbility failed, code is ${code}, message is ${message}`);
    }
  }

你会发现EntryAbility跟病毒一样闪跳增殖。而我们多实例一般的打开方式是在entry文件夹点击右键->新建->Ability,我创建了一个名为secondAbility的第二个ability

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

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

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

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

    windowStage.loadContent('pages/secondIndex', (err) => {
      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 content.');
    });
  }

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

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

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

其中pages/secondIndex指向了我为这个ability创建的页面文件

@Entry
@Component
export struct secondIndex {
  build() {
    Row() {
      Column() {
        Text('多实例演示效果')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}

这个页面同样需要在全局路由表中进行配置:src/main/resources/base/profile/main_pages.json

{
  "src": [
    "pages/Index",
    "pages/secondIndex"
  ]
}

最后附上我的启动页代码:

Index.ets

import { multitonMode } from '../components/multitonMode'

@Entry
@Component
struct Index {
  onPageShow(): void {
  }

  aboutToAppear(): void {
  }

  build() {
    Column() {
      multitonMode()
    }
  }
}

components/multitonMode.ets

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

@Component
export struct multitonMode {
  build() {
    Row() {
      Column() {
        Text('启动多实例')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.launchMultiton(getContext(this) as common.UIAbilityContext);
          })

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

  launchMultiton(context: common.UIAbilityContext): void {
    // 定义要启动的能力信息
    const wantInfo: Want = {
      bundleName: getContext(context).applicationInfo.name,
      abilityName: 'secondAbility',
    };

    // 启动能力
    context.startAbility(wantInfo)
      .then(() => {
        // 成功启动能力后的处理逻辑
        console.log("Successfully opened privacy settings.");
      })
      .catch((err: BusinessError) => {
        // 处理启动能力时的错误
        console.error("Failed to open privacy settings:", err.message);
      });
  }
}

最终的实现效果就跟链接一样:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/uiability-launch-type-V5#multiton%E5%90%AF%E5%8A%A8%E6%A8%A1%E5%BC%8F

更多关于HarmonyOS鸿蒙Next中多实例模式启动没有效果的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,多实例模式启动没有效果可能是由于以下原因之一:

  1. 应用配置问题:检查应用的配置文件(如config.json)中是否正确启用了多实例模式。确保launchType字段设置为standardsingleton以外的值,如multiton

  2. 页面路由配置:在页面路由配置中,确保每个实例的页面路径是唯一的。如果多个实例使用了相同的页面路径,可能会导致启动效果不明显。

  3. 生命周期管理:多实例模式下,每个实例应有独立的生命周期管理。检查应用是否正确处理了每个实例的生命周期事件,如onCreateonDestroy等。

  4. 资源冲突:确保每个实例使用的资源(如数据库、文件等)是独立的,避免资源冲突导致实例启动失败或效果不明显。

  5. 系统限制:某些设备或系统版本可能对多实例模式的支持存在限制。检查设备是否支持多实例模式,并确保系统和应用版本是最新的。

  6. 日志分析:通过查看系统日志和应用日志,排查是否有异常或错误信息,帮助定位问题原因。

如果以上检查均无异常,建议进一步分析具体代码实现,确认是否在多实例模式下正确处理了实例的创建和销毁逻辑。

在HarmonyOS鸿蒙Next中,多实例模式启动无效可能是由于以下原因:

  1. 配置问题:检查config.json文件中的launchType是否设置为standardsingleton,确保正确配置了多实例模式。
  2. 页面栈管理:多实例模式依赖于页面栈管理,确保每个实例的页面栈独立,避免实例间页面栈混淆。
  3. 系统版本:确认使用的HarmonyOS版本支持多实例模式,某些旧版本可能不支持。
  4. 应用权限:检查应用是否具备多实例运行所需的权限,如ohos.permission.KEEP_BACKGROUND_RUNNING

如果以上配置无误,建议检查日志以获取更详细的错误信息,或参考官方文档进行进一步排查。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!