1# DriverExtensionAbility 2 3[DriverExtensionAbility](../reference/apis/js-apis-app-ability-driverExtensionAbility.md)是DRIVER类型的ExtensionAbility组件,提供驱动相关扩展框架。对于部分设备,支持插入外接的硬件模块来扩展设备能力, 此时可以以应用方式安装该硬件模块的驱动程序。通过DriverExtensionAbility可实现此类应用的开发。 4 5 6[DriverExtensionAbility](../reference/apis/js-apis-app-ability-driverExtensionAbility.md)可以通过DriverExtensionManager被应用绑定,并根据应用的请求信息在后台处理相关事务。 7每个类型的ExtensionAbility都有自己的Context,DriverExtensionAbility通过[DriverExtensionContext](../reference/apis/js-apis-inner-application-driverExtensionContext.md)提供相关能力。 8 9本章节将从如下场景来介绍DriverExtensionAbility的基本使用。 10 11- [DriverExtensionAbility](#driverextensionability) 12 - [开发步骤](#开发步骤) 13 14## 开发步骤 15 16开发者在实现一个驱动时,需要在DevEco Studio工程中手动新建一个DriverExtensionAbility,具体步骤如下。 17 181. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为driverextability。 19 202. 在driverextability目录,右键选择“New > TypeScript File”,新建一个TypeScript文件并命名为DriverExtAbility.ts。 21 223. 打开DriverExtAbility.ts文件,导入[RPC通信模块](../reference/apis/js-apis-rpc.md),重载onRemoteMessageRequest()方法,接收应用传递过来的消息,并将处理的结果返回给应用。REQUEST_VALUE用于校验应用发送的服务请求码。 23 24 ```ts 25 import rpc from '@ohos.rpc'; 26 27 const REQUEST_CODE = 99; 28 29 class StubTest extends rpc.RemoteObject { 30 constructor(des: string) { 31 super(des); 32 } 33 34 // 接收应用传递过来的消息处理,以及将处理的结果返回给应用 35 onRemoteMessageRequest(code: number, data: rpc.MessageSequence, reply: rpc.MessageSequence, 36 option: rpc.MessageOption) { 37 if (code === REQUEST_CODE) { 38 // 接收应用传递过来的数据 39 // 应用使用多次调用data.writeInt()写入多个数据时,驱动可以通过多次调用data.readInt()方法接收对应的数据 40 let optFir: number = data.readInt(); 41 let optSec: number = data.readInt(); 42 // 驱动将数据的处理结果返回给应用 43 // 示例中为接收了两个数据,并将两个数据的求和返回给应用 44 reply.writeInt(optFir + optSec); 45 } 46 return true; 47 } 48 } 49 ``` 50 51 524. 在DriverExtAbility.ts文件中,增加导入[DriverExtensionAbility](../reference/apis/js-apis-app-ability-driverExtensionAbility.md)的依赖包,该包提供了onInit()、onRelease()、onConnect()和onDisconnect()生命周期回调,自定义类继承[DriverExtensionAbility](../reference/apis/js-apis-app-ability-driverExtensionAbility.md)并根据需要重写需要的生命周期回调。 53 54 ```ts 55 import DriverExtensionAbility from '@ohos.app.ability.DriverExtensionAbility'; 56 import Want from '@ohos.app.ability.Want'; 57 import rpc from '@ohos.rpc'; 58 59 const TAG: string = '[Example].[Entry].[DriverExtAbility]'; 60 const REQUEST_CODE = 99; 61 62 class StubTest extends rpc.RemoteObject { 63 // ... 64 } 65 66 export default class DriverExtAbility extends DriverExtensionAbility { 67 onInit(want: Want) { 68 console.info(TAG, `onInit, want: ${want.abilityName}`); 69 } 70 71 onRelease() { 72 console.info(TAG, `onRelease`); 73 } 74 75 onConnect(want: Want) { 76 console.info(TAG, `onConnect, want: ${want.abilityName}`); 77 return new StubTest("test"); 78 } 79 80 onDisconnect(want: Want) { 81 console.info(TAG, `onDisconnect, want: ${want.abilityName}`); 82 } 83 84 onDump(params: Array<string>) { 85 console.info(TAG, `onDump, params:` + JSON.stringify(params)); 86 return ['params']; 87 } 88 } 89 ``` 90 915. 在工程Module对应的[module.json5配置文件](../quick-start/module-configuration-file.md)中注册DriverExtensionAbility,type标签需要设置为“driver”,srcEntry标签表示当前ExtensionAbility组件所对应的代码路径。 92 93 ```json 94 { 95 "module": { 96 // ... 97 "extensionAbilities": [ 98 { 99 "name": "DriverExtAbility", 100 "icon": "$media:icon", 101 "description": "driver", 102 "type": "driver", 103 "exported": true, 104 "srcEntry": "./ets/driverextability/DriverExtAbility.ts", 105 "metadata": [ 106 { 107 "name": "bus", // 必填项,所属总线 108 "value": "USB", 109 }, 110 { 111 "name": "desc", // 必填项,必要的驱动描述 112 "value": "the sample of driverExtensionAbility", 113 }, 114 { 115 "name": "vendor", // 必填项,驱动厂商名称 116 "value": "string", 117 }, 118 { 119 "name": "vid", // 支持 USB vendor id 列表,用逗号分隔,不可为空 120 "value": "string, string", 121 }, 122 { 123 "name": "pid", // 支持的 USB product id 列表,用逗号分隔,不可为空 124 "value": "string, string", 125 } 126 ] 127 } 128 ] 129 } 130 } 131 ```