• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用call事件拉起指定UIAbility到后台
2
3
4许多应用希望借助卡片的能力,实现和应用在前台时相同的功能。例如音乐卡片,卡片上提供播放、暂停等按钮,点击不同按钮将触发音乐应用的不同功能,进而提高用户的体验。在卡片中使用**postCardAction**接口的call能力,能够将卡片提供方应用的指定的UIAbility拉到后台。同时,call能力提供了调用应用指定方法、传递数据的功能,使应用在后台运行时可以通过卡片上的按钮执行不同的功能。
5
6
7通常使用按钮控件来触发call事件,示例代码如下:
8
9
10- 在卡片页面中布局两个按钮,点击其中一个按钮时调用postCardAction向指定UIAbility发送call事件,并在事件内定义需要调用的方法和传递的数据。需要注意的是,method参数为必选参数,且类型需要为string类型,用于触发UIAbility中对应的方法。
11
12  ```ts
13  @Entry
14  @Component
15  struct WidgetCard {
16    build() {
17      Column() {
18        Button('功能A')
19          .margin('20%')
20          .onClick(() => {
21            console.info('call EntryAbility funA');
22            postCardAction(this, {
23              'action': 'call',
24              'abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility
25              'params': {
26                'method': 'funA' // 在EntryAbility中调用的方法名
27              }
28            });
29          })
30
31        Button('功能B')
32          .margin('20%')
33          .onClick(() => {
34            console.info('call EntryAbility funB');
35            postCardAction(this, {
36              'action': 'call',
37              'abilityName': 'EntryAbility', // 只能跳转到当前应用下的UIAbility
38              'params': {
39                'method': 'funB', // 在EntryAbility中调用的方法名
40                'num': 1 // 需要传递的其他参数
41              }
42            });
43          })
44      }
45      .width('100%')
46      .height('100%')
47    }
48  }
49  ```
50
51- 在UIAbility中接收call事件并获取参数,根据传递的method不同,执行不同的方法。其余数据可以通过readString的方式获取。需要注意的是,UIAbility需要onCreate生命周期中监听所需的方法。
52
53  ```ts
54  import UIAbility from '@ohos.app.ability.UIAbility';
55
56  function FunACall(data) {
57    // 获取call事件中传递的所有参数
58    console.log('FunACall param:' + JSON.stringify(data.readString()));
59    return null;
60  }
61
62  function FunBCall(data) {
63    console.log('FunACall param:' + JSON.stringify(data.readString()));
64    return null;
65  }
66
67  export default class CameraAbility extends UIAbility {
68    // 如果UIAbility第一次启动,在收到call事件后会触发onCreate生命周期回调
69    onCreate(want, launchParam) {
70        try {
71            // 监听call事件所需的方法
72            this.callee.on('funA', FunACall);
73            this.callee.on('funB', FunBCall);
74        } catch (error) {
75            console.log('register failed with error. Cause: ' + JSON.stringify(error));
76        }
77    }
78
79    // 进程退出时,解除监听
80    onDestroy() {
81        try {
82            this.callee.off('funA');
83            this.callee.off('funB');
84        } catch (error) {
85            console.log('register failed with error. Cause: ' + JSON.stringify(error));
86        }
87    }
88  };
89  ```
90