未验证 提交 3365fd21 编写于 作者: O openharmony_ci 提交者: Gitee

!5185 ServiceAbility里添加IDL自动生成方式说明

Merge pull request !5185 from 刘宝/master
...@@ -121,115 +121,126 @@ let promise = featureAbility.startAbility( ...@@ -121,115 +121,126 @@ let promise = featureAbility.startAbility(
如果Service需要与Page Ability或其他应用的Service Ability进行交互,则须创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行连接。 如果Service需要与Page Ability或其他应用的Service Ability进行交互,则须创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行连接。
在使用connectAbility()处理回调时,需要传入目标Service的Want与IAbilityConnection的实例。IAbilityConnection提供了以下方法供开发者实现:onConnect()是用来处理连接Service成功的回调,onDisconnect()是用来处理Service异常死亡的回调,onFailed()是用来处理连接Service失败的回调。
创建连接本地Service回调实例的代码示例如下: 开发者可使用如下两种方式实现连接Service。
```javascript 1. 使用IDL自动生成代码
import prompt from '@system.prompt'
let mRemote; 使用OpenHarmony IDL(OpenHarmony Interface Definition Language)来自动生成对应客户端服务端及IRemoteObject代码,具体示例代码和说明请参考:
function onConnectCallback(element, remote){
console.log('onConnectLocalService onConnectDone element: ' + element); - [`OpenHarmony IDL`:TS开发步骤](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/IDL/idl-guidelines.md#32-ts开发步骤)
console.log('onConnectLocalService onConnectDone remote: ' + remote);
mRemote = remote; 2. 在对应文件编写代码
if (mRemote == null) {
prompt.showToast({ 在使用connectAbility()处理回调时,需要传入目标Service的Want与IAbilityConnection的实例。IAbilityConnection提供了以下方法供开发者实现:onConnect()是用来处理连接Service成功的回调,onDisconnect()是用来处理Service异常死亡的回调,onFailed()是用来处理连接Service失败的回调。
message: "onConnectLocalService not connected yet"
}); 创建连接本地Service回调实例的代码示例如下:
return;
} ```javascript
let option = new rpc.MessageOption(); import prompt from '@system.prompt'
let data = new rpc.MessageParcel();
let reply = new rpc.MessageParcel(); let mRemote;
data.writeInt(1); function onConnectCallback(element, remote){
data.writeInt(99); console.log('onConnectLocalService onConnectDone element: ' + element);
mRemote.sendRequest(1, data, reply, option).then((result) => { console.log('onConnectLocalService onConnectDone remote: ' + remote);
console.log('sendRequest success'); mRemote = remote;
let msg = reply.readInt(); if (mRemote == null) {
prompt.showToast({ prompt.showToast({
message: "onConnectLocalService connect result: " + msg, message: "onConnectLocalService not connected yet"
duration: 3000 });
return;
}
let option = new rpc.MessageOption();
let data = new rpc.MessageParcel();
let reply = new rpc.MessageParcel();
data.writeInt(1);
data.writeInt(99);
mRemote.sendRequest(1, data, reply, option).then((result) => {
console.log('sendRequest success');
let msg = reply.readInt();
prompt.showToast({
message: "onConnectLocalService connect result: " + msg,
duration: 3000
});
}).catch((e) => {
console.log('sendRequest error:' + e);
}); });
}).catch((e) => {
console.log('sendRequest error:' + e);
});
} }
function onDisconnectCallback(element){ function onDisconnectCallback(element){
console.log('ConnectAbility onDisconnect Callback') console.log('ConnectAbility onDisconnect Callback')
} }
function onFailedCallback(code){ function onFailedCallback(code){
console.log('ConnectAbility onFailed Callback') console.log('ConnectAbility onFailed Callback')
} }
``` ```
连接本地Service的代码示例如下: 连接本地Service的代码示例如下:
```javascript ```javascript
import featureAbility from '@ohos.ability.featureAbility'; import featureAbility from '@ohos.ability.featureAbility';
let connId = featureAbility.connectAbility( let connId = featureAbility.connectAbility(
{ {
bundleName: "com.jstest.service", bundleName: "com.jstest.service",
abilityName: "com.jstest.service.ServiceAbility", abilityName: "com.jstest.service.ServiceAbility",
}, },
{ {
onConnect: onConnectCallback, onConnect: onConnectCallback,
onDisconnect: onDisconnectCallback, onDisconnect: onDisconnectCallback,
onFailed: onFailedCallback, onFailed: onFailedCallback,
}, },
); );
``` ```
同时,Service侧也需要在onConnect()时返回IRemoteObject,从而定义与Service进行通信的接口。onConnect()需要返回一个IRemoteObject对象。OpenHarmony提供了IRemoteObject的默认实现,开发者可以通过继承rpc.RemoteObject来创建自定义的实现类。 同时,Service侧也需要在onConnect()时返回IRemoteObject,从而定义与Service进行通信的接口。onConnect()需要返回一个IRemoteObject对象。OpenHarmony提供了IRemoteObject的默认实现,开发者可以通过继承rpc.RemoteObject来创建自定义的实现类。
Service侧把自身的实例返回给调用侧的代码示例如下: Service侧把自身的实例返回给调用侧的代码示例如下:
```javascript ```javascript
import rpc from "@ohos.rpc"; import rpc from "@ohos.rpc";
let mMyStub; let mMyStub;
export default { export default {
onStart() { onStart() {
class MyStub extends rpc.RemoteObject{ class MyStub extends rpc.RemoteObject{
constructor(des) { constructor(des) {
if (typeof des === 'string') { if (typeof des === 'string') {
super(des); super(des);
}
return null;
} }
return null; onRemoteRequest(code, data, reply, option) {
} console.log("ServiceAbility onRemoteRequest called");
onRemoteRequest(code, data, reply, option) { if (code === 1) {
console.log("ServiceAbility onRemoteRequest called"); let op1 = data.readInt();
if (code === 1) { let op2 = data.readInt();
let op1 = data.readInt(); console.log("op1 = " + op1 + ", op2 = " + op2);
let op2 = data.readInt(); reply.writeInt(op1 + op2);
console.log("op1 = " + op1 + ", op2 = " + op2); } else {
reply.writeInt(op1 + op2); console.log("ServiceAbility unknown request code");
} else { }
console.log("ServiceAbility unknown request code"); return true;
} }
return true;
} }
} mMyStub = new MyStub("ServiceAbility-test");
mMyStub = new MyStub("ServiceAbility-test"); },
}, onCommand(want, startId) {
onCommand(want, startId) { console.log('ServiceAbility onCommand');
console.log('ServiceAbility onCommand'); },
}, onConnect(want) {
onConnect(want) { console.log('ServiceAbility OnConnect');
console.log('ServiceAbility OnConnect'); return mMyStub;
return mMyStub; },
}, onDisconnect(want) {
onDisconnect(want) { console.log('ServiceAbility OnDisConnect');
console.log('ServiceAbility OnDisConnect'); },
}, onStop() {
onStop() { console.log('ServiceAbility onStop');
console.log('ServiceAbility onStop'); },
}, }
} ```
```
### 连接远程Service<a name="section126857614019"></a>(当前仅对系统应用开放) ### 连接远程Service<a name="section126857614019"></a>(当前仅对系统应用开放)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册