1e41f4b71Sopenharmony_ci# Connecting to a ServiceExtensionAbility from the FA Model
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciThis topic describes how the three application components of the FA model connect to the ServiceExtensionAbility component of the stage model.
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci## PageAbility Accessing a ServiceExtensionAbility
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ciA PageAbility accesses a ServiceExtensionAbility in the same way as it accesses a ServiceAbility.
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci```ts
13e41f4b71Sopenharmony_ciimport featureAbility from '@ohos.ability.featureAbility';
14e41f4b71Sopenharmony_ciimport common from '@ohos.app.ability.common';
15e41f4b71Sopenharmony_ciimport Want from '@ohos.app.ability.Want';
16e41f4b71Sopenharmony_ciimport { BusinessError } from '@ohos.base';
17e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog';
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ciconst TAG: string = 'PageInterflowFaAndStage';
20e41f4b71Sopenharmony_ciconst domain: number = 0xFF00;
21e41f4b71Sopenharmony_ci
22e41f4b71Sopenharmony_ci@Entry
23e41f4b71Sopenharmony_ci@Component
24e41f4b71Sopenharmony_cistruct PageInterflowFaAndStage {
25e41f4b71Sopenharmony_ci  build() {
26e41f4b71Sopenharmony_ci    Column() {
27e41f4b71Sopenharmony_ci      // ...
28e41f4b71Sopenharmony_ci      List({ initialIndex: 0 }) {
29e41f4b71Sopenharmony_ci        ListItem() {
30e41f4b71Sopenharmony_ci          Row() {
31e41f4b71Sopenharmony_ci            // ...
32e41f4b71Sopenharmony_ci          }
33e41f4b71Sopenharmony_ci          .onClick(() => {
34e41f4b71Sopenharmony_ci            let want: Want = {
35e41f4b71Sopenharmony_ci              bundleName: 'ohos.samples.etsclock',
36e41f4b71Sopenharmony_ci              abilityName: 'MainAbility'
37e41f4b71Sopenharmony_ci            };
38e41f4b71Sopenharmony_ci            featureAbility.startAbility({ want }).then((code) => {
39e41f4b71Sopenharmony_ci              hilog.info(domain, TAG, 'Ability verify code: ' + JSON.stringify(code));
40e41f4b71Sopenharmony_ci            }).catch((error: BusinessError) => {
41e41f4b71Sopenharmony_ci              hilog.error(domain, TAG, 'Ability failed: ' + JSON.stringify(error));
42e41f4b71Sopenharmony_ci            });
43e41f4b71Sopenharmony_ci            let serviceWant: Want = {
44e41f4b71Sopenharmony_ci              bundleName: 'com.samples.stagemodelabilityinteraction',
45e41f4b71Sopenharmony_ci              abilityName: 'ServiceExtAbility'
46e41f4b71Sopenharmony_ci            };
47e41f4b71Sopenharmony_ci            let faConnect: common.ConnectOptions = {
48e41f4b71Sopenharmony_ci              onConnect: (elementName, proxy) => {
49e41f4b71Sopenharmony_ci                hilog.info(domain, TAG, "FaConnection onConnect called.");
50e41f4b71Sopenharmony_ci              },
51e41f4b71Sopenharmony_ci              onDisconnect: (elementName) => {
52e41f4b71Sopenharmony_ci                hilog.info(domain, TAG, "FaConnection onDisconnect called.");
53e41f4b71Sopenharmony_ci              },
54e41f4b71Sopenharmony_ci              onFailed: (code) => {
55e41f4b71Sopenharmony_ci                hilog.info(domain, TAG, "FaConnection onFailed code is: " + code);
56e41f4b71Sopenharmony_ci              }
57e41f4b71Sopenharmony_ci            };
58e41f4b71Sopenharmony_ci            let connectionId = featureAbility.connectAbility(serviceWant, faConnect);
59e41f4b71Sopenharmony_ci          })
60e41f4b71Sopenharmony_ci        }
61e41f4b71Sopenharmony_ci        // ...
62e41f4b71Sopenharmony_ci      }
63e41f4b71Sopenharmony_ci      // ...
64e41f4b71Sopenharmony_ci    }
65e41f4b71Sopenharmony_ci    // ...
66e41f4b71Sopenharmony_ci  }
67e41f4b71Sopenharmony_ci}
68e41f4b71Sopenharmony_ci```
69e41f4b71Sopenharmony_ci
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ci## ServiceAbility or DataAbility Accessing a ServiceExtensionAbility
72e41f4b71Sopenharmony_ci
73e41f4b71Sopenharmony_ciA ServiceAbility or DataAbility accesses a ServiceExtensionAbility in the same way as it accesses a ServiceAbility.
74e41f4b71Sopenharmony_ci
75e41f4b71Sopenharmony_ci
76e41f4b71Sopenharmony_ci```ts
77e41f4b71Sopenharmony_ciimport type common from '@ohos.app.ability.common';
78e41f4b71Sopenharmony_ciimport particleAbility from '@ohos.ability.particleAbility';
79e41f4b71Sopenharmony_ciimport type Want from '@ohos.app.ability.Want';
80e41f4b71Sopenharmony_ciimport type { BusinessError } from '@ohos.base';
81e41f4b71Sopenharmony_ciimport hilog from '@ohos.hilog';
82e41f4b71Sopenharmony_ci
83e41f4b71Sopenharmony_ciconst TAG: string = '[Sample_FAModelAbilityDevelop]';
84e41f4b71Sopenharmony_ciconst domain: number = 0xFF00;
85e41f4b71Sopenharmony_ci
86e41f4b71Sopenharmony_ciclass ServiceAbilityStartUiAbility {
87e41f4b71Sopenharmony_ci  onStart(): void {
88e41f4b71Sopenharmony_ci    // Start the UIAbility.
89e41f4b71Sopenharmony_ci    let want: Want = {
90e41f4b71Sopenharmony_ci      bundleName: 'ohos.samples.etsclock',
91e41f4b71Sopenharmony_ci      abilityName: 'MainAbility'
92e41f4b71Sopenharmony_ci    };
93e41f4b71Sopenharmony_ci    particleAbility.startAbility({ want }).then(() => {
94e41f4b71Sopenharmony_ci      hilog.info(domain, TAG, 'ServiceAbilityStartUIAbility Start Ability successfully.');
95e41f4b71Sopenharmony_ci    }).catch((error: BusinessError) => {
96e41f4b71Sopenharmony_ci      hilog.info(domain, TAG, 'ServiceAbilityStartUIAbility Ability failed: ' + JSON.stringify(error));
97e41f4b71Sopenharmony_ci    });
98e41f4b71Sopenharmony_ci
99e41f4b71Sopenharmony_ci    // Access the ServiceExtensionAbility.
100e41f4b71Sopenharmony_ci    let serviceWant: Want = {
101e41f4b71Sopenharmony_ci      bundleName: 'com.samples.stagemodelabilityinteraction',
102e41f4b71Sopenharmony_ci      abilityName: 'ServiceExtAbility'
103e41f4b71Sopenharmony_ci    };
104e41f4b71Sopenharmony_ci    let faConnect: common.ConnectOptions = {
105e41f4b71Sopenharmony_ci      onConnect: (elementName, proxy) => {
106e41f4b71Sopenharmony_ci        hilog.info(domain, TAG, 'FaConnection onConnect called.');
107e41f4b71Sopenharmony_ci      },
108e41f4b71Sopenharmony_ci      onDisconnect: (elementName) => {
109e41f4b71Sopenharmony_ci        hilog.info(domain, TAG, 'FaConnection onDisconnect called.');
110e41f4b71Sopenharmony_ci      },
111e41f4b71Sopenharmony_ci      onFailed: (code) => {
112e41f4b71Sopenharmony_ci        hilog.info(domain, TAG, 'FaConnection onFailed code is: ' + code);
113e41f4b71Sopenharmony_ci      }
114e41f4b71Sopenharmony_ci    };
115e41f4b71Sopenharmony_ci    let connectionId = particleAbility.connectAbility(serviceWant, faConnect);
116e41f4b71Sopenharmony_ci    hilog.info(domain, TAG, 'ServiceAbilityStartUIAbility ServiceAbility onStart');
117e41f4b71Sopenharmony_ci  }
118e41f4b71Sopenharmony_ci};
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ciexport default new ServiceAbilityStartUiAbility();
121e41f4b71Sopenharmony_ci```
122