• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 启动指定页面
2
3
4当PageAbility的启动模式设置为单例时(具体设置方法和典型场景示例见[PageAbility的启动模式](pageability-launch-type.md),缺省情况下是单实例模式),若PageAbility已被拉起,再次启动PageAbility会触发onNewWant回调(即非首次拉起)。应用开发者可以通过want传递启动参数,例如开发者希望指定页面启动PageAbility,可以通过want中的parameters参数传递pages信息,具体示例代码如下:
5
6
7调用方PageAbility的app.ets中或者page中,使用startAbility再次拉起PageAbility,通过want中的uri参数传递页面信息:
8
9```ts
10import featureAbility from '@ohos.ability.featureAbility';
11import Want from '@ohos.app.ability.Want';
12
13async function restartAbility() {
14    let wantInfo: Want = {
15        bundleName: "com.sample.MyApplication",
16        abilityName: "EntryAbility",
17        parameters: {
18            page: "pages/second"
19        }
20    };
21    featureAbility.startAbility({
22        want: wantInfo
23    }).then((data) => {
24        console.info('restartAbility success.');
25    });
26}
27```
28
29
30在目标端PageAbility的onNewWant回调中获取包含页面信息的want参数:
31
32```ts
33// GlobalContext.ts 构造单例对象
34export class GlobalContext {
35  private constructor() {}
36  private static instance: GlobalContext;
37  private _objects = new Map<string, Object>();
38
39  public static getContext(): GlobalContext {
40    if (!GlobalContext.instance) {
41      GlobalContext.instance = new GlobalContext();
42    }
43    return GlobalContext.instance;
44  }
45
46  getObject(value: string): Object | undefined {
47    return this._objects.get(value);
48  }
49
50  setObject(key: string, objectClass: Object): void {
51    this._objects.set(key, objectClass);
52  }
53}
54```
55
56```ts
57import Want from '@ohos.application.Want';
58import { GlobalContext } from './GlobalContext';
59
60class EntryAbility {
61  onNewWant(want: Want) {
62    GlobalContext.getContext().setObject("newWant", want);
63  }
64}
65
66export default new EntryAbility()
67```
68
69
70在目标端页面的自定义组件中获取包含页面信息的want参数并根据uri做路由处理:
71
72```ts
73import Want from '@ohos.application.Want';
74import router from '@ohos.router';
75import { GlobalContext } from '../GlobalContext';
76
77@Entry
78@Component
79struct Index {
80  @State message: string = 'Router Page'
81
82  onPageShow() {
83    console.info('Index onPageShow')
84    let newWant = GlobalContext.getContext().getObject("newWant") as Want
85    if (newWant.parameters) {
86      if (newWant.parameters.page) {
87        router.push({ url: newWant.parameters.page });
88        GlobalContext.getContext().setObject("newWant", undefined)
89      }
90    }
91  }
92
93  build() {
94    Row() {
95      Column() {
96        Text(this.message)
97          .fontSize(50)
98          .fontWeight(FontWeight.Bold)
99      }
100      .width('100%')
101    }
102    .height('100%')
103  }
104}
105```
106
107
108当PageAbility的启动模式设置为多实例模式或为首次启动单例模式的PageAbility时(具体设置方法和典型场景示例见[PageAbility的启动模式](pageability-launch-type.md)),在调用方PageAbility中,通过want中的parameters参数传递要启动的指定页面的pages信息,调用startAbility()方法启动PageAbility。被调用方可以在onCreate中使用featureAbility的getWant方法获取want,再通过调用router.push实现启动指定页面。
109
110
111调用方的页面中实现按钮点击触发startAbility方法启动目标端PageAbility,startAbility方法的入参want中携带指定页面信息,示例代码如下:
112
113```ts
114import featureAbility from '@ohos.ability.featureAbility';
115import { BusinessError } from '@ohos.base';
116
117@Entry
118@Component
119struct Index {
120  @State message: string = 'Hello World'
121
122  build() {
123    Row() {
124      Button("startAbility")
125        .onClick(() => {
126          featureAbility.startAbility({
127            want: {
128              bundleName: "com.exm.myapplication",
129              abilityName: "com.exm.myapplication.EntryAbility",
130              parameters: { page: "pages/page1" }
131            }
132          }).then((data) => {
133            console.info("startAbility finish");
134          }).catch((err: BusinessError) => {
135            console.info("startAbility failed errcode:" + err.code)
136          })
137        })
138      ...
139      Button("page2")
140        .onClick(() => {
141          featureAbility.startAbility({
142            want: {
143              bundleName: "com.exm.myapplication",
144              abilityName: "com.exm.myapplication.EntryAbility",
145              parameters: { page: "pages/page2" }
146            }
147          }).then((data) => {
148            console.info("startAbility finish");
149          }).catch((err: BusinessError) => {
150            console.info("startAbility failed errcode:" + err.code)
151          })
152        })
153      ...
154    }
155    ...
156  }
157}
158```
159
160
161目标端PageAbility的onCreate生命周期回调中通过featureAbility的getWant方法获取want,并对参数进行解析,实现指定页面拉起:
162
163```ts
164import featureAbility from '@ohos.ability.featureAbility';
165import router from '@ohos.router';
166import { BusinessError } from '@ohos.base';
167
168class EntryAbility {
169  onCreate() {
170    featureAbility.getWant().then((want) => {
171      if (want.parameters) {
172        if (want.parameters.page) {
173          router.pushUrl({
174            url: want.parameters.page as string
175          }, (error: BusinessError)=>{
176            console.error(`error: ${JSON.stringify(error)}`);
177          })
178        }
179      }
180    })
181  }
182  onDestroy() {
183    // ...
184  }
185}
186
187export default new EntryAbility()
188```
189