js-apis-inner-application-extensionContext.md 4.9 KB
Newer Older
1 2
# ExtensionContext

Y
yuyaozhi 已提交
3 4
ExtensionContext是Extension的上下文环境,继承自Context。

M
m00512953 已提交
5
ExtensionContext模块提供访问特定Extension的资源的能力,对于拓展的Extension,可直接将ExtensionContext作为上下文环境,或者定义一个继承自ExtensionContext的类型作为上下文环境。如:ServiceExtension提供了ServiceExtensionContext,它在ExtensionContext的基础上扩展了启动、停止、绑定、解绑Ability的能力,详见[ServiceExtensionContext](js-apis-inner-application-serviceExtensionContext.md)
Y
yuyaozhi 已提交
6

Y
yuyaozhi 已提交
7
> **说明:**
H
HuangXW 已提交
8
>
H
HuangXW 已提交
9 10
>  - 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
>  - 本模块接口仅可在Stage模型下使用。
11

12 13
## 属性

14 15
**系统能力**:SystemCapability.Ability.AbilityRuntime.Core

D
donglin 已提交
16
| 名称 | 类型 | 可读 | 可写 | 说明 | 
17
| -------- | -------- | -------- | -------- | -------- |
M
m00512953 已提交
18 19
| currentHapModuleInfo | [HapModuleInfo](js-apis-bundle-HapModuleInfo.md) | 是 | 否 | 所属Hap包的信息。<br>(详见SDK目录下的 `api\bundle\hapModuleInfo.d.ts`)  |
| config   | [Configuration](js-apis-app-ability-configuration.md) | 是 | 否 | 所属Module的配置信息。<br>(详见SDK目录下的 `api\@ohos.app.ability.Configuration.d.ts`) |
H
HuangXW 已提交
20
| extensionAbilityInfo | [ExtensionAbilityInfo](js-apis-bundleManager-extensionAbilityInfo.md) | 是 | 否 | 所属Extension的信息。<br>(详见SDK目录下的 `api\bundle\extensionAbilityInfo.d.ts`) |
21

H
HuangXW 已提交
22 23
## 使用场景
ExtensionContext主要用于查询所属Extension的信息、Module的配置信息以及Hap包的信息,开发者可根据自身业务需求使用对应的信息。此处以ServiceExtension为例,展示ExtensionContext的一种使用场景。
24

H
HuangXW 已提交
25 26
**场景说明:**
一个应用为了适配不同性能的设备,提供了highPerformance、midPerformance、lowPerformance三个Module,这三个Module均提供了一个ServiceExtension给entry使用。安装应用时,应用市场会根据设备的性能,选择对应Module的Hap包与entry的Hap包进行打包安装,实际运行应用时,entry将解析ServiceExtensionContext.HapModuleInfo获取Hap包信息,根据不同的Hap包执行不同的业务逻辑。
H
HuangXW 已提交
27

H
HuangXW 已提交
28 29 30 31 32
![Example](figures/zh_cn_image_ExtensionContext_Example.png)

**示例:**

三个Module内都定义一个相同名称的ServiceExtension:
M
m00512953 已提交
33
```ts
34 35 36
import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility';
import Want from '@ohos.app.ability.Want';

H
HuangXW 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
export default class TheServiceExtension extends ServiceExtension {
    onCreate(want:Want) {
        console.log('ServiceAbility onCreate, want: ' + want.abilityName);
        // 通过globalThis传递ExtensionContext给entry
        globalThis.ExtensionContext = this.context;
    }

    onRequest(want, startId) {
        console.log('ServiceAbility onRequest, want: ' + want.abilityName + ', startId: ' + startId);
    }

    onConnect(want) {
        console.log('ServiceAbility onConnect, want:' + want.abilityName);
        return null;
    }

    onDisconnect(want) {
        console.log('ServiceAbility onDisconnect, want:' + want.abilityName);
    }

    onDestroy() {
        console.log('ServiceAbility onDestroy');
    }
H
HuangXW 已提交
60
};
H
HuangXW 已提交
61 62 63
```

在entry的MainAbility的onCreate回调内启动ServiceExtension
M
m00512953 已提交
64
```ts
65 66 67
import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
H
HuangXW 已提交
68
    onCreate(want, launchParam) {
M
mingxihua 已提交
69
        console.log('[Demo] EntryAbility onCreate');
H
HuangXW 已提交
70
        let wantExt = {
M
mingxihua 已提交
71 72 73
            deviceId: '',
            bundleName: 'com.example.TheServiceExtension',
            abilityName: 'TheServiceExtension',
H
HuangXW 已提交
74 75 76 77 78 79 80
        };
        this.context.startServiceExtensionAbility(wantExt);
    }
};
```

在entry内新建一个ServiceModule.ts,专用于执行业务逻辑
M
m00512953 已提交
81
```ts
H
HuangXW 已提交
82 83 84 85 86 87
export default class ServiceModel {
    moduleName: string;

    constructor() {}

    executeTask() {
M
mingxihua 已提交
88 89
        if (globalThis.ExtensionContext === undefined) {
            console.log('ERROR, ServiceExtension does not exist');
H
HuangXW 已提交
90 91 92
            return;
        }

M
mingxihua 已提交
93
        let moduleInfo = globalThis.ExtensionContext.currentHapModuleInfo;
H
HuangXW 已提交
94 95 96
        this.moduleName = moduleInfo.name;
        // 根据moduleName执行不同的业务逻辑,实现对不同性能设备的区分
        switch (this.moduleName) {
M
mingxihua 已提交
97 98
            case 'highPerformance':
                console.log('This is high performance device.');
H
HuangXW 已提交
99 100
                // 执行对应业务逻辑
                break;
M
mingxihua 已提交
101 102
            case 'midPerformance':
                console.log('This is mid performance device.');
H
HuangXW 已提交
103 104
                // 执行对应业务逻辑
                break;
M
mingxihua 已提交
105 106
            case 'lowPerformance':
                console.log('This is low performance device.');
H
HuangXW 已提交
107 108 109
                // 执行对应业务逻辑
                break;
            default:
M
mingxihua 已提交
110
                console.log('ERROR, invalid moduleName.');
H
HuangXW 已提交
111 112 113
                break;
        }
    }
H
HuangXW 已提交
114
};
H
HuangXW 已提交
115
```