鸿蒙5.0开发进阶:Stage模型-@ohos.app.ability.childProcessManager (childProcessManager)

往期鸿蒙全套实战文章必看:(文中附带全栈鸿蒙学习资料)


@ohos.app.ability.childProcessManager (childProcessManager)

childProcessManager模块提供子进程管理能力,支持子进程启动操作。该模块仅平板类设备可用。

说明

本模块首批接口从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

本模块接口仅可在Stage模型下使用。

导入模块

import { childProcessManager } from '@kit.AbilityKit';

StartMode

子进程启动模式枚举。

系统能力:SystemCapability.Ability.AbilityRuntime.Core

名称说明
SELF_FORK0从App自身进程Fork子进程。以该模式启动的子进程中不能进行Binder IPC调用,会导致子进程Crash。不支持异步ArkTS API调用。
APP_SPAWN_FORK1从AppSpawn Fork子进程。以该模式启动的子进程不会继承父进程资源,且没有ApplicationContext,子进程中不支持依赖ApplicationContext的API调用。

childProcessManager.startChildProcess

startChildProcess(srcEntry: string, startMode: StartMode): Promise<number>

启动子进程,并调用子进程的入口方法。使用Promise异步回调。

创建子进程成功会返回子进程pid,但并不代表入口方法调用成功,具体结果以ChildProcess.onStart方法是否调用成功为准。子进程中不支持再次创建子进程。

系统能力:SystemCapability.Ability.AbilityRuntime.Core

参数:

参数名类型必填说明
srcEntrystring

子进程源文件路径,只支持源文件放在entry类型的模块中,以src/main为根目录。例如子进程文件在entry模块下src/main/ets/process/DemoProcess.ets,则srcEntry为"./ets/process/DemoProcess.ets"。

另外,需要确保子进程源文件被其它文件引用到,防止被构建工具优化掉。(详见下方示例代码)

startModeStartMode子进程启动模式。

返回值:

类型说明
Promise<number>Promise对象,返回子进程pid。

错误码

以下错误码详细介绍

错误码ID错误信息
401Parameter error. Possible causes: 1.Mandatory parameters are left unspecified; 2.Incorrect parameter types; 3.Parameter verification failed.
16000050Internal error.
16000061Operation not supported.
16000062The number of child process exceeds upper bound.

示例:

// 在entry模块的src/main/ets/process下创建DemoProcess.ets子进程类:
// entry/src/main/ets/process/DemoProcess.ets
import { ChildProcess } from '@kit.AbilityKit';

export default class DemoProcess extends ChildProcess {
  onStart() {
    console.log("DemoProcess OnStart() called");
  }
}
// 使用childProcessManager.startChildProcess方法启动子进程:
// entry/src/main/ets/tool/Tool.ets
import { childProcessManager } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import DemoProcess from '../process/DemoProcess';

try {
  DemoProcess.toString(); // 这里要调用下DemoProcess类的任意方法,防止没有引用到而被构建工具优化掉
  childProcessManager.startChildProcess("./ets/process/DemoProcess.ets", childProcessManager.StartMode.SELF_FORK)
    .then((data) => {
      console.log(`startChildProcess success, pid: ${data}`);
    }, (err: BusinessError) => {
      console.error(`startChildProcess error, errorCode: ${err.code}`);
    })
} catch (err) {
  console.error(`startChildProcess error, errorCode: ${(err as BusinessError).code}`);
}

childProcessManager.startChildProcess

startChildProcess(srcEntry: string, startMode: StartMode, callback: AsyncCallback<number>): void

启动子进程,并调用子进程的入口方法。使用callback异步回调。

创建子进程成功会返回子进程pid,但并不代表入口方法调用成功,具体结果以ChildProcess.onStart方法是否调用成功为准。子进程中不支持再次创建子进程。

系统能力:SystemCapability.Ability.AbilityRuntime.Core

参数:

参数名类型必填说明
srcEntrystring

子进程源文件路径,只支持源文件放在entry类型的模块中,以src/main为根目录。例如子进程文件在entry模块下src/main/ets/process/DemoProcess.ets,则srcEntry为"./ets/process/DemoProcess.ets"。

另外,需要确保子进程源文件被其它文件引用到,防止被构建工具优化掉。(详见下方示例代码)

