• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ExtensionContext
2
3ExtensionContext是Extension的上下文环境,继承自Context。
4
5ExtensionContext模块提供访问特定Extension的资源的能力,对于拓展的Extension,可直接将ExtensionContext作为上下文环境,或者定义一个继承自ExtensionContext的类型作为上下文环境。如:ServiceExtension提供了ServiceExtensionContext,它在ExtensionContext的基础上扩展了启动、停止、绑定、解绑Ability的能力,详见[ServiceExtensionContext](js-apis-inner-application-serviceExtensionContext.md)。
6
7> **说明:**
8>
9>  - 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
10>  - 本模块接口仅可在Stage模型下使用。
11
12## 导入模块
13
14```ts
15import common from '@ohos.app.ability.common';
16```
17
18## 属性
19
20**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
21
22| 名称 | 类型 | 可读 | 可写 | 说明 |
23| -------- | -------- | -------- | -------- | -------- |
24| currentHapModuleInfo | [HapModuleInfo](js-apis-bundle-HapModuleInfo.md) | 是 | 否 | 所属Hap包的信息。<br>(详见SDK目录下的 `api\bundle\hapModuleInfo.d.ts`)  |
25| config   | [Configuration](js-apis-app-ability-configuration.md) | 是 | 否 | 所属Module的配置信息。<br>(详见SDK目录下的 `api\@ohos.app.ability.Configuration.d.ts`) |
26| extensionAbilityInfo | [ExtensionAbilityInfo](js-apis-bundleManager-extensionAbilityInfo.md) | 是 | 否 | 所属Extension的信息。<br>(详见SDK目录下的 `api\bundle\extensionAbilityInfo.d.ts`) |
27
28## 使用场景
29ExtensionContext主要用于查询所属Extension的信息、Module的配置信息以及Hap包的信息,开发者可根据自身业务需求使用对应的信息。此处以ServiceExtension为例,展示ExtensionContext的一种使用场景。
30
31**场景说明:**
32一个应用为了适配不同性能的设备,提供了highPerformance、midPerformance、lowPerformance三个Module,这三个Module均提供了一个ServiceExtension给entry使用。安装应用时,应用市场会根据设备的性能,选择对应Module的Hap包与entry的Hap包进行打包安装,实际运行应用时,entry将解析ServiceExtensionContext.HapModuleInfo获取Hap包信息,根据不同的Hap包执行不同的业务逻辑。
33
34![Example](figures/zh_cn_image_ExtensionContext_Example.png)
35
36**示例:**
37
38三个Module内都定义一个相同名称的ServiceExtension:
39```ts
40// 单例对象 GlobalContext.ts
41export class GlobalContext {
42    private constructor() {}
43    private static instance: GlobalContext;
44    private _objects = new Map<string, Object>();
45
46    public static getContext(): GlobalContext {
47        if (!GlobalContext.instance) {
48            GlobalContext.instance = new GlobalContext();
49        }
50        return GlobalContext.instance;
51    }
52
53    getObject(value: string): Object | undefined {
54        return this._objects.get(value);
55    }
56
57    setObject(key: string, objectClass: Object): void {
58        this._objects.set(key, objectClass);
59    }
60}
61```
62
63```ts
64import ServiceExtension from '@ohos.app.ability.ServiceExtensionAbility';
65import Want from '@ohos.app.ability.Want';
66import rpc from '@ohos.rpc';
67import { GlobalContext } from '../GlobalContext'
68
69export default class TheServiceExtension extends ServiceExtension {
70    onCreate(want: Want) {
71        console.log('ServiceAbility onCreate, want: ${want.abilityName}');
72        GlobalContext.getContext().setObject("ExtensionContext", this.context);
73    }
74
75    onRequest(want: Want, startId: number) {
76        console.log('ServiceAbility onRequest, want: ${want.abilityName}, startId: ${startId}');
77    }
78
79    onConnect(want: Want) {
80        console.log('ServiceAbility onConnect, want: ${want.abilityName}');
81        let remoteObject = new rpc.RemoteObject("test");
82        return remoteObject;
83    }
84
85    onDisconnect(want: Want) {
86        console.log('ServiceAbility onDisconnect, want: ${want.abilityName}');
87    }
88
89    onDestroy() {
90        console.log('ServiceAbility onDestroy');
91    }
92};
93```
94
95在entry的MainAbility的onCreate回调内启动ServiceExtension
96```ts
97import UIAbility from '@ohos.app.ability.UIAbility';
98import AbilityConstant from '@ohos.app.ability.AbilityConstant';
99import Want from '@ohos.app.ability.Want';
100
101export default class EntryAbility extends UIAbility {
102    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
103        console.log('[Demo] EntryAbility onCreate');
104        let wantExt: Want = {
105            deviceId: '',
106            bundleName: 'com.example.TheServiceExtension',
107            abilityName: 'TheServiceExtension',
108        };
109        this.context.startServiceExtensionAbility(wantExt);
110    }
111};
112```
113
114在entry内新建一个ServiceModule.ts,专用于执行业务逻辑
115```ts
116import common from '@ohos.app.ability.common';
117import { GlobalContext } from '../GlobalContext';
118
119export default class ServiceModel {
120    moduleName: string = '';
121
122    constructor() {}
123
124    executeTask() {
125        if (GlobalContext.getContext().getObject('ExtensionContext') === undefined) {
126            console.log('ERROR, ServiceExtension does not exist');
127            return;
128        }
129
130        let extensionContext = GlobalContext.getContext().getObject('ExtensionContext') as common.ServiceExtensionContext;
131        this.moduleName = extensionContext.currentHapModuleInfo.name;
132        // 根据moduleName执行不同的业务逻辑,实现对不同性能设备的区分
133        switch (this.moduleName) {
134            case 'highPerformance':
135                console.log('This is high performance device.');
136                // 执行对应业务逻辑
137                break;
138            case 'midPerformance':
139                console.log('This is mid performance device.');
140                // 执行对应业务逻辑
141                break;
142            case 'lowPerformance':
143                console.log('This is low performance device.');
144                // 执行对应业务逻辑
145                break;
146            default:
147                console.log('ERROR, invalid moduleName.');
148                break;
149        }
150    }
151};
152```
153