1# Stage模型启动FA模型PageAbility
2
3
4本小节介绍Stage模型的两种应用组件如何启动FA模型的PageAbility组件。
5
6
7## UIAbility启动PageAbility
8
9  UIAbility启动PageAbility和UIAbility启动UIAbility的方式完全相同。
10
11> **说明:**
12> 需注意FA模型中abilityName由bundleName + AbilityName组成,具体见示例。
13
14```ts
15import { common, Want } from '@kit.AbilityKit';
16import { hilog } from '@kit.PerformanceAnalysisKit';
17import { BusinessError } from '@kit.BasicServicesKit';
18
19const TAG: string = '[Page_StartFAModel]';
20const DOMAIN_NUMBER: number = 0xFF00;
21
22@Entry
23@Component
24struct Page_StartFAModel {
25  private context = getContext(this) as common.UIAbilityContext;
26
27  build() {
28    Column() {
29      //...
30      List({ initialIndex: 0 }) {
31        ListItem() {
32          Row() {
33            //...
34          }
35          .onClick(() => {
36            let want: Want = {
37              bundleName: 'com.samples.famodelabilitydevelop',
38              abilityName: 'com.samples.famodelabilitydevelop.MainAbility'
39            };
40            this.context.startAbility(want).then(() => {
41              hilog.info(DOMAIN_NUMBER, TAG, 'Start Ability successfully.');
42            }).catch((error: BusinessError) => {
43              hilog.error(DOMAIN_NUMBER, TAG, `Ability failed: ` + JSON.stringify(error));
44            });
45          })
46        }
47        //...
48      }
49      //...
50    }
51    //...
52  }
53}
54```
55
56
57## UIAbility访问PageAbility(startAbilityForResult)
58
59startAbilityForResult和startAbility的区别是当PageAbility销毁的时候会返回执行结果。
60
61UIAbility通过startAbilityForResult启动PageAbility与UIAbility的代码一样,没有任何区别。
62
63
64```ts
65import { common, Want } from '@kit.AbilityKit';
66import { hilog } from '@kit.PerformanceAnalysisKit';
67import { BusinessError } from '@kit.BasicServicesKit';
68import { promptAction } from '@kit.ArkUI';
69
70const TAG: string = '[Page_StartFAModel]';
71const DOMAIN_NUMBER: number = 0xFF00;
72
73@Entry
74@Component
75struct Page_StartFAModel {
76  private context = getContext(this) as common.UIAbilityContext;
77
78  build() {
79    Column() {
80      //...
81      List({ initialIndex: 0 }) {
82        ListItem() {
83          Row() {
84            //...
85          }
86          .onClick(() => {
87            let want: Want = {
88              bundleName: 'com.samples.famodelabilitydevelop',
89              abilityName: 'com.samples.famodelabilitydevelop.MainAbility',
90            };
91            this.context.startAbilityForResult(want).then((result) => {
92              hilog.info(DOMAIN_NUMBER, TAG, 'Ability verify result: ' + JSON.stringify(result));
93              if (result !== null) {
94                promptAction.showToast({
95                  message: JSON.stringify(result)
96                });
97              }
98            }).catch((error: BusinessError) => {
99              hilog.error(DOMAIN_NUMBER, TAG, `Ability failed: ` + JSON.stringify(error));
100            });
101          })
102        }
103        //...
104      }
105      //...
106    }
107    //...
108  }
109}
110```
111
112
113## ExtensionAbility启动PageAbility
114
115下面以ServiceExtensionAbility为例来说明ExtensionAbility启动PageAbility。ServiceExtensionAbility启动PageAbility和ServiceExtensionAbility启动UIAbility的方式完全相同。
116
117
118```ts
119import { Want, ServiceExtensionAbility } from '@kit.AbilityKit';
120import { hilog } from '@kit.PerformanceAnalysisKit';
121import { BusinessError } from '@kit.BasicServicesKit';
122import { rpc } from '@kit.IPCKit';
123import ServiceExtImpl from '../IdlServiceExt/idl_service_ext_impl';
124
125const TAG: string = '[ServiceExtAbility]';
126const DOMAIN_NUMBER: number = 0xFF00;
127
128export default class ServiceExtAbility extends ServiceExtensionAbility {
129  serviceExtImpl: ServiceExtImpl = new ServiceExtImpl('ExtImpl');
130
131  onCreate(want: Want): void {
132    let serviceExtensionContext = this.context;
133    hilog.info(DOMAIN_NUMBER, TAG, `onCreate, want: ${want.abilityName}`);
134  };
135
136  onRequest(want: Want, startId: number): void {
137    hilog.info(DOMAIN_NUMBER, TAG, `onRequest, want: ${want.abilityName}`);
138    if (want.parameters?.key === 'ConnectFaPageAbility') {
139      let wantFA: Want = {
140        bundleName: 'com.samples.famodelabilitydevelop',
141        abilityName: 'com.samples.famodelabilitydevelop.MainAbility',
142      };
143      this.context.startAbility(wantFA).then(() => {
144        hilog.info(DOMAIN_NUMBER, TAG, 'Start Ability successfully.');
145      }).catch((error: BusinessError) => {
146        hilog.info(DOMAIN_NUMBER, TAG, `Ability failed: ${JSON.stringify(error)}`);
147      });
148    }
149  };
150
151  onConnect(want: Want): rpc.RemoteObject {
152    hilog.info(DOMAIN_NUMBER, TAG, `onConnect, want: ${want.abilityName}`);
153    // 返回ServiceExtImpl对象,客户端获取后便可以与ServiceExtensionAbility进行通信
154    return this.serviceExtImpl as rpc.RemoteObject;
155  };
156
157  onDisconnect(want: Want): void {
158    hilog.info(DOMAIN_NUMBER, TAG, `onDisconnect, want: ${want.abilityName}`);
159  };
160
161  onDestroy(): void {
162    hilog.info(DOMAIN_NUMBER, TAG, 'onDestroy');
163  };
164}
165```
166