startModeStartMode子进程启动模式。
callbackAsyncCallback<number>回调函数。当子进程启动成功,err为undefined,data为获取到的子进程pid;否则为错误对象。

错误码

以下错误码详细介绍

错误码ID错误信息
401Parameter error. Possible causes: 1.Mandatory parameters are left unspecified; 2.Incorrect parameter types; 3.Parameter verification failed.
16000050Internal error.
16000061Operation not supported.
16000062The number of child process exceeds upper bound.

示例:

// 在entry模块的src/main/ets/process下创建DemoProcess.ets子进程类:
// entry/src/main/ets/process/DemoProcess.ets
import { ChildProcess } from '@kit.AbilityKit';

export default class DemoProcess extends ChildProcess {
  onStart() {
    console.log("DemoProcess OnStart() called");
  }
}
// 使用childProcessManager.startChildProcess方法启动子进程:
// entry/src/main/ets/tool/Tool.ets
import { childProcessManager } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import DemoProcess from '../process/DemoProcess';

try {
  DemoProcess.toString(); // 这里要调用下DemoProcess类的任意方法,防止没有引用到而被构建工具优化掉
  childProcessManager.startChildProcess("./ets/process/DemoProcess.ets", childProcessManager.StartMode.SELF_FORK, (err, data) => {
    if (data) {
      console.log(`startChildProcess success, pid: ${data}`);
    } else {
      console.error(`startChildProcess error, errorCode: ${err.code}`);
    }
  });
} catch (err) {
  console.error(`startChildProcess error, errorCode: ${(err as BusinessError).code}`);
}

childProcessManager.startArkChildProcess12+

startArkChildProcess(srcEntry: string, args: ChildProcessArgs, options?: ChildProcessOptions): Promise<number>

启动子进程,并调用子进程的入口方法。使用Promise异步回调。

子进程不会继承父进程资源。创建子进程成功会返回子进程pid,但并不代表入口方法调用成功,具体结果以ChildProcess.onStart方法是否调用成功为准。子进程中不支持再次创建子进程。

子进程支持传参和异步ArkTS API调用(部分依赖ApplicationContext的API除外)。ChildProcess.onStart方法执行完后子进程不会自动销毁,需要子进程调用process.abort销毁。主进程销毁后子进程也会一并销毁。

系统能力:SystemCapability.Ability.AbilityRuntime.Core

参数:

参数名类型必填说明
srcEntrystring

子进程源文件路径,不支持源文件放在HAR类型的模块中。由“模块名” + “/” + “文件路径”组成,文件路径以src/main为根目录。例如子进程文件在module1模块下src/main/ets/process/DemoProcess.ets,则srcEntry为"module1/./ets/process/DemoProcess.ets"。

另外,需要确保子进程源文件被其它文件引用到,防止被构建工具优化掉。(详见下方示例代码)

argsChildProcessArgs传递到子进程的参数。
optionsChildProcessOptions子进程的启动配置选项。

返回值:

类型说明
Promise<number>Promise对象,返回子进程pid。

错误码

以下错误码详细介绍

错误码ID错误信息
401Parameter error. Possible causes: 1.Mandatory parameters are left unspecified; 2.Incorrect parameter types; 3.Parameter verification failed.
801Capability not supported.
16000050Internal error.
16000061Operation not supported. The API cannot be called in a child process.
16000062The number of native child process exceeds upper bound.

示例:

示例中的context的获取方式。

// 在module1模块的src/main/ets/process下创建DemoProcess.ets子进程类:
// module1/src/main/ets/process/DemoProcess.ets
import { ChildProcess, ChildProcessArgs } from '@kit.AbilityKit';

export default class DemoProcess extends ChildProcess {

  onStart(args?: ChildProcessArgs) {
    let entryParams = args?.entryParams;
    let fd = args?.fds?.key1;
    // ..
  }
}
​​​​// 使用childProcessManager.startArkChildProcess方法启动子进程:
// module1/src/main/ets/tool/Tool.ets
import { common, ChildProcessArgs, ChildProcessOptions, childProcessManager } from '@kit.AbilityKit';
import fs from '@ohos.file.fs';
import { BusinessError } from '@kit.BasicServicesKit';
import DemoProcess from '../process/DemoProcess';

