diff --git a/en/application-dev/ability/service-ability.md b/en/application-dev/ability/service-ability.md
new file mode 100644
index 0000000000000000000000000000000000000000..6b1556354adf1f55e937559831fe359072292345
--- /dev/null
+++ b/en/application-dev/ability/service-ability.md
@@ -0,0 +1,268 @@
+# Service Ability Development
+
+## Creating a Service Ability
+
+1. Create a child class of the **Ability** class and override the following Service ability-related lifecycle callbacks to implement your own logic for processing requests to interact with your Service ability:
+
+ - onStart()
+
+ This callback is invoked for initializing a Service ability when the Service ability is being created. This callback is invoked only once in the entire lifecycle of a Service ability. The **Want** object passed to this callback must be null.
+
+ - onCommand()
+
+ This callback is invoked every time a Service ability is created on a client. You can calculate calling statistics and perform initialization operations in this callback.
+
+ - onConnect()
+
+ This callback is invoked when another ability is connected to the Service ability. It returns an **IRemoteObject**. You can use this callback to generate a channel for the other ability to interact with the Service ability during inter-process communication (IPC). An ability can connect to the same Service ability for multiple times. When the first client is connected to a Service ability, the system calls **onConnect()** to generate an **IRemoteObject** for the Service ability, and the generated **IRemoteObject** will then be cached and used for all clients that are connected to this Service ability without having to call **onConnect()** again.
+
+ - onDisconnect()
+
+ This callback is invoked when another ability is disconnected from the Service ability.
+
+ - onStop()
+
+ This callback is invoked when a Service ability is being destroyed. You should override this callback for your Service ability to clear its resources, such as threads and registered listeners.
+
+ The following code snippet shows how to create a Service ability:
+
+ ```javascript
+ export default {
+ onStart(want) {
+ console.log('SerivceAbility onStart');
+ },
+ onCommand(want, restart, startId) {
+ console.log('SerivceAbility onCommand');
+ },
+ onConnect(want) {
+ console.log('SerivceAbility OnConnect');
+ },
+ onDisconnect() {
+ console.log('SerivceAbility OnDisConnect');
+ },
+ onStop() {
+ console.log('SerivceAbility onStop');
+ },
+ }
+ ```
+
+2. Register a Service ability.
+
+ You must declare your Service ability in the **config.json** file by setting its **type** attribute to **service**.
+
+ ```javascript
+ {
+ "module": {
+ "abilities": [
+ {
+ "name": ".ServiceAbility",
+ "type": "service",
+ "visible": true
+ ...
+ }
+ ]
+ ...
+ }
+ ...
+ }
+ ```
+
+
+
+
+## Starting and Stopping a Service Ability
+
+The **Ability** class provides the **startAbility()** method for you to start another Service ability by passing a **Want** object.
+
+To set information about the target Service ability, you can first construct a **Want** object with the **bundleName** and **abilityName** parameters specified. The meanings of the parameters are as follows:
+
+- **bundleName** indicates the name of the bundle to which the target ability belongs.
+- **abilityName** indicates the target ability name.
+
+The following code snippet shows how to start a Service ability running on the local device:
+
+```javascript
+import featureAbility from '@ohos.ability.featureability';
+var promise = await featureAbility.startAbility(
+ {
+ want:
+ {
+ bundleName: "com.jstest.serviceability",
+ abilityName: "com.jstest.serviceability.MainAbility",
+ },
+ }
+);
+```
+
+- Starting a Service ability
+
+ After the preceding code is executed, the **startAbility()** method is called to start the Service ability.
+ - If the Service ability is not running, the system calls **onStart()** to initialize the Service ability, and then calls **onCommand()** on the Service ability.
+ - If the Service ability is running, the system directly calls **onCommand()** on the Service ability.
+
+- Stopping a Service ability
+
+ Once created, the Service ability keeps running in the background. The system does not stop or destroy it unless memory resources must be reclaimed. You can call **terminateAbility()** on a Service ability to stop it or call **stopAbility()** on another ability to stop the specified Service ability.
+
+
+
+## Connecting to a Local Service Ability
+
+If you need to connect a Service ability to a Page ability or to a Service ability in another application, you must first implement the **IAbilityConnection** interface for the connection. A Service ability allows other abilities to connect to it through **connectAbility()**.
+
+When calling **connectAbility()**, you should pass a **Want** object containing information about the target Service ability and an **IAbilityConnection** object to the method. **IAbilityConnection** provides the following callbacks that you should implement: **onConnect()**, **onDisconnect()**, and **onFailed()**. The **onConnect()** callback is invoked when a Service ability is connected, **onDisconnect()** is invoked when a Service ability is unexpectedly disconnected, and **onFailed()** is invoked when a connection to a Service ability fails.
+
+The following code snippet shows how to implement the callbacks:
+
+```javascript
+var mRemote;
+function onConnectCallback(element, remote){
+ console.log('ConnectAbility onConnect Callback')
+ mRemote = remote;
+}
+
+function onDisconnectCallback(element){
+ console.log('ConnectAbility onDisconnect Callback')
+}
+
+function onFailedCallback(code){
+ console.log('ConnectAbility onFailed Callback')
+}
+```
+
+The following code snippet shows how to connect to a local Service ability:
+
+```javascript
+import featureAbility from '@ohos.ability.featureability';
+var connId = featureAbility.connectAbility(
+ {
+ bundleName: "com.jstest.serviceability",
+ abilityName: "com.jstest.serviceability.MainAbility",
+ },
+ {
+ onConnect: onConnectCallback,
+ onDisconnect: onDisconnectCallback,
+ onFailed: onFailedCallback,
+ },
+);
+```
+
+When a Service ability is connected, the **onConnect()** callback is invoked and returns an **IRemoteObject** defining the proxy used for communicating with the Service ability. OpenHarmony provides a default implementation of the **IRemoteObject** interface. You can inherit **rpc.RemoteObject** to implement your own class of **IRemoteObject**.
+
+The following code snippet shows how the Service ability instance returns itself to the calling ability:
+
+```javascript
+import rpc from "@ohos.rpc";
+
+var mMyStub;
+export default {
+ onStart(want) {
+ class MyStub extends rpc.RemoteObject{
+ constructor(des) {
+ if (typeof des === 'string') {
+ super(des);
+ }
+ return null;
+ }
+ onRemoteRequest(code, message, reply, option) {
+ }
+ }
+ mMyStub = new MyStub("ServiceAbility-test");
+ },
+ onCommand(want, restart, startId) {
+ console.log('SerivceAbility onCommand');
+ },
+ onConnect(want) {
+ console.log('SerivceAbility OnConnect');
+ return mMyStub;
+ },
+ onDisconnect() {
+ console.log('SerivceAbility OnDisConnect');
+ },
+ onStop() {
+ console.log('SerivceAbility onStop');
+ },
+}
+```
+
+## Connecting to a Remote Service Ability
+
+If you need to connect a Service ability to a Page ability on another device or to a Service ability in another application on another device, you must first implement the **IAbilityConnection** interface for the connection. A Service ability allows other abilities on another device to connect to it through **connectAbility()**.
+
+When calling **connectAbility()**, you should pass a **Want** object containing information about the target Service ability and an **IAbilityConnection** object to the method. **IAbilityConnection** provides the following callbacks that you should implement: **onConnect()**, **onDisconnect()**, and **onFailed()**. The **onConnect()** callback is invoked when a Service ability is connected, **onDisconnect()** is invoked when a Service ability is unexpectedly disconnected, and **onFailed()** is invoked when a connection to a Service ability fails.
+
+The following code snippet shows how to implement the callbacks:
+
+```javascript
+var mRemote;
+function onConnectCallback(element, remote){
+ console.log('ConnectRemoteAbility onConnect Callback')
+ mRemote = remote;
+}
+
+function onDisconnectCallback(element){
+ console.log('ConnectRemoteAbility onDisconnect Callback')
+}
+
+function onFailedCallback(code){
+ console.log('ConnectRemoteAbility onFailed Callback')
+}
+```
+
+The **Want** of the target Service ability must contain the remote **deviceId**, which can be obtained through **deviceManager**.
+
+The following code snippet shows how to connect to a remote Service ability:
+
+```javascript
+import featureAbility from '@ohos.ability.featureability';
+var connId = featureAbility.connectAbility(
+ {
+ deviceId: deviceId,
+ bundleName: "com.jstest.serviceability",
+ abilityName: "com.jstest.serviceability.MainAbility",
+ },
+ {
+ onConnect: onConnectCallback,
+ onDisconnect: onDisconnectCallback,
+ onFailed: onFailedCallback,
+ },
+);
+```
+
+When a Service ability is connected, the **onConnect()** callback is invoked and returns an **IRemoteObject** defining the proxy used for communicating with the Service ability. OpenHarmony provides a default implementation of the **IRemoteObject** interface. You can inherit **rpc.RemoteObject** to implement your own class of **IRemoteObject**.
+
+The following code snippet shows how the Service ability instance returns itself to the calling ability:
+
+```javascript
+import rpc from "@ohos.rpc";
+
+var mMyStub;
+export default {
+ onStart(want) {
+ class MyStub extends rpc.RemoteObject{
+ constructor(des) {
+ if (typeof des === 'string') {
+ super(des);
+ }
+ return null;
+ }
+ onRemoteRequest(code, message, reply, option) {
+ }
+ }
+ mMyStub = new MyStub("ServiceAbility-test");
+ },
+ onCommand(want, restart, startId) {
+ console.log('SerivceAbility onCommand');
+ },
+ onConnect(want) {
+ console.log('SerivceAbility OnConnect');
+ return mMyStub;
+ },
+ onDisconnect() {
+ console.log('SerivceAbility OnDisConnect');
+ },
+ onStop() {
+ console.log('SerivceAbility onStop');
+ },
+}
+```
diff --git a/zh-cn/application-dev/ability/service-ability.md b/zh-cn/application-dev/ability/service-ability.md
index c07488af973a97bd26dfff329436e271f92399d3..16ee1070629281cdd0dae21c54a7c85c489cd088 100644
--- a/zh-cn/application-dev/ability/service-ability.md
+++ b/zh-cn/application-dev/ability/service-ability.md
@@ -14,7 +14,7 @@
- onConnect()
- 在Ability和Service连接时调用,该方法返回IRemoteObject对象,开发者可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。
+ 在Ability和Service连接时调用,该方法返回IRemoteObject对象,开发者可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个IRemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。
- onDisconnect()