未验证 提交 d7a60652 编写于 作者: O openharmony_ci 提交者: Gitee

!23368 元能力文档示例代码ArkTS规范整改

Merge pull request !23368 from liuliu/codecheck
......@@ -215,53 +215,47 @@ export default class IdlTestServiceStub extends rpc.RemoteObject implements IIdl
super(des);
}
async onRemoteMessageRequest(code: number, data, reply, option): Promise<boolean> {
async onRemoteMessageRequest(code: number, data: rpc.MessageSequence, reply: rpc.MessageSequence,
option: rpc.MessageOption): Promise<boolean> {
console.log("onRemoteMessageRequest called, code = " + code);
switch(code) {
case IdlTestServiceStub.COMMAND_TEST_INT_TRANSACTION: {
let _data = data.readInt();
this.testIntTransaction(_data, (errCode, returnValue) => {
reply.writeInt(errCode);
if (errCode == 0) {
reply.writeInt(returnValue);
}
});
return true;
}
case IdlTestServiceStub.COMMAND_TEST_STRING_TRANSACTION: {
let _data = data.readString();
this.testStringTransaction(_data, (errCode) => {
reply.writeInt(errCode);
});
return true;
}
case IdlTestServiceStub.COMMAND_TEST_MAP_TRANSACTION: {
let _data = new Map();
let _dataSize = data.readInt();
for (let i = 0; i < _dataSize; ++i) {
let key = data.readInt();
let value = data.readInt();
_data.set(key, value);
if (code == IdlTestServiceStub.COMMAND_TEST_INT_TRANSACTION) {
let _data = data.readInt();
this.testIntTransaction(_data, (errCode: number, returnValue: number) => {
reply.writeInt(errCode);
if (errCode == 0) {
reply.writeInt(returnValue);
}
this.testMapTransaction(_data, (errCode) => {
reply.writeInt(errCode);
});
return true;
}
case IdlTestServiceStub.COMMAND_TEST_ARRAY_TRANSACTION: {
let _data = data.readStringArray();
this.testArrayTransaction(_data, (errCode, returnValue) => {
reply.writeInt(errCode);
if (errCode == 0) {
reply.writeInt(returnValue);
}
});
return true;
}
default: {
console.log("invalid request code" + code);
break;
});
return true;
} else if (code == IdlTestServiceStub.COMMAND_TEST_STRING_TRANSACTION) {
let _data = data.readString();
this.testStringTransaction(_data, (errCode: number) => {
reply.writeInt(errCode);
});
return true;
} else if (code == IdlTestServiceStub.COMMAND_TEST_MAP_TRANSACTION) {
let _data: Map<number, number> = new Map();
let _dataSize = data.readInt();
for (let i = 0; i < _dataSize; ++i) {
let key = data.readInt();
let value = data.readInt();
_data.set(key, value);
}
this.testMapTransaction(_data, (errCode: number) => {
reply.writeInt(errCode);
});
return true;
} else if (code == IdlTestServiceStub.COMMAND_TEST_ARRAY_TRANSACTION) {
let _data = data.readStringArray();
this.testArrayTransaction(_data, (errCode: number, returnValue: number) => {
reply.writeInt(errCode);
if (errCode == 0) {
reply.writeInt(returnValue);
}
});
return true;
} else {
console.log("invalid request code" + code);
}
return false;
}
......@@ -312,17 +306,20 @@ class IdlTestImp extends IdlTestServiceStub {
在服务实现接口后,需要向客户端公开该接口,以便客户端进程绑定。如果开发者的服务要公开该接口,请扩展Ability并实现onConnect()从而返回IRemoteObject,以便客户端能与服务进程交互。服务端向客户端公开IRemoteAbility接口的代码示例如下:
```ts
export default {
import Want from '@ohos.app.ability.Want';
import rpc from "@ohos.rpc";
export default class ServiceAbility {
onStart() {
console.info('ServiceAbility onStart');
},
};
onStop() {
console.info('ServiceAbility onStop');
},
onCommand(want, startId) {
};
onCommand(want: Want, startId: number) {
console.info('ServiceAbility onCommand');
},
onConnect(want) {
};
onConnect(want: Want) {
console.info('ServiceAbility onConnect');
try {
console.log('ServiceAbility want:' + typeof(want));
......@@ -332,9 +329,9 @@ export default {
console.log('ServiceAbility error:' + err)
}
console.info('ServiceAbility onConnect end');
return new IdlTestImp('connect');
},
onDisconnect(want) {
return new IdlTestImp('connect') as rpc.RemoteObject;
};
onDisconnect(want: Want) {
console.info('ServiceAbility onDisconnect');
console.info('ServiceAbility want:' + JSON.stringify(want));
}
......@@ -346,6 +343,8 @@ export default {
客户端调用connectServiceExtensionAbility()以连接服务时,客户端的onAbilityConnectDone中的onConnect回调会接收服务的onConnect()方法返回的IRemoteObject实例。由于客户端和服务在不同应用内,所以客户端应用的目录内必须包含.idl文件(SDK工具会自动生成Proxy代理类)的副本。客户端的onAbilityConnectDone中的onConnect回调会接收服务的onConnect()方法返回的IRemoteObject实例,使用IRemoteObject创建IdlTestServiceProxy类的实例对象testProxy,然后调用相关IPC方法。示例代码如下:
```ts
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
import IdlTestServiceProxy from './idl_test_service_proxy'
function callbackTestIntTransaction(result: number, ret: number): void {
......@@ -372,10 +371,10 @@ function callbackTestArrayTransaction(result: number, ret: number): void {
}
}
var onAbilityConnectDone = {
onConnect:function (elementName, proxy) {
let testProxy = new IdlTestServiceProxy(proxy);
let testMap = new Map();
let onAbilityConnectDone: common.ConnectOptions = {
onConnect: (elementName, proxy) => {
let testProxy: IdlTestServiceProxy = new IdlTestServiceProxy(proxy);
let testMap: Map<number, number> = new Map();
testMap.set(1, 1);
testMap.set(1, 2);
testProxy.testIntTransaction(123, callbackTestIntTransaction);
......@@ -383,21 +382,23 @@ var onAbilityConnectDone = {
testProxy.testMapTransaction(testMap, callbackTestMapTransaction);
testProxy.testArrayTransaction(['1','2'], callbackTestMapTransaction);
},
onDisconnect:function (elementName) {
onDisconnect: (elementName) => {
console.log('onDisconnectService onDisconnect');
},
onFailed:function (code) {
onFailed: (code) => {
console.log('onDisconnectService onFailed');
}
};
let context: common.UIAbilityContext = this.context;
function connectAbility(): void {
let want = {
let want: Want = {
bundleName: 'com.example.myapplicationidl',
abilityName: 'com.example.myapplicationidl.ServiceAbility'
};
let connectionId = -1;
connectionId = this.context.connectServiceExtensionAbility(want, onAbilityConnectDone);
connectionId = context.connectServiceExtensionAbility(want, onAbilityConnectDone);
}
......@@ -427,18 +428,18 @@ export default class MySequenceable {
getString() : string {
return this.str;
}
marshalling(messageParcel) {
marshalling(messageParcel: rpc.MessageSequence) {
messageParcel.writeInt(this.num);
messageParcel.writeString(this.str);
return true;
}
unmarshalling(messageParcel) {
unmarshalling(messageParcel: rpc.MessageSequence) {
this.num = messageParcel.readInt();
this.str = messageParcel.readString();
return true;
}
private num;
private str;
private num: number;
private str: string;
}
```
......
......@@ -47,23 +47,23 @@
```ts
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
import { BusinessError } from '@ohos.base';
function implicitStartAbility() {
let context = getContext(this) as common.UIAbilityContext;
let wantInfo = {
// uncomment line below if wish to implicitly query only in the specific bundle.
// bundleName: 'com.example.myapplication',
'action': 'ohos.want.action.viewData',
// entities can be omitted.
'entities': ['entity.system.browsable'],
'uri': 'https://www.test.com:8080/query/student'
}
context.startAbility(wantInfo).then(() => {
...
}).catch((err) => {
...
})
let context = getContext(this) as common.UIAbilityContext;
let wantInfo: Want = {
// uncomment line below if wish to implicitly query only in the specific bundle.
// bundleName: 'com.example.myapplication',
'action': 'ohos.want.action.viewData',
// entities can be omitted.
'entities': ['entity.system.browsable'],
'uri': 'https://www.test.com:8080/query/student'
}
context.startAbility(wantInfo).then(() => {
// ...
}).catch((err: BusinessError) => {
// ...
})
```
匹配过程分析:
......
......@@ -18,12 +18,13 @@ DevEco Studio默认工程中未自动生成AbilityStage,如需要使用Ability
```ts
import AbilityStage from '@ohos.app.ability.AbilityStage';
import Want from '@ohos.app.ability.Want';
export default class MyAbilityStage extends AbilityStage {
onCreate() {
// 应用的HAP在首次加载的时,为该Module初始化操作
}
onAcceptWant(want) {
onAcceptWant(want: Want) {
// 仅specified模式下触发
return "MyAbilityStage";
}
......@@ -58,9 +59,10 @@ DevEco Studio默认工程中未自动生成AbilityStage,如需要使用Ability
```ts
import AbilityStage from '@ohos.app.ability.AbilityStage';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
export default class MyAbilityStage extends AbilityStage {
onMemoryLevel(level) {
onMemoryLevel(level: AbilityConstant.MemoryLevel) {
// 根据系统可用内存的变化情况,释放不必要的内存
}
}
......
......@@ -32,10 +32,13 @@
2. 构建数据库相关的RDB数据。
```ts
let valuesBucket = {"name": "gaolu"}
import ohos_data_ability from '@ohos.data.dataAbility'
import rdb from '@ohos.data.rdb'
let valuesBucket: rdb.ValuesBucket = {"name": "gaolu"}
let da = new ohos_data_ability.DataAbilityPredicates()
let valArray =new Array("value1");
let cars = new Array({"batchInsert1" : "value1",});
let valArray = new Array("value1");
let cars = new Array({"batchInsert1" : "value1",} as rdb.ValuesBucket);
```
注:关于DataAbilityPredicates的详细内容,请参考[DataAbility谓词](../reference/apis/js-apis-data-ability.md)
......@@ -43,11 +46,13 @@
3. 调用insert方法向指定的DataAbility子模块插入数据。
```ts
import { BusinessError } from '@ohos.base';
// callback方式调用:
DAHelper.insert(
urivar,
valuesBucket,
(error, data) => {
(error: BusinessError, data: number) => {
console.info("DAHelper insert result: " + data)
}
);
......@@ -55,10 +60,15 @@
```ts
import featureAbility from '@ohos.ability.featureAbility'
import { BusinessError } from '@ohos.base';
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// promise方式调用(await需要在async方法中使用):
let datainsert = await DAHelper.insert(urivar, valuesBucket).then((data) => {
console.info("insert success.");
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error("insert failed.");
});
```
......@@ -66,6 +76,10 @@
4. 调用delete方法删除DataAbility子模块中指定的数据。
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// callback方式调用:
DAHelper.delete(
urivar,
......@@ -78,6 +92,10 @@
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// promise方式调用(await需要在async方法中使用):
let datadelete = await DAHelper.delete(
urivar,
......@@ -88,6 +106,10 @@
5. 调用update方法更新指定DataAbility子模块中的数据。
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// callback方式调用:
DAHelper.update(
urivar,
......@@ -101,6 +123,10 @@
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// promise方式调用(await需要在async方法中使用):
let dataupdate = await DAHelper.update(
urivar,
......@@ -112,6 +138,10 @@
6. 调用query方法在指定的DataAbility子模块中查找数据。
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// callback方式调用:
DAHelper.query(
urivar,
......@@ -125,6 +155,10 @@
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// promise方式调用(await需要在async方法中使用):
let dataquery = await DAHelper.query(
urivar,
......@@ -136,6 +170,10 @@
7. 调用batchInsert方法向指定的DataAbility子模块批量插入数据。
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// callback方式调用:
DAHelper.batchInsert(
urivar,
......@@ -148,6 +186,10 @@
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// promise方式调用(await需要在async方法中使用):
let databatchInsert = await DAHelper.batchInsert(
urivar,
......@@ -158,6 +200,10 @@
8. 调用executeBatch方法向指定的DataAbility子模块进行数据的批量处理。
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// callback方式调用:
DAHelper.executeBatch(
urivar,
......@@ -168,7 +214,7 @@
valuesBucket: {"executeBatch" : "value1",},
predicates: da,
expectedCount:0,
predicatesBackReferences: null,
predicatesBackReferences: undefined,
interrupted:true,
}
],
......@@ -180,6 +226,10 @@
```ts
import featureAbility from '@ohos.ability.featureAbility'
let urivar = "dataability:///com.ix.DataAbility"
let DAHelper = featureAbility.acquireDataAbilityHelper(urivar);
// promise方式调用(await需要在async方法中使用):
let dataexecuteBatch = await DAHelper.executeBatch(
urivar,
......@@ -193,7 +243,7 @@
},
predicates: da,
expectedCount:0,
predicatesBackReferences: null,
predicatesBackReferences: undefined,
interrupted:true,
}
]
......
......@@ -11,15 +11,16 @@ startAbility接口由FA模型切换到Stage模型的示例:
```ts
import fa from '@ohos.ability.featureAbility';
let parameter = {
import { BusinessError } from '@ohos.base';
fa.startAbility({
"want": {
bundleName: "com.example.myapplication",
abilityName: "com.example.myapplication.EntryAbility"
}
}
fa.startAbility(parameter).then((data) => {
}).then((data) => {
console.info('startAbility success');
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error('startAbility failed.');
})
```
......@@ -27,15 +28,17 @@ startAbility接口由FA模型切换到Stage模型的示例:
- Stage示例示例
```ts
import Want from '@ohos.app.ability.Want';
// context为Ability对象的成员,在非Ability对象内部调用需要
// 将Context对象传递过去
let wantInfo = {
let wantInfo: Want = {
bundleName: "com.example.myapplication",
abilityName: "EntryAbility"
};
this.context.startAbility(wantInfo).then((data) => {
this.context.startAbility(wantInfo).then(() => {
console.info('startAbility success.');
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error('startAbility failed.');
})
```
......@@ -17,6 +17,8 @@ import featureAbility from "@ohos.ability.featureAbility";
```ts
import featureAbility from "@ohos.ability.featureAbility";
let context = featureAbility.getContext()
```
......@@ -28,39 +30,35 @@ let context = featureAbility.getContext()
1. 查询Bundle信息。
```ts
import featureAbility from '@ohos.ability.featureAbility'
export default {
onCreate() {
// 获取context并调用相关方法
let context = featureAbility.getContext();
context.getBundleName((data, bundleName)=>{
console.info("ability bundleName:" + bundleName)
});
console.info('Application onCreate')
},
onDestroy() {
console.info('Application onDestroy')
},
}
import featureAbility from '@ohos.ability.featureAbility'
export function onCreate() {
// 获取context并调用相关方法
let context = featureAbility.getContext();
context.getBundleName((data, bundleName)=>{
console.info("ability bundleName:" + bundleName)
});
console.info('Application onCreate')
}
export function onDestroy() {
console.info('Application onDestroy')
}
```
2. 设置当前featureAbility的显示方向。
```ts
import featureAbility from '@ohos.ability.featureAbility'
import bundleManager from '@ohos.bundle.bundleManager';
export default {
onCreate() {
// 获取context并调用相关方法
let context = featureAbility.getContext();
context.setDisplayOrientation(bundleManager.DisplayOrientation.LANDSCAPE).then(() => {
console.info("Set display orientation.")
})
console.info('Application onCreate')
},
onDestroy() {
console.info('Application onDestroy')
},
}
import featureAbility from '@ohos.ability.featureAbility'
import bundleManager from '@ohos.bundle.bundleManager';
export function onCreate() {
// 获取context并调用相关方法
let context = featureAbility.getContext();
context.setDisplayOrientation(bundleManager.DisplayOrientation.LANDSCAPE).then(() => {
console.info("Set display orientation.")
})
console.info('Application onCreate')
}
export function onDestroy() {
console.info('Application onDestroy')
}
```
......@@ -16,8 +16,10 @@
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
let uiAbilityContext = this.context;
...
}
......@@ -31,8 +33,9 @@
```ts
import ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility';
import Want from '@ohos.app.ability.Want';
export default class MyService extends ServiceExtensionAbility {
onCreate(want) {
onCreate(want: Want) {
let serviceExtensionContext = this.context;
...
}
......@@ -53,8 +56,10 @@
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
let applicationContext = this.context.getApplicationContext();
...
}
......@@ -96,9 +101,11 @@
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
let applicationContext = this.context.getApplicationContext();
let cacheDir = applicationContext.cacheDir;
let tempDir = applicationContext.tempDir;
......@@ -131,9 +138,11 @@
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
let cacheDir = this.context.cacheDir;
let tempDir = this.context.tempDir;
let filesDir = this.context.filesDir;
......@@ -167,9 +176,11 @@
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import contextConstant from '@ohos.app.ability.contextConstant';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
// 存储普通信息前,切换到EL1设备级加密
if (this.context.area === contextConstant.AreaMode.EL2) { // 获取area
this.context.area = contextConstant.AreaMode.EL1; // 修改area
......@@ -203,9 +214,11 @@ export default class EntryAbility extends UIAbility {
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
let bundleName2 = 'com.example.application';
let context2 = this.context.createBundleContext(bundleName2);
let label2 = context2.applicationInfo.label;
......@@ -225,9 +238,11 @@ export default class EntryAbility extends UIAbility {
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
let bundleName2 = 'com.example.application';
let moduleName2 = 'module1';
let context2 = this.context.createModuleContext(bundleName2, moduleName2);
......@@ -240,9 +255,11 @@ export default class EntryAbility extends UIAbility {
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
let moduleName2 = 'module1';
let context2 = this.context.createModuleContext(moduleName2);
...
......@@ -260,17 +277,20 @@ export default class EntryAbility extends UIAbility {
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import AbilityLifecycleCallback from '@ohos.app.ability.AbilityLifecycleCallback';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';
const TAG: string = '[Example].[Entry].[EntryAbility]';
export default class EntryAbility extends UIAbility {
// 定义生命周期ID
lifecycleId: number;
lifecycleId: number = -1;
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
// 定义生命周期回调对象
let abilityLifecycleCallback = {
let abilityLifecycleCallback: AbilityLifecycleCallback = {
// 当UIAbility创建时被调用
onAbilityCreate(uiAbility) {
console.info(TAG, `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
......
......@@ -11,29 +11,33 @@ UIAbility关联访问ServiceAbility和UIAbility关联访问ServiceExtensionAbili
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
console.info("EntryAbility onCreate");
}
onDestroy() {
console.info("EntryAbility onDestroy")
}
onWindowStageCreate(windowStage) {
onWindowStageCreate(windowStage: window.WindowStage) {
console.info("EntryAbility onWindowStageCreate")
let want = {
let want: Want = {
bundleName: "com.ohos.fa",
abilityName: "ServiceAbility",
};
let options = {
onConnect:function (elementName, proxy) {
let options: common.ConnectOptions = {
onConnect: (elementName, proxy) => {
console.info("onConnect called.");
},
onDisconnect:function (elementName) {
onDisconnect: (elementName) => {
console.info("onDisconnect called.");
},
onFailed:function (code) {
onFailed: (code) => {
console.info("onFailed code is: " + code);
}
};
......@@ -58,29 +62,31 @@ export default class EntryAbility extends UIAbility {
```ts
import Extension from '@ohos.app.ability.ServiceExtensionAbility'
import Extension from '@ohos.app.ability.ServiceExtensionAbility';
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
export default class ServiceExtension extends Extension {
onCreate(want) {
onCreate(want: Want) {
console.info("ServiceExtension onCreate")
}
onDestroy() {
console.info("ServiceExtension onDestroy")
}
onRequest(want, startId) {
onRequest(want: Want, startId: number) {
console.info("ServiceExtension onRequest")
let wantFA = {
let wantFA: Want = {
bundleName: "com.ohos.fa",
abilityName: "ServiceAbility",
};
let options = {
onConnect:function (elementName, proxy) {
let options: common.ConnectOptions = {
onConnect: (elementName, proxy) => {
console.info("onConnect called.");
},
onDisconnect:function (elementName) {
onDisconnect: (elementName) => {
console.info("onDisconnect called.");
},
onFailed:function (code) {
onFailed: (code) => {
console.info("onFailed code is: " + code);
}
};
......
......@@ -11,20 +11,22 @@ PageAbility关联访问ServiceExtensionAbility和PageAbility关联访问ServiceA
```ts
import featureAbility from '@ohos.ability.featureAbility';
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
let want = {
let want: Want = {
bundleName: "com.ohos.stage",
abilityName: "com.ohos.stage.ServiceExtensionAbility"
};
let faConnect = {
onConnect:function (elementName, proxy) {
let faConnect: common.ConnectOptions = {
onConnect: (elementName, proxy) => {
console.info("Faconnection onConnect called.");
},
onDisconnect:function (elementName) {
onDisconnect: (elementName) => {
console.info("Faconnection onDisconnect called.");
},
onFailed:function (code) {
onFailed: (code) => {
console.info("Faconnection onFailed code is: " + code);
}
};
......@@ -39,20 +41,22 @@ ServiceAbility/DataAbility关联访问ServiceExtensionAbility和ServiceAbility/D
```ts
import particleAbility from '@ohos.ability.particleAbility';
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
let want = {
let want: Want = {
bundleName: "com.ohos.stage",
abilityName: "com.ohos.stage.ServiceExtensionAbility"
};
let faConnect = {
onConnect:function (elementName, proxy) {
let faConnect: common.ConnectOptions = {
onConnect: (elementName, proxy) => {
console.info("Faconnection onConnect called.");
},
onDisconnect:function (elementName) {
onDisconnect: (elementName) => {
console.info("Faconnection onDisconnect called.");
},
onFailed:function (code) {
onFailed: (code) => {
console.info("Faconnection onFailed code is: " + code);
}
};
......
......@@ -19,9 +19,11 @@ PageAbility创建连接本地ServiceAbility回调实例的代码以及连接本
import rpc from "@ohos.rpc"
import promptAction from '@ohos.promptAction'
import featureAbility from '@ohos.ability.featureAbility'
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
let option = {
onConnect: function onConnectCallback(element, proxy) {
let option: common.ConnectOptions = {
onConnect: (element, proxy) => {
console.info(`onConnectLocalService onConnectDone`)
if (proxy === null) {
promptAction.showToast({
......@@ -38,21 +40,21 @@ let option = {
message: "Connect service success"
})
},
onDisconnect: function onDisconnectCallback(element) {
onDisconnect: (element) => {
console.info(`onConnectLocalService onDisconnectDone element:${element}`)
promptAction.showToast({
message: "Disconnect service success"
})
},
onFailed: function onFailedCallback(code) {
onFailed: (code) => {
console.info(`onConnectLocalService onFailed errCode:${code}`)
promptAction.showToast({
message: "Connect local service onFailed"
})
}
}
};
let request = {
let request: Want = {
bundleName: "com.example.myapplication",
abilityName: "com.example.myapplication.ServiceAbility",
}
......@@ -69,7 +71,7 @@ Service侧把自身的实例返回给调用侧的示例代码如下:
import rpc from "@ohos.rpc"
class FirstServiceAbilityStub extends rpc.RemoteObject {
constructor(des: any) {
constructor(des: Object) {
if (typeof des === 'string') {
super(des)
} else {
......@@ -77,7 +79,7 @@ class FirstServiceAbilityStub extends rpc.RemoteObject {
}
}
onRemoteRequest(code: number, data: any, reply: any, option: any) {
onRemoteRequest(code: number, data: rpc.MessageParcel, reply: rpc.MessageParcel, option: rpc.MessageOption) {
console.info(`onRemoteRequest called`)
if (code === 1) {
let string = data.readString()
......
......@@ -7,56 +7,71 @@
创建DataAbility的代码示例如下:
```ts
import featureAbility from '@ohos.ability.featureAbility'
import dataAbility from '@ohos.data.dataAbility'
import relationalStore from '@ohos.data.relationalStore'
import featureAbility from '@ohos.ability.featureAbility';
import dataAbility from '@ohos.data.dataAbility';
import relationalStore from '@ohos.data.relationalStore';
import Want from '@ohos.app.ability.Want';
import { AsyncCallback, BusinessError } from '@ohos.base';
import rdb from '@ohos.data.rdb';
const TABLE_NAME = 'book'
const STORE_CONFIG = { name: 'book.db',securityLevel: 1 }
const STORE_CONFIG: relationalStore.StoreConfig = { name: 'book.db',securityLevel: 1 }
const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS book(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, introduction TEXT NOT NULL)'
let rdbStore: relationalStore.RdbStore = undefined
let rdbStore: relationalStore.RdbStore | undefined = undefined
export default {
onInitialized(abilityInfo) {
console.info('DataAbility onInitialized, abilityInfo:' + abilityInfo.bundleName)
export default class DataAbility {
onInitialized(want: Want) {
console.info('DataAbility onInitialized, abilityInfo:' + want.bundleName)
let context = featureAbility.getContext()
relationalStore.getRdbStore(context, STORE_CONFIG, (err, store) => {
console.info('DataAbility getRdbStore callback')
store.executeSql(SQL_CREATE_TABLE, [])
rdbStore = store
});
},
insert(uri, valueBucket, callback) {
};
insert(uri: string, valueBucket: rdb.ValuesBucket, callback: AsyncCallback<number>) {
console.info('DataAbility insert start')
rdbStore.insert(TABLE_NAME, valueBucket, callback)
},
batchInsert(uri, valueBuckets, callback) {
if (rdbStore) {
rdbStore.insert(TABLE_NAME, valueBucket, callback)
}
};
batchInsert(uri: string, valueBuckets: Array<rdb.ValuesBucket>, callback: AsyncCallback<number>) {
console.info('DataAbility batch insert start')
for (let i = 0;i < valueBuckets.length; i++) {
console.info('DataAbility batch insert i=' + i)
if (i < valueBuckets.length - 1) {
rdbStore.insert(TABLE_NAME, valueBuckets[i], (err: any, num: number) => {
console.info('DataAbility batch insert ret=' + num)
})
} else {
rdbStore.insert(TABLE_NAME, valueBuckets[i], callback)
if (rdbStore) {
for (let i = 0;i < valueBuckets.length; i++) {
console.info('DataAbility batch insert i=' + i)
if (i < valueBuckets.length - 1) {
rdbStore.insert(TABLE_NAME, valueBuckets[i], (err: BusinessError, num: number) => {
console.info('DataAbility batch insert ret=' + num)
})
} else {
rdbStore.insert(TABLE_NAME, valueBuckets[i], callback)
}
}
}
},
query(uri, columns, predicates, callback) {
};
query(uri: string, columns: Array<string>, predicates: dataAbility.DataAbilityPredicates,
callback: AsyncCallback<relationalStore.ResultSet>) {
console.info('DataAbility query start')
let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
rdbStore.query(rdbPredicates, columns, callback)
},
update(uri, valueBucket, predicates, callback) {
if (rdbStore) {
rdbStore.query(rdbPredicates, columns, callback)
}
};
update(uri: string, valueBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates,
callback: AsyncCallback<number>) {
console.info('DataAbilityupdate start')
let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
rdbStore.update(valueBucket, rdbPredicates, callback)
},
delete(uri, predicates, callback) {
if (rdbStore) {
rdbStore.update(valueBucket, rdbPredicates, callback)
}
};
delete(uri: string, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback<number>) {
console.info('DataAbilitydelete start')
let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
rdbStore.delete(rdbPredicates, callback)
}
if (rdbStore) {
rdbStore.delete(rdbPredicates, callback)
}
};
};
```
......@@ -4,28 +4,28 @@
开发者需要重写app.js/app.ets中的生命周期回调函数,开发者通过DevEco Studio开发平台创建PageAbility时,DevEco Studio会在app.js/app.ets中默认生成onCreate()和onDestroy()方法,其他方法需要开发者自行实现。接口说明参见前述章节,创建PageAbility示例如下:
```ts
export default {
export default class EntryAbility {
onCreate() {
console.info('Application onCreate')
},
};
onDestroy() {
console.info('Application onDestroy')
},
};
onShow() {
console.info('Application onShow')
},
};
onHide() {
console.info('Application onHide')
},
};
onActive() {
console.info('Application onActive')
},
};
onInactive() {
console.info('Application onInactive')
},
};
onNewWant() {
console.info('Application onNewWant')
},
};
}
```
......@@ -84,14 +84,13 @@ import fs from '@ohos.file.fs';
try {
console.info('Begin to getOrCreateDistributedDir');
dir = await featureAbility.getContext().getOrCreateDistributedDir();
console.info('distribute dir is ' + dir)
console.info('distribute dir is ' + dir);
let fd: number;
let path = dir + "/a.txt";
fd = fs.openSync(path, fs.OpenMode.READ_WRITE).fd;
fs.close(fd);
} catch (error) {
console.error('getOrCreateDistributedDir failed with ' + error);
}
let fd: number;
let path = dir + "/a.txt";
fd = fs.openSync(path, fs.OpenMode.READ_WRITE).fd;
fs.close(fd);
})()
```
......@@ -6,33 +6,30 @@
重写ServiceAbility的生命周期方法,添加其他Ability请求与ServiceAbility交互时的处理方法。
```ts
import Want from '@ohos.app.ability.Want';
import rpc from "@ohos.rpc"
class FirstServiceAbilityStub extends rpc.RemoteObject {
constructor(des: any) {
if (typeof des === 'string') {
super(des)
} else {
return
}
constructor(des: string) {
super(des);
}
}
export default {
export default class ServiceAbility {
onStart() {
console.info('ServiceAbility onStart')
},
};
onStop() {
console.info('ServiceAbility onStop')
},
onCommand(want, startId) {
};
onCommand(want: Want, startId: number) {
console.info('ServiceAbility onCommand')
},
onConnect(want) {
};
onConnect(want: Want) {
console.info('ServiceAbility onConnect' + want)
return new FirstServiceAbilityStub('test')
},
onDisconnect(want) {
};
onDisconnect(want: Want) {
console.info('ServiceAbility onDisconnect' + want)
}
}
......
......@@ -27,17 +27,18 @@
const REQUEST_CODE = 99;
class StubTest extends rpc.RemoteObject {
constructor(des) {
constructor(des: string) {
super(des);
}
// 接收应用传递过来的消息处理,以及将处理的结果返回给应用
onRemoteMessageRequest(code, data, reply, option) {
onRemoteMessageRequest(code: number, data: rpc.MessageSequence, reply: rpc.MessageSequence,
option: rpc.MessageOption) {
if (code === REQUEST_CODE) {
// 接收应用传递过来的数据
// 应用使用多次调用data.writeInt()写入多个数据时,驱动可以通过多次调用data.readInt()方法接收对应的数据
let optFir = data.readInt();
let optSec = data.readInt();
let optFir: number = data.readInt();
let optSec: number = data.readInt();
// 驱动将数据的处理结果返回给应用
// 示例中为接收了两个数据,并将两个数据的求和返回给应用
reply.writeInt(optFir + optSec);
......@@ -52,6 +53,7 @@
```ts
import DriverExtensionAbility from '@ohos.app.ability.DriverExtensionAbility';
import Want from '@ohos.app.ability.Want';
import rpc from '@ohos.rpc';
const TAG: string = '[Example].[Entry].[DriverExtAbility]';
......@@ -62,24 +64,24 @@
}
export default class DriverExtAbility extends DriverExtensionAbility {
onInit(want) {
onInit(want: Want) {
console.info(TAG, `onInit, want: ${want.abilityName}`);
}
onRelease() {
console.info(TAG, `onRelease, want: ${want.abilityName}`);
console.info(TAG, `onRelease`);
}
onConnect(want) {
onConnect(want: Want) {
console.info(TAG, `onConnect, want: ${want.abilityName}`);
return new StubTest("test");
}
onDisconnect(want) {
onDisconnect(want: Want) {
console.info(TAG, `onDisconnect, want: ${want.abilityName}`);
}
onDump() {
onDump(params: Array<string>) {
console.info(TAG, `onDump, params:` + JSON.stringify(params));
return ['params'];
}
......
......@@ -67,7 +67,7 @@
console.error("createDeviceManager err: " + JSON.stringify(err));
}
}
function getRemoteDeviceId() {
function getRemoteDeviceId(): string | undefined {
if (typeof dmClass === 'object' && dmClass !== null) {
let list = dmClass.getAvailableDeviceListSync();
if (typeof (list) === 'undefined' || typeof (list.length) === 'undefined') {
......
......@@ -55,12 +55,13 @@
在InputMethodService.ts文件中,增加导入InputMethodExtensionAbility的依赖包,自定义类继承InputMethodExtensionAbility并加上需要的生命周期回调。
```ts
import Want from '@ohos.app.ability.Want';
import InputMethodExtensionAbility from '@ohos.InputMethodExtensionAbility';
import keyboardController from './model/KeyboardController'
export default class InputDemoService extends InputMethodExtensionAbility {
onCreate(want) {
onCreate(want: Want) {
keyboardController.onCreate(this.context); // 初始化窗口并注册对输入法框架的事件监听
}
......@@ -141,7 +142,7 @@
this.panel = inputPanel;
if(this.panel) {
await this.panel.resize(dWidth, keyHeight);
await this.panel.mobeTo(0, nonBarPosition);
await this.panel.moveTo(0, nonBarPosition);
await this.panel.setUiContent('inputmethodextability/pages/Index');
}
});
......@@ -159,7 +160,7 @@
this.textInputClient = textInputClient; // 此为输入法客户端实例,由此调用输入法框架提供给输入法应用的功能接口
this.boardController = kbController;
})
globalThis.inputAbility.on('inputStop', () => {
inputMethodAbility.on('inputStop', () => {
this.onDestroy(); // 销毁KeyboardController
});
}
......@@ -277,14 +278,14 @@
// 数字键盘
@Component
struct numberMenu {
private numberList: sourceListType[]
private numberList: sourceListType[] = numberSourceListData;
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceEvenly }) {
Flex({ justifyContent: FlexAlign.SpaceBetween }) {
ForEach(this.numberList, (item: sourceListType) => { // 数字键盘第一行
keyItem({ keyValue: item })
}, (item: sourceListType) => item.content);
}, (item: sourceListType): sourceListType => item.content);
}
.padding({ top: "2%" })
.width("96%")
......@@ -333,7 +334,7 @@
5. 在工程Module对应的[module.json5配置文件](../quick-start/module-configuration-file.md)中注册InputMethodExtensionAbility,type标签需要设置为“inputMethod”,srcEntry标签表示当前InputMethodExtensionAbility组件所对应的代码路径。
```ts
```json
{
"module": {
...
......
......@@ -13,12 +13,12 @@ Emitter的开发步骤如下:
import emitter from "@ohos.events.emitter";
// 定义一个eventId为1的事件
let event = {
let event: emitter.InnerEvent = {
eventId: 1
};
// 收到eventId为1的事件后执行该回调
let callback = (eventData) => {
let callback = (eventData: emitter.EventData) => {
console.info('event callback');
};
......@@ -32,18 +32,16 @@ Emitter的开发步骤如下:
import emitter from "@ohos.events.emitter";
// 定义一个eventId为1的事件,事件优先级为Low
let event = {
let event: emitter.InnerEvent = {
eventId: 1,
priority: emitter.EventPriority.LOW
};
let eventData = {
data: {
"content": "c",
"id": 1,
"isEmpty": false,
}
};
let data = new Map<string, Object>();
data.set("content", "c");
data.set("id", 1);
data.set("isEmpty", false);
let eventData: emitter.EventData = {data};
// 发送eventId为1的事件,事件内容为eventData
emitter.emit(event, eventData);
......
......@@ -9,7 +9,7 @@ Worker的开发步骤如下:
1. 在工程的[模块级build-profile.json5](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-building-configuration-0000001218440654#section6887184182020)文件的buildOption属性中添加配置信息。
```ts
```json
"buildOption": {
"sourceOption": {
"workers": [
......@@ -27,7 +27,7 @@ Worker的开发步骤如下:
let parent = worker.workerPort;
// 处理来自主线程的消息
parent.onmessage = function(message) {
parent.onmessage = (message) => {
console.info("onmessage: " + message)
// 发送消息到主线程
parent.postMessage("message from worker thread.")
......@@ -46,7 +46,7 @@ Worker的开发步骤如下:
wk.postMessage("message from main thread.")
// 处理来自worker线程的消息
wk.onmessage = function(message) {
wk.onmessage = (message) => {
console.info("message from worker: " + message)
// 根据业务按需停止worker线程
......@@ -65,7 +65,7 @@ Worker的开发步骤如下:
wk.postMessage("message from main thread.")
// 处理来自worker线程的消息
wk.onmessage = function(message) {
wk.onmessage = (message) => {
console.info("message from worker: " + message)
// 根据业务按需停止worker线程
......
......@@ -36,34 +36,35 @@
```ts
import missionManager from '@ohos.app.ability.missionManager'
import { BusinessError } from '@ohos.base';
let listener = {
let listener: missionManager.MissionListener = {
// 任务创建
onMissionCreated: function (mission) {
onMissionCreated: (mission) => {
console.info("--------onMissionCreated-------")
},
// 任务销毁
onMissionDestroyed: function (mission) {
onMissionDestroyed: (mission) => {
console.info("--------onMissionDestroyed-------")
},
// 任务快照变化
onMissionSnapshotChanged: function (mission) {
onMissionSnapshotChanged: (mission) => {
console.info("--------onMissionSnapshotChanged-------")
},
// 任务被移动到前台
onMissionMovedToFront: function (mission) {
onMissionMovedToFront: (mission) => {
console.info("--------onMissionMovedToFront-------")
},
// 任务图标变化
onMissionIconUpdated: function (mission, icon) {
onMissionIconUpdated: (mission, icon) => {
console.info("--------onMissionIconUpdated-------")
},
// 任务名称变化
onMissionLabelUpdated: function (mission) {
onMissionLabelUpdated: (mission) => {
console.info("--------onMissionLabelUpdated-------")
},
// 任务实例被关闭
onMissionClosed: function (mission) {
onMissionClosed: (mission) => {
console.info("--------onMissionClosed-------")
}
};
......@@ -80,8 +81,8 @@
// 3.获取单个任务的详细信息()
let missionId = 11; // 11只是示例,实际是从系统中获取的任务id,下面类似
let mission = missionManager.getMissionInfo("", missionId).catch(function (err) {
console.info(err);
let mission = missionManager.getMissionInfo("", missionId).catch((err: BusinessError) => {
console.info('${err.code}');
});
// 4.获取任务快照
......@@ -116,8 +117,8 @@
});
// 9.删除全部任务
missionManager.clearAllMissions().catch(function (err) {
console.info(err);
missionManager.clearAllMissions().catch((err: BusinessError) => {
console.info('${err.code}');
});
// 10.解注册任务变化通知
......
......@@ -21,7 +21,9 @@
示例中的context的获取方式请参见[获取UIAbility的上下文信息](uiability-usage.md#获取uiability的上下文信息)。示例中的`pixelMap`的获取方式请参见[图片解码](../media/image-decoding.md)
```ts
let context = ...; // UIAbilityContext
import common from '@ohos.app.ability.common';
let context: common.UIAbilityContext = ...; // UIAbilityContext
let pixelMap: PixelMap = ...; // 图片的PixelMap信息
context.setMissionIcon(pixelMap, (err) => {
......@@ -41,11 +43,14 @@ context.setMissionIcon(pixelMap, (err) => {
通过调用[`UIAbilityContext.setMissionLabel()`](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextsetmissionlabel)方法修改任务快照的名称。
```ts
let context = ...; // UIAbilityContext
import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';
let context: common.UIAbilityContext = this.context; // UIAbilityContext
context.setMissionLabel('test').then(() => {
console.info('Succeeded in seting mission label.');
}).catch((err) => {
}).catch((err: BusinessErrpr) => {
console.error(`Failed to set mission label. Code is ${err.code}, message is ${err.message}`);
});
```
......
......@@ -42,15 +42,17 @@ FA模型中PageAbility对应Stage模型中的UIAbility。切换步骤如下。
```ts
import Window from '@ohos.window'
onWindowStageCreate(windowStage: Window.WindowStage) {
// Main window is created, set main page for this ability
windowStage.loadContent('pages/Index', (err, data) => {
if (err.code) {
console.error("loadContent failed")
return;
}
});
}
import Window from '@ohos.window'
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: Window.WindowStage) {
// Main window is created, set main page for this ability
windowStage.loadContent('pages/Index', (err, data) => {
if (err.code) {
console.error("loadContent failed")
return;
}
});
}
}
```
......@@ -19,7 +19,7 @@ PageAbility作为可见Ability,可以通过startAbility启动有界面的且
如果需设置当前Ability可由任何应用访问,对应config.json文件的示例代码如下所示:
```ts
```json
{
"module": {
...
......
......@@ -134,27 +134,29 @@ export default class ServiceExtImpl extends IdlServiceExtStub {
```ts
import ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility';
import ServiceExtImpl from '../IdlServiceExt/idl_service_ext_impl';
import Want from '@ohos.app.ability.Want';
import rpc from '@ohos.rpc';
const TAG: string = "[ServiceExtAbility]";
export default class ServiceExtAbility extends ServiceExtensionAbility {
serviceExtImpl = new ServiceExtImpl("ExtImpl");
serviceExtImpl: ServiceExtImpl = new ServiceExtImpl("ExtImpl");
onCreate(want) {
onCreate(want: Want) {
console.info(TAG, `onCreate, want: ${want.abilityName}`);
}
onRequest(want, startId) {
onRequest(want: Want, startId: number) {
console.info(TAG, `onRequest, want: ${want.abilityName}`);
}
onConnect(want) {
onConnect(want: Want) {
console.info(TAG, `onConnect, want: ${want.abilityName}`);
// 返回ServiceExtImpl对象,客户端获取后便可以与ServiceExtensionAbility进行通信
return this.serviceExtImpl;
return this.serviceExtImpl as rpc.RemoteObject;
}
onDisconnect(want) {
onDisconnect(want: Want) {
console.info(TAG, `onDisconnect, want: ${want.abilityName}`);
}
......@@ -194,15 +196,19 @@ export default class ServiceExtImpl extends IdlServiceExtStub {
1. 在系统应用中启动一个新的ServiceExtensionAbility。示例中的context的获取方式请参见[获取UIAbility的上下文信息](uiability-usage.md#获取uiability的上下文信息)
```ts
let context = ...; // UIAbilityContext
let want = {
"deviceId": "",
"bundleName": "com.example.myapplication",
"abilityName": "ServiceExtAbility"
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
import { BusinessError } from '@ohos.base';
let context: common.UIAbilityContext = ...; // UIAbilityContext
let want: Want = {
deviceId: "",
bundleName: "com.example.myapplication",
abilityName: "ServiceExtAbility"
};
context.startServiceExtensionAbility(want).then(() => {
console.info('Succeeded in starting ServiceExtensionAbility.');
}).catch((err) => {
}).catch((err: BusinessError) => {
console.error(`Failed to start ServiceExtensionAbility. Code is ${err.code}, message is ${err.message}`);
})
```
......@@ -210,15 +216,19 @@ export default class ServiceExtImpl extends IdlServiceExtStub {
2. 在系统应用中停止一个已启动的ServiceExtensionAbility。
```ts
let context = ...; // UIAbilityContext
let want = {
"deviceId": "",
"bundleName": "com.example.myapplication",
"abilityName": "ServiceExtAbility"
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
import { BusinessError } from '@ohos.base';
let context: common.UIAbilityContext = ...; // UIAbilityContext
let want: Want = {
deviceId: "",
bundleName: "com.example.myapplication",
abilityName: "ServiceExtAbility"
};
context.stopServiceExtensionAbility(want).then(() => {
console.info('Succeeded in stopping ServiceExtensionAbility.');
}).catch((err) => {
}).catch((err: BusinessError) => {
console.error(`Failed to stop ServiceExtensionAbility. Code is ${err.code}, message is ${err.message}`);
})
```
......@@ -226,10 +236,13 @@ export default class ServiceExtImpl extends IdlServiceExtStub {
3. 已启动的ServiceExtensionAbility停止自身。
```ts
let context = ...; // ServiceExtensionContext
import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';
let context: common.ServiceExtensionContext = ...; // ServiceExtensionContext
context.terminateSelf().then(() => {
console.info('Succeeded in terminating self.');
}).catch((err) => {
}).catch((err: BusinessError) => {
console.error(`Failed to terminate self. Code is ${err.code}, message is ${err.message}`);
})
```
......@@ -250,12 +263,15 @@ ServiceExtensionAbility服务组件在[onConnect()](../reference/apis/js-apis-ap
- 使用connectServiceExtensionAbility()建立与后台服务的连接。示例中的context的获取方式请参见[获取UIAbility的上下文信息](uiability-usage.md#获取uiability的上下文信息)
```ts
let want = {
"deviceId": "",
"bundleName": "com.example.myapplication",
"abilityName": "ServiceExtAbility"
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
let want: Want = {
deviceId: "",
bundleName: "com.example.myapplication",
abilityName: "ServiceExtAbility"
};
let options = {
let options: common.ConnectOptions = {
onConnect(elementName, remote) {
/* 此处的入参remote为ServiceExtensionAbility在onConnect生命周期回调中返回的对象,
* 开发者通过这个对象便可以与ServiceExtensionAbility进行通信,具体通信方式见下文
......@@ -274,16 +290,17 @@ ServiceExtensionAbility服务组件在[onConnect()](../reference/apis/js-apis-ap
}
}
// 建立连接后返回的Id需要保存下来,在解绑服务时需要作为参数传入
let connectionId = this.context.connectServiceExtensionAbility(want, options);
let connectionId: number = this.context.connectServiceExtensionAbility(want, options);
```
- 使用disconnectServiceExtensionAbility()断开与后台服务的连接。
```ts
import { BusinessError } from '@ohos.base';
// connectionId为调用connectServiceExtensionAbility接口时的返回值,需开发者自行维护
this.context.disconnectServiceExtensionAbility(connectionId).then((data) => {
this.context.disconnectServiceExtensionAbility(connectionId).then(() => {
console.info('disconnectServiceExtensionAbility success');
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error('disconnectServiceExtensionAbility failed');
})
```
......@@ -297,20 +314,21 @@ ServiceExtensionAbility服务组件在[onConnect()](../reference/apis/js-apis-ap
```ts
// 客户端需要将服务端对外提供的idl_service_ext_proxy.ts导入到本地工程中
import IdlServiceExtProxy from '../IdlServiceExt/idl_service_ext_proxy';
import common from '@ohos.app.ability.common';
let options = {
let options: common.ConnectOptions = {
onConnect(elementName, remote) {
console.info('onConnect callback');
if (remote === null) {
console.info(`onConnect remote is null`);
return;
}
let serviceExtProxy = new IdlServiceExtProxy(remote);
let serviceExtProxy: IdlServiceExtProxy = new IdlServiceExtProxy(remote);
// 通过接口调用的方式进行通信,屏蔽了RPC通信的细节,简洁明了
serviceExtProxy.processData(1, (errorCode, retVal) => {
serviceExtProxy.processData(1, (errorCode: number, retVal: number) => {
console.info(`processData, errorCode: ${errorCode}, retVal: ${retVal}`);
});
serviceExtProxy.insertDataToMap('theKey', 1, (errorCode) => {
serviceExtProxy.insertDataToMap('theKey', 1, (errorCode: number) => {
console.info(`insertDataToMap, errorCode: ${errorCode}`);
})
},
......@@ -327,9 +345,11 @@ ServiceExtensionAbility服务组件在[onConnect()](../reference/apis/js-apis-ap
```ts
import rpc from '@ohos.rpc';
import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';
const REQUEST_CODE = 1;
let options = {
let options: common.ConnectOptions = {
onConnect(elementName, remote) {
console.info('onConnect callback');
if (remote === null) {
......@@ -351,7 +371,7 @@ ServiceExtensionAbility服务组件在[onConnect()](../reference/apis/js-apis-ap
remote.sendMessageRequest(REQUEST_CODE, data, reply, option).then((ret) => {
let msg = reply.readInt();
console.info(`sendMessageRequest ret:${ret} msg:${msg}`);
}).catch((error) => {
}).catch((error: BusinessError) => {
console.info('sendMessageRequest failed');
});
},
......@@ -374,6 +394,7 @@ ServiceExtensionAbility服务组件在[onConnect()](../reference/apis/js-apis-ap
```ts
import rpc from '@ohos.rpc';
import { BusinessError } from '@ohos.base';
import bundleManager from '@ohos.bundle.bundleManager';
import { processDataCallback } from './i_idl_service_ext';
import { insertDataToMapCallback } from './i_idl_service_ext';
......@@ -396,7 +417,7 @@ ServiceExtensionAbility服务组件在[onConnect()](../reference/apis/js-apis-ap
return;
}
// 识别通过,执行正常业务逻辑
}).catch(err => {
}).catch((err: BusinessError) => {
console.info(TAG, 'getBundleNameByUid failed: ' + err.message);
});
}
......
......@@ -16,17 +16,17 @@ PageAbility相关的能力通过featureAbility提供,启动本地Ability通过
```ts
import featureAbility from '@ohos.ability.featureAbility'
import Want from '@ohos.app.ability.Want';
(async () => {
try {
console.info('Begin to start ability')
let param = {
want: {
bundleName: "com.example.myapplication",
moduleName: "entry",
abilityName: "com.example.myapplication.EntryAbility"
}
let want: Want = {
bundleName: "com.example.myapplication",
moduleName: "entry",
abilityName: "com.example.myapplication.EntryAbility"
}
await featureAbility.startAbility(param)
await featureAbility.startAbility({want})
console.info(`Start ability succeed`)
}
catch (error) {
......
......@@ -8,9 +8,10 @@
```ts
import featureAbility from '@ohos.ability.featureAbility';
import Want from '@ohos.app.ability.Want';
async function restartAbility() {
let wantInfo = {
let wantInfo: Want = {
bundleName: "com.sample.MyApplication",
abilityName: "EntryAbility",
parameters: {
......@@ -29,10 +30,32 @@ async function restartAbility() {
在目标端PageAbility的onNewWant回调中获取包含页面信息的want参数:
```ts
export default {
onNewWant(want) {
globalThis.newWant = want
import Want from '@ohos.app.ability.Want';
export class GlobalContext {
private constructor() {}
private static instance: GlobalContext;
private _objects = new Map<string, Object>();
public static getContext(): GlobalContext {
if (!GlobalContext.instance) {
GlobalContext.instance = new GlobalContext();
}
return GlobalContext.instance;
}
getObject(value: string): Object | undefined {
return this._objects.get(value);
}
setObject(key: string, objectClass: Object): void {
this._objects.set(key, objectClass);
}
}
export default class EntryAbility{
onNewWant(want: Want) {
GlobalContext.getContext().setObject("newWant", want);
}
}
```
......@@ -40,18 +63,20 @@ export default {
在目标端页面的自定义组件中获取包含页面信息的want参数并根据uri做路由处理:
```ts
import router from '@ohos.router'
import router from '@ohos.router';
import { GlobalContext } from '../GlobalContext'
@Entry
@Component
struct Index {
@State message: string = 'Router Page'
newWant = undefined
onPageShow() {
console.info('Index onPageShow')
let newWant = globalThis.newWant
let newWant: Want = GlobalContext.getContext().getObject("newWant")
if (newWant.hasOwnProperty("page")) {
router.push({ url: newWant.page });
globalThis.newWant = undefined
GlobalContext.getContext().setObject("newWant", undefined)
}
}
......@@ -76,43 +101,47 @@ struct Index {
调用方的页面中实现按钮点击触发startAbility方法启动目标端PageAbility,startAbility方法的入参want中携带指定页面信息,示例代码如下:
```ts
import featureAbility from '@ohos.ability.featureAbility'
import featureAbility from '@ohos.ability.featureAbility';
import { BusinessError } from '@ohos.base';
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
build() {
...
Button("startAbility")
.onClick(() => {
featureAbility.startAbility({
want: {
bundleName: "com.exm.myapplication",
abilityName: "com.exm.myapplication.EntryAbility",
parameters: { page: "pages/page1" }
}
}).then((data) => {
console.info("startAbility finish");
}).catch((err) => {
console.info("startAbility failed errcode:" + err.code)
Row() {
Button("startAbility")
.onClick(() => {
featureAbility.startAbility({
want: {
bundleName: "com.exm.myapplication",
abilityName: "com.exm.myapplication.EntryAbility",
parameters: { page: "pages/page1" }
}
}).then((data) => {
console.info("startAbility finish");
}).catch((err: BusinessError) => {
console.info("startAbility failed errcode:" + err.code)
})
})
})
...
Button("page2")
.onClick(() => {
featureAbility.startAbility({
want: {
bundleName: "com.exm.myapplication",
abilityName: "com.exm.myapplication.EntryAbility",
parameters: { page: "pages/page2" }
}
}).then((data) => {
console.info("startAbility finish");
}).catch((err) => {
console.info("startAbility failed errcode:" + err.code)
...
Button("page2")
.onClick(() => {
featureAbility.startAbility({
want: {
bundleName: "com.exm.myapplication",
abilityName: "com.exm.myapplication.EntryAbility",
parameters: { page: "pages/page2" }
}
}).then((data) => {
console.info("startAbility finish");
}).catch((err: BusinessError) => {
console.info("startAbility failed errcode:" + err.code)
})
})
})
...
}
...
}
}
......@@ -125,18 +154,20 @@ struct Index {
import featureAbility from '@ohos.ability.featureAbility';
import router from '@ohos.router';
export default {
export default class EntryAbility {
onCreate() {
featureAbility.getWant().then((want) => {
if (want.parameters.page) {
router.push({
url: want.parameters.page
})
if (want.parameters) {
if (want.parameters.page) {
router.push({
url: want.parameters.page
})
}
}
})
},
};
onDestroy() {
...
},
// ...
};
}
```
......@@ -13,26 +13,30 @@
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';
import { BusinessError } from '@ohos.base';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
console.info("EntryAbility onCreate")
}
onDestroy() {
console.info("EntryAbility onDestroy")
}
onWindowStageCreate(windowStage) {
onWindowStageCreate(windowStage: window.WindowStage) {
console.info("EntryAbility onWindowStageCreate")
windowStage.loadContent('pages/Index', (err, data) => {
...
// ...
});
let want = {
let want: Want = {
bundleName: "com.ohos.fa",
abilityName: "com.ohos.fa.EntryAbility",
};
this.context.startAbility(want).then(() => {
console.info('Start Ability successfully.');
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error("Ability failed: " + JSON.stringify(error));
});
}
......@@ -58,26 +62,30 @@ UIAbility通过startAbilityForResult启动PageABility和UIAbility通过startAbil
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';
import { BusinessError } from '@ohos.base';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
console.info("EntryAbility onCreate")
}
onDestroy() {
console.info("EntryAbility onDestroy")
}
onWindowStageCreate(windowStage) {
onWindowStageCreate(windowStage: window.WindowStage) {
console.info("EntryAbility onWindowStageCreate")
windowStage.loadContent('pages/Index', (err, data) => {
...
// ...
});
let want = {
let want: Want = {
bundleName: "com.ohos.fa",
abilityName: "EntryAbility",
};
this.context.startAbilityForResult(want).then((result) => {
console.info('Ability verify result: ' + JSON.stringify(result));
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error("Ability failed: " + JSON.stringify(error));
});
}
......@@ -101,23 +109,25 @@ export default class EntryAbility extends UIAbility {
```ts
import Extension from '@ohos.app.ability.ServiceExtensionAbility'
import Want from '@ohos.app.ability.Want';
import { BusinessError } from '@ohos.base';
export default class ServiceExtension extends Extension {
onCreate(want) {
onCreate(want: Want) {
console.info("ServiceExtension onCreate")
}
onDestroy() {
console.info("ServiceExtension onDestroy")
}
onRequest(want, startId) {
onRequest(want: Want, startId: number) {
console.info("ServiceExtension onRequest")
let wantFA = {
let wantFA: Want = {
bundleName: "com.ohos.fa",
abilityName: "EntryAbility",
};
this.context.startAbility(wantFA).then(() => {
console.info('Start Ability successfully.');
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error("Ability failed: " + JSON.stringify(error));
});
}
......
......@@ -52,7 +52,7 @@ async function RequestPermission() {
console.info('RequestPermission begin');
let array: Array<string> = ["ohos.permission.DISTRIBUTED_DATASYNC"];
let bundleFlag = 0;
let tokenID = undefined;
let tokenID: number | undefined = undefined;
let userID = 100;
let appInfo = await bundle.getApplicationInfo('ohos.samples.etsDemo', bundleFlag, userID);
tokenID = appInfo.accessTokenId;
......@@ -89,7 +89,7 @@ async function RequestPermission() {
```ts
import deviceManager from '@ohos.distributedHardware.deviceManager';
let dmClass;
let dmClass: deviceManager.DeviceManager;
function getDeviceManager() {
deviceManager.createDeviceManager('ohos.example.distributedService', (error, dm) => {
......@@ -100,9 +100,9 @@ function getDeviceManager() {
})
}
function getRemoteDeviceId() {
function getRemoteDeviceId(): string | undefined {
if (typeof dmClass === 'object' && dmClass != null) {
let list = dmClass.getTrustedDeviceListSync();
let list: Array<deviceManager.DeviceInfo> = dmClass.getTrustedDeviceListSync();
if (typeof (list) == 'undefined' || typeof (list.length) == 'undefined') {
console.info("EntryAbility onButtonClick getRemoteDeviceId err: list is null");
return;
......@@ -111,6 +111,7 @@ function getRemoteDeviceId() {
return list[0].deviceId;
} else {
console.info("EntryAbility onButtonClick getRemoteDeviceId err: dmClass is null");
return;
}
}
```
......@@ -123,15 +124,14 @@ function getRemoteDeviceId() {
```ts
import featureAbility from '@ohos.ability.featureAbility';
import Want from '@ohos.app.ability.Want';
function onStartRemoteAbility() {
console.info('onStartRemoteAbility begin');
let params;
let wantValue = {
let wantValue: Want = {
bundleName: 'ohos.samples.etsDemo',
abilityName: 'ohos.samples.etsDemo.RemoteAbility',
deviceId: getRemoteDeviceId(), // getRemoteDeviceId的定义在前面的示例代码中
parameters: params
};
console.info('onStartRemoteAbility want=' + JSON.stringify(wantValue));
featureAbility.startAbility({
......
......@@ -8,17 +8,16 @@ ServiceAbility的启动与其他Ability并无区别,应用开发者可以在Pa
```ts
import featureAbility from '@ohos.ability.featureAbility'
import Want from '@ohos.app.ability.Want';
async function startServiceAbility() {
try {
console.info('Begin to start ability')
let param = {
want: {
bundleName: "com.example.myapplication",
abilityName: "com.example.myapplication.ServiceAbility"
}
let want: Want = {
bundleName: "com.example.myapplication",
abilityName: "com.example.myapplication.ServiceAbility"
}
await featureAbility.startAbility(param)
await featureAbility.startAbility({want})
console.info(`Start ability succeed`)
} catch (error) {
console.error('Start ability failed with ' + error)
......
......@@ -10,16 +10,18 @@
```ts
import featureAbility from '@ohos.ability.featureAbility';
let parameter = {
"want": {
bundleName: "com.ohos.stage",
abilityName: "EntryAbility"
import { BusinessError } from '@ohos.base';
featureAbility.startAbility(
{
want: {
bundleName: "com.ohos.stage",
abilityName: "EntryAbility"
}
}
};
featureAbility.startAbility(parameter).then((code) => {
).then((code) => {
console.info('Ability verify code: ' + JSON.stringify(code));
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error("Ability failed: " + JSON.stringify(error));
});
```
......@@ -34,16 +36,17 @@ startAbilityForResult和startAbility的区别是当UIAbility销毁的时候会
```ts
import featureAbility from '@ohos.ability.featureAbility';
let parameter = {
"want": {
bundleName: "com.ohos.stage",
abilityName: "com.ohos.stage.EntryAbility"
}
};
featureAbility.startAbilityForResult(parameter).then((result) => {
import { BusinessError } from '@ohos.base';
featureAbility.startAbilityForResult(
{
want: {
bundleName: "com.ohos.stage",
abilityName: "com.ohos.stage.EntryAbility"
}
}).then((result) => {
console.info('Ability verify result: ' + JSON.stringify(result));
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error("Ability failed: " + JSON.stringify(error));
});
```
......@@ -56,16 +59,18 @@ featureAbility.startAbilityForResult(parameter).then((result) => {
```ts
import particleAbility from '@ohos.ability.particleAbility';
let parameter = {
"want": {
bundleName: "com.ohos.stage",
abilityName: "com.ohos.stage.EntryAbility"
import { BusinessError } from '@ohos.base';
particleAbility.startAbility(
{
want: {
bundleName: "com.ohos.stage",
abilityName: "com.ohos.stage.EntryAbility"
}
}
};
particleAbility.startAbility(parameter).then(() => {
).then(() => {
console.info('Start Ability successfully.');
}).catch((error) => {
}).catch((error: BusinessError) => {
console.error("Ability failed: " + JSON.stringify(error));
});
```
......@@ -21,22 +21,24 @@
```ts
import common from '@ohos.app.ability.common';
import { Configuration } from '@ohos.app.ability.Configuration';
import EnvironmentCallback from '@ohos.app.ability.EnvironmentCallback';
@Entry
@Component
struct Index {
private context = getContext(this) as common.UIAbilityContext;
private callbackId: number; // 注册订阅系统环境变化的ID
private callbackId: number = 0; // 注册订阅系统环境变化的ID
subscribeConfigurationUpdate() {
let systemLanguage: string = this.context.config.language; // 获取系统当前语言
let systemLanguage: string | undefined = this.context.config.language; // 获取系统当前语言
// 1.获取ApplicationContext
let applicationContext = this.context.getApplicationContext();
// 2.通过applicationContext订阅环境变量变化
let environmentCallback = {
onConfigurationUpdated(newConfig) {
let environmentCallback: EnvironmentCallback = {
onConfigurationUpdated(newConfig: Configuration) {
console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);
if (this.systemLanguage !== newConfig.language) {
......@@ -68,7 +70,7 @@
@Component
struct Index {
private context = getContext(this) as common.UIAbilityContext;
private callbackId: number; // 注册订阅系统环境变化的ID
private callbackId: number = 0; // 注册订阅系统环境变化的ID
unsubscribeConfigurationUpdate() {
let applicationContext = this.context.getApplicationContext();
......@@ -95,8 +97,9 @@
```ts
import AbilityStage from '@ohos.app.ability.AbilityStage';
import { Configuration } from '@ohos.app.ability.Configuration';
let systemLanguage: string; // 系统当前语言
let systemLanguage: string | undefined; // 系统当前语言
export default class MyAbilityStage extends AbilityStage {
onCreate() {
......@@ -104,7 +107,7 @@ export default class MyAbilityStage extends AbilityStage {
console.info(`systemLanguage is ${systemLanguage} `);
}
onConfigurationUpdate(newConfig) {
onConfigurationUpdate(newConfig: Configuration) {
console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);
if (systemLanguage !== newConfig.language) {
......@@ -127,16 +130,19 @@ UIAbility组件提供了`UIAbility.onConfigurationUpdate()`回调方法用于订
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
import { Configuration } from '@ohos.app.ability.Configuration';
let systemLanguage: string; // 系统当前语言
let systemLanguage: string | undefined; // 系统当前语言
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
systemLanguage = this.context.config.language; // UIAbility实例首次加载时,获取系统当前语言
console.info(`systemLanguage is ${systemLanguage} `);
}
onConfigurationUpdate(newConfig) {
onConfigurationUpdate(newConfig: Configuration) {
console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`);
if (systemLanguage !== newConfig.language) {
......@@ -145,7 +151,7 @@ export default class EntryAbility extends UIAbility {
}
}
...
// ...
}
```
......@@ -161,12 +167,13 @@ ExtensionAbility组件提供了`onConfigurationUpdate()`回调方法用于订阅
```ts
import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
import { Configuration } from '@ohos.app.ability.Configuration';
export default class EntryFormAbility extends FormExtensionAbility {
onConfigurationUpdate(newConfig) {
onConfigurationUpdate(newConfig: Configuration) {
console.info(`newConfig is ${JSON.stringify(newConfig)}`);
}
...
// ...
}
```
......@@ -4,7 +4,6 @@
基于OpenHarmony的应用模型,可以通过以下几种方式来实现UIAbility组件与UI之间的数据同步。
- [使用EventHub进行数据通信](#使用eventhub进行数据通信):在基类Context中提供了EventHub对象,可以通过发布订阅方式来实现事件的传递。在事件传递前,订阅者需要先进行订阅,当发布者发布事件时,订阅者将接收到事件并进行相应处理。
- [使用globalThis进行数据同步](#使用globalthis进行数据同步):在ArkTS引擎实例内部,globalThis是一个全局对象,可以被ArkTS引擎实例内的UIAbility组件、ExtensionAbility组件和ArkUI页面(Page)访问。
- [使用AppStorage/LocalStorage进行数据同步](#使用appstorage/localstorage进行数据同步):ArkUI提供了AppStorage和LocalStorage两种应用级别的状态管理方案,可用于实现应用级别和UIAbility级别的数据同步。
......@@ -18,21 +17,23 @@
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
const TAG: string = '[Example].[Entry].[EntryAbility]';
export default class EntryAbility extends UIAbility {
func1(...data) {
func1(data: string) {
// 触发事件,完成相应的业务操作
console.info(TAG, '1. ' + JSON.stringify(data));
}
onCreate(want, launch) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
// 获取eventHub
let eventhub = this.context.eventHub;
// 执行订阅操作
eventhub.on('event1', this.func1);
eventhub.on('event1', (...data) => {
eventhub.on('event1', (data: string) => {
// 触发事件,完成相应的业务操作
console.info(TAG, '2. ' + JSON.stringify(data));
});
......@@ -69,7 +70,7 @@
3. 在UIAbility的注册事件回调中可以得到对应的触发事件结果,运行日志结果如下所示。
```ts
```json
[]
[1]
......@@ -84,229 +85,6 @@
this.context.eventHub.off('event1');
```
## 使用globalThis进行数据同步
globalThis是[ArkTS引擎实例](thread-model-stage.md)内部的一个全局对象,引擎内部的UIAbility/ExtensionAbility/Page都可以使用,因此可以使用globalThis对象进行数据同步。
**图1** 使用globalThis进行数据同步
![globalThis1](figures/globalThis1.png)
如上图所示,下面从如下三个场景和一个注意点来介绍globalThis的使用:
- [UIAbility和Page之间使用globalThis](#uiability和page之间使用globalthis)
- [UIAbility和UIAbility之间使用globalThis](#uiability和uiability之间使用globalthis)
- [UIAbility和ExtensionAbility之间使用globalThis](#uiability和extensionability之间使用globalthis)
- [globalThis使用的注意事项](#globalthis使用的注意事项)
### UIAbility和Page之间使用globalThis
通过在globalThis对象上绑定属性/方法,可以实现UIAbility组件与UI之间的数据同步。例如在UIAbility组件中绑定want参数,即可在UIAbility对应的UI上使用want参数信息。
1. 调用[`startAbility()`](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability)方法启动一个UIAbility实例时,被启动的UIAbility创建完成后会进入[`onCreate()`](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityoncreate)生命周期回调,且在[`onCreate()`](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityoncreate)生命周期回调中能够接受到传递过来的want参数,可以将want参数绑定到globalThis上。
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
onCreate(want, launch) {
globalThis.entryAbilityWant = want;
...
}
...
}
```
2. 在UI中即可通过globalThis获取到want参数信息。
```ts
let entryAbilityWant;
@Entry
@Component
struct Index {
aboutToAppear() {
entryAbilityWant = globalThis.entryAbilityWant;
}
// 页面展示
build() {
...
}
}
```
### UIAbility和UIAbility之间使用globalThis
在同一个应用中,UIAbility与UIAbility之间的数据传递可以通过将数据绑定到全局变量globalThis上进行同步。例如,在UIAbilityA中将数据保存在globalThis对象中,然后跳转到UIAbilityB中就可以获取该数据。
1. UIAbilityA中保存数据一个字符串数据并挂载到globalThis上。
```ts
import UIAbility from '@ohos.app.ability.UIAbility'
export default class UIAbilityA extends UIAbility {
onCreate(want, launch) {
globalThis.entryAbilityStr = 'UIAbilityA'; // UIAbilityA存放字符串“UIAbilityA”到globalThis
...
}
}
```
2. UIAbilityB中获取对应的数据。
```ts
import UIAbility from '@ohos.app.ability.UIAbility'
export default class UIAbilityB extends UIAbility {
onCreate(want, launch) {
// UIAbilityB从globalThis读取name并输出
console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr);
...
}
}
```
### UIAbility和ExtensionAbility之间使用globalThis
在同一个应用中,UIAbility和ExtensionAbility之间的数据传递也可以通过将数据绑定到全局变量globalThis上进行同步。例如,在UIAbilityA中保存数据,在ServiceExtensionAbility中就可以获取该数据。
1. UIAbilityA中保存数据一个字符串数据并挂载到globalThis上。
```ts
import UIAbility from '@ohos.app.ability.UIAbility'
export default class UIAbilityA extends UIAbility {
onCreate(want, launch) {
// UIAbilityA存放字符串“UIAbilityA”到globalThis
globalThis.entryAbilityStr = 'UIAbilityA';
...
}
}
```
2. ExtensionAbility中获取数据。
```ts
import Extension from '@ohos.app.ability.ServiceExtensionAbility'
export default class ServiceExtAbility extends Extension {
onCreate(want) {
// ServiceExtAbility从globalThis读取name并输出
console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr);
...
}
}
```
### globalThis使用的注意事项
**图2** globalThis注意事项
![globalThis2](figures/globalThis2.png)
- Stage模型下进程内的UIAbility组件共享ArkTS引擎实例,使用globalThis时需要避免存放相同名称的对象。例如UIAbilityA和UIAbilityB可以使用globalThis共享数据,在存放相同名称的对象时,先存放的对象会被后存放的对象覆盖。
- globalThis不支持跨进程使用,不同进程的UIAbility组件和ExtensionAbility组件无法使用globalThis共享数据,进程模型及进程间通信机制见[进程模型概述](./process-model-stage.md#进程模型概述)
- FA模型因为每个UIAbility组件之间引擎隔离,不会存在该问题。
- 对于绑定在globalThis上的对象,其生命周期与ArkTS虚拟机实例相同,建议在使用完成之后将其赋值为null,以减少对应用内存的占用。
Stage模型上同名对象覆盖导致问题的场景举例说明。
1. 在UIAbilityA文件中使用globalThis中存放了[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md)
```ts
import UIAbility from '@ohos.app.ability.UIAbility'
export default class UIAbilityA extends UIAbility {
onCreate(want, launch) {
globalThis.context = this.context; // UIAbilityA存放context到globalThis
...
}
}
```
2. 在UIAbilityA的页面中获取该[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md)并进行使用。使用完成后将UIAbilityA实例切换至后台。
```ts
@Entry
@Component
struct Index {
onPageShow() {
let ctx = globalThis.context; // 页面中从globalThis中取出context并使用
}
// 页面展示
build() {
...
}
}
```
3. 在UIAbilityB文件中使用globalThis中存放了[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md),并且命名为相同的名称。
```ts
import UIAbility from '@ohos.app.ability.UIAbility'
export default class UIAbilityB extends UIAbility {
onCreate(want, launch) {
// UIAbilityB覆盖了UIAbilityA在globalThis中存放的context
globalThis.context = this.context;
...
}
}
```
4. 在UIAbilityB的页面中获取该[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md)并进行使用。此时获取到的globalThis.context已经表示为UIAbilityB中赋值的[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md)内容。
```ts
@Entry
@Component
struct Index {
onPageShow() {
let ctx = globalThis.context; // Page中从globalThis中取出context并使用
}
// 页面展示
build() {
...
}
}
```
5. 在UIAbilityB实例切换至后台,将UIAbilityA实例从后台切换回到前台。此时UIAbilityA的onCreate生命周期不会再次进入。
```ts
import UIAbility from '@ohos.app.ability.UIAbility'
export default class UIAbilityA extends UIAbility {
onCreate(want, launch) { // UIAbilityA从后台进入前台,不会再走这个生命周期
globalThis.context = this.context;
...
}
}
```
6. 在UIAbilityA的页面再次回到前台时,其获取到的globalThis.context表示的为UIAbilityB的[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md),而不是UIAbilityA的[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md),在UIAbilityA的页面中使用则会出错。
```ts
@Entry
@Component
struct Index {
onPageShow() {
let ctx = globalThis.context; // 这时候globalThis中的context是UIAbilityB的context
}
// 页面展示
build() {
...
}
}
```
## 使用AppStorage/LocalStorage进行数据同步
ArkUI提供了AppStorage和LocalStorage两种应用级别的状态管理方案,可用于实现应用级别和UIAbility级别的数据同步。使用这些方案可以方便地管理应用状态,提高应用性能和用户体验。其中,AppStorage是一个全局的状态管理器,适用于多个UIAbility共享同一状态数据的情况;而LocalStorage则是一个局部的状态管理器,适用于单个UIAbility内部使用的状态数据。通过这两种方案,开发者可以更加灵活地控制应用状态,提高应用的可维护性和可扩展性。详细请参见[应用级变量的状态管理](../quick-start/arkts-application-state-management-overview.md)
......@@ -95,12 +95,16 @@ specified启动模式为指定实例模式,针对一些特殊场景使用(
```ts
// 在启动指定实例模式的UIAbility时,给每一个UIAbility实例配置一个独立的Key标识
// 例如在文档使用场景中,可以用文档路径作为Key标识
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
import { BusinessError } from '@ohos.base';
function getInstance() {
...
return 'key';
}
let context = ...; // context为调用方UIAbility的UIAbilityContext
let want = {
let context:common.UIAbilityContext = ...; // context为调用方UIAbility的UIAbilityContext
let want: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.myapplication',
abilityName: 'SpecifiedAbility',
......@@ -112,7 +116,7 @@ specified启动模式为指定实例模式,针对一些特殊场景使用(
context.startAbility(want).then(() => {
console.info('Succeeded in starting ability.');
}).catch((err) => {
}).catch((err: BusinessError) => {
console.error(`Failed to start ability. Code is ${err.code}, message is ${err.message}`);
})
```
......@@ -123,14 +127,17 @@ specified启动模式为指定实例模式,针对一些特殊场景使用(
```ts
import AbilityStage from '@ohos.app.ability.AbilityStage';
import Want from '@ohos.app.ability.Want';
export default class MyAbilityStage extends AbilityStage {
onAcceptWant(want): string {
onAcceptWant(want: Want): string {
// 在被调用方的AbilityStage中,针对启动模式为specified的UIAbility返回一个UIAbility实例对应的一个Key值
// 当前示例指的是module1 Module的SpecifiedAbility
if (want.abilityName === 'SpecifiedAbility') {
// 返回的字符串Key标识为自定义拼接的字符串内容
return `SpecifiedAbilityInstance_${want.parameters.instanceKey}`;
if (want.parameters) {
return `SpecifiedAbilityInstance_${want.parameters.instanceKey}`;
}
}
return '';
......
......@@ -21,12 +21,14 @@ Create状态为在应用加载过程中,UIAbility实例创建完成时触发
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
// 应用初始化
}
...
// ...
}
```
......@@ -46,7 +48,7 @@ import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';
export default class EntryAbility extends UIAbility {
...
// ...
onWindowStageCreate(windowStage: window.WindowStage) {
// 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)
......@@ -77,7 +79,7 @@ export default class EntryAbility extends UIAbility {
// 设置UI加载
windowStage.loadContent('pages/Index', (err, data) => {
...
// ...
});
}
}
......@@ -93,23 +95,28 @@ export default class EntryAbility extends UIAbility {
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';
import { BusinessError } from '@ohos.base';
export default class EntryAbility extends UIAbility {
windowStage: window.WindowStage;
...
windowStage: window.WindowStage | undefined = undefined;
// ...
onWindowStageCreate(windowStage: window.WindowStage) {
this.windowStage = windowStage;
...
// ...
}
onWindowStageDestroy() {
// 释放UI资源
// 例如在onWindowStageDestroy()中注销获焦/失焦等WindowStage事件
try {
this.windowStage.off('windowStageEvent');
if (this.windowStage) {
this.windowStage.off('windowStageEvent');
}
} catch (err) {
console.error(`Failed to disable the listener for window stage event changes. Code is ${err.code}, message is ${err.message}`);
let code = (err as BusinessError).code;
let message = (err as BusinessError).message;
console.error(`Failed to disable the listener for windowStageEvent. Code is ${code}, message is ${message}`);
};
}
}
......@@ -133,7 +140,7 @@ Foreground和Background状态分别在UIAbility实例切换至前台和切换至
import UIAbility from '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
...
// ...
onForeground() {
// 申请系统需要的资源,或者重新申请在onBackground()中释放的资源
......@@ -157,7 +164,7 @@ Destroy状态在UIAbility实例销毁时触发。可以在onDestroy()回调中
import UIAbility from '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
...
// ...
onDestroy() {
// 系统资源的释放、数据的保存等
......
......@@ -17,11 +17,11 @@ export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {
// Main window is created, set main page for this ability
windowStage.loadContent('pages/Index', (err, data) => {
...
// ...
});
}
...
// ...
}
```
......@@ -37,9 +37,11 @@ UIAbility类拥有自身的上下文信息,该信息为[UIAbilityContext](../r
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
// 获取UIAbility实例的上下文
let context = this.context;
...
......@@ -51,6 +53,7 @@ UIAbility类拥有自身的上下文信息,该信息为[UIAbilityContext](../r
```ts
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
@Entry
@Component
......@@ -58,7 +61,7 @@ UIAbility类拥有自身的上下文信息,该信息为[UIAbilityContext](../r
private context = getContext(this) as common.UIAbilityContext;
startAbilityTest() {
let want = {
let want: Want = {
// Want参数信息
};
this.context.startAbility(want);
......@@ -76,6 +79,7 @@ UIAbility类拥有自身的上下文信息,该信息为[UIAbilityContext](../r
```ts
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
@Entry
@Component
......@@ -83,7 +87,7 @@ UIAbility类拥有自身的上下文信息,该信息为[UIAbilityContext](../r
startAbilityTest() {
let context = getContext(this) as common.UIAbilityContext;
let want = {
let want: Want = {
// Want参数信息
};
context.startAbility(want);
......
......@@ -18,7 +18,9 @@
显式Want通常用于在当前应用中启动已知的目标应用组件,通过提供目标应用组件所在应用的Bundle名称信息(bundleName)并在Want对象内指定abilityName来启动目标应用组件。当有明确处理请求的对象时,显式Want是一种简单有效的启动目标应用组件的方式。
```ts
let wantInfo = {
import Want from '@ohos.app.ability.Want';
let wantInfo: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
......@@ -31,7 +33,9 @@
```ts
let wantInfo = {
import Want from '@ohos.app.ability.Want';
let wantInfo: Want = {
// uncomment line below if wish to implicitly query only in the specific bundle.
// bundleName: 'com.example.myapplication',
action: 'ohos.want.action.search',
......
......@@ -37,10 +37,12 @@ WindowExtensionAbility提供了onConnect()、onDisconnect()和onWindowReady()生
3. 打开WindowExtAbility.ts文件,导入WindowExtensionAbility的依赖包,自定义类继承WindowExtensionAbility并实现onWindowReady()、onConnect()和onDisconnect()生命周期回调。
```ts
import Extension from '@ohos.application.WindowExtensionAbility'
import Extension from '@ohos.application.WindowExtensionAbility'
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';
export default class WindowExtAbility extends Extension {
onWindowReady(window) {
onWindowReady(window: window.Window) {
window.loadContent('WindowExtAbility/pages/index1').then(() => {
window.getProperties().then((pro) => {
console.info("WindowExtension " + JSON.stringify(pro));
......@@ -49,11 +51,11 @@ WindowExtensionAbility提供了onConnect()、onDisconnect()和onWindowReady()生
})
}
onConnect(want) {
onConnect(want: Want) {
console.info('JSWindowExtension onConnect ' + want.abilityName);
}
onDisconnect(want) {
onDisconnect(want: Want) {
console.info('JSWindowExtension onDisconnect ' + want.abilityName);
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册