try {
  DemoProcess.toString(); // 这里要调用下DemoProcess类的任意方法,防止没有引用到而被构建工具优化掉
  let context = getContext(this) as common.UIAbilityContext;
  let path = context.filesDir + "/test.txt";
  let file = fs.openSync(path, fs.OpenMode.READ_ONLY | fs.OpenMode.CREATE);
  let args: ChildProcessArgs = {
    entryParams: "testParam",
    fds: {
      "key1": file.fd
    }
  };
  let options: ChildProcessOptions = {
    isolationMode: false
  };
  childProcessManager.startArkChildProcess("module1/./ets/process/DemoProcess.ets", args, options)
    .then((pid) => {
      console.info(`startChildProcess success, pid: ${pid}`);
    })
    .catch((err: BusinessError) => {
      console.error(`startChildProcess business error, errorCode: ${err.code}, errorMsg:${err.message}`);
    })
} catch (err) {
  console.error(`startChildProcess error, errorCode: ${err.code}, errorMsg:${err.message}`);
}

ysql001 ~]# yum install zabbix-web-mysql-scl zabbix-apache-conf-scl \Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Resolving Dependencies --> Running transaction check ---> Package zabbix-apache-conf-scl.noarch 0:5.0.47-1.el7 will be installed --> Processing Dependency: zabbix-web-deps-scl = 5.0.47-1.el7 for package: zabbix-apache-conf-scl-5.0.47-1.el7.noarch ---> Package zabbix-web-mysql-scl.noarch 0:5.0.47-1.el7 will be installed --> Processing Dependency: rh-php72-php-mysqlnd for package: zabbix-web-mysql-scl-5.0.47-1.el7.noarch --> Running transaction check ---> Package zabbix-web-deps-scl.noarch 0:5.0.47-1.el7 will be installed --> Processing Dependency: rh-php72 for package: zabbix-web-deps-scl-5.0.47-1.el7.noarch --> Processing Dependency: rh-php72-php-bcmath for package: zabbix-web-deps-scl-5.0.47-1.el7.noarch --> Processing Dependency: rh-php72-php-fpm for package: zabbix-web-deps-scl-5.0.47-1.el7.noarch --> Processing Dependency: rh-php72-php-gd for package: zabbix-web-deps-scl-5.0.47-1.el7.noarch --> Processing Dependency: rh-php72-php-ldap for package: zabbix-web-deps-scl-5.0.47-1.el7.noarch --> Processing Dependency: rh-php72-php-mbstring for package: zabbix-web-deps-scl-5.0.47-1.el7.noarch --> Processing Dependency: rh-php72-php-xml for package: zabbix-web-deps-scl-5.0.47-1.el7.noarch ---> Package zabbix-web-mysql-scl.noarch 0:5.0.47-1.el7 will be installed --> Processing Dependency: rh-php72-php-mysqlnd for package: zabbix-web-mysql-scl-5.0.47-1.el7.noarch --> Finished Dependency Resolution Error: Package: zabbix-web-deps-scl-5.0.47-1.el7.noarch (zabbix-frontend) Requires: rh-php72-php-fpm Error: Package: zabbix-web-deps-scl-5.0.47-1.el7.noarch (zabbix-frontend) Requires: rh-php72-php-ldap Error: Package: zabbix-web-deps-scl-5.0.47-1.el7.noarch (zabbix-frontend) Requires: rh-php72-php-xml Error: Package: zabbix-web-deps-scl-5.0.47-1.el7.noarch (zabbix-frontend) Requires: rh-php72-php-mbstring Error: Package: zabbix-web-deps-scl-5.0.47-1.el7.noarch (zabbix-frontend) Requires: rh-php72-php-bcmath Error: Package: zabbix-web-deps-scl-5.0.47-1.el7.noarch (zabbix-frontend) Requires: rh-php72-php-gd Error: Package: zabbix-web-mysql-scl-5.0.47-1.el7.noarch (zabbix-frontend) Requires: rh-php72-php-mysqlnd Error: Package: zabbix-web-deps-scl-5.0.47-1.el7.noarch (zabbix-frontend) Requires: rh-php72 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest为啥
最新发布
08-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值