提交 f80e7983 编写于 作者: zyjhandsome's avatar zyjhandsome

1、向用户申请授权接口从UIAbilityContext迁移到安全模块,配套修改

2、申请授权统一术语
Signed-off-by: zyjhandsome's avatarzyjhandsome <zyjhandsome@126.com>
上级 fa67d0fb
...@@ -27,8 +27,7 @@ ...@@ -27,8 +27,7 @@
"host": "www.test.com", "host": "www.test.com",
"port": "8080", "port": "8080",
// prefix matching // prefix matching
"pathStartWith": "query", "pathStartWith": "query"
"type": "text/*"
}, },
{ {
"scheme": "http", "scheme": "http",
...@@ -57,8 +56,7 @@ function implicitStartAbility() { ...@@ -57,8 +56,7 @@ function implicitStartAbility() {
"action": "ohos.want.action.viewData", "action": "ohos.want.action.viewData",
// entities can be omitted. // entities can be omitted.
"entities": ["entity.system.browsable"], "entities": ["entity.system.browsable"],
"uri": "https://www.test.com:8080/query/student", "uri": "https://www.test.com:8080/query/student"
"type": "text/plain"
} }
context.startAbility(wantInfo).then(() => { context.startAbility(wantInfo).then(() => {
// ... // ...
......
...@@ -146,11 +146,17 @@ export default class EntryAbility extends UIAbility { ...@@ -146,11 +146,17 @@ export default class EntryAbility extends UIAbility {
### 获取和修改加密分区 ### 获取和修改加密分区
上一个场景中,引入了加密等级的概念,通过对[Context的area属性](../reference/apis/js-apis-inner-application-context.md)的读写来实现获取和设置当前加密分区,支持如下两种加密等级: 应用文件加密是一种保护数据安全的方法,可以使得文件在未经授权访问的情况下得到保护。在不同的场景下,应用需要不同程度的文件保护。对于私有文件,如闹铃、壁纸等,应用需要将这些文件放到设备级加密分区(EL1)中,以保证在用户输入密码前就可以被访问;对于更敏感的文件,如个人隐私信息等,应用需要将这些文件放到更高级别的加密分区(EL2)中,以保证更高的安全性。
- AreaMode.EL1:设备级加密区,设备开机后可访问的数据区 在实际应用中,开发者需要根据不同场景的需求选择合适的加密分区,从而保护应用数据的安全。通过合理使用EL1和EL2加密分区,可以有效提高应用数据的安全性
- AreaMode.EL2:用户级加密区,设备开机,首次输入密码后才能够访问的数据区。 > **说明:**
>
> - AreaMode.EL1:设备级加密区,设备开机后可访问的数据区。
>
> - AreaMode.EL2:用户级加密区,设备开机,首次输入密码后才能够访问的数据区。
要实现获取和设置当前加密分区,可以通过读写[Context的area属性](../reference/apis/js-apis-inner-application-context.md)来实现。
```ts ```ts
import UIAbility from '@ohos.app.ability.UIAbility'; import UIAbility from '@ohos.app.ability.UIAbility';
...@@ -175,7 +181,7 @@ export default class EntryAbility extends UIAbility { ...@@ -175,7 +181,7 @@ export default class EntryAbility extends UIAbility {
### 创建其他应用或其他Module的Context ### 创建其他应用或其他Module的Context
基类Context提供创建其他应用或其他Module的Context的方法有[createBundleContext(bundleName:string)](../reference/apis/js-apis-inner-application-context.md#contextcreatebundlecontext)[createModuleContext(moduleName:string)](../reference/apis/js-apis-inner-application-context.md#contextcreatemodulecontext)[createModuleContext(bundleName:string, moduleName:string)](../reference/apis/js-apis-inner-application-context.md#contextcreatemodulecontext-1)接口,创建其他应用或者其他Module的Context,从而通过该Context获取相应的资源信息(例如获取其他Module的[获取应用开发路径](#获取应用开发路径)信息)。 基类Context提供创建其他应用或其他Module的Context的方法有[createBundleContext(bundleName: string)](../reference/apis/js-apis-inner-application-context.md#contextcreatebundlecontext)[createModuleContext(moduleName: string)](../reference/apis/js-apis-inner-application-context.md#contextcreatemodulecontext)[createModuleContext(bundleName: string, moduleName: string)](../reference/apis/js-apis-inner-application-context.md#contextcreatemodulecontext-1)接口,创建其他应用或者其他Module的Context,从而通过该Context获取相应的资源信息(例如获取其他Module的[获取应用开发路径](#获取应用开发路径)信息)。
- 调用createBundleContext(bundleName:string)方法,创建其他应用的Context信息。 - 调用createBundleContext(bundleName:string)方法,创建其他应用的Context信息。
> **说明:** > **说明:**
...@@ -238,66 +244,79 @@ export default class EntryAbility extends UIAbility { ...@@ -238,66 +244,79 @@ export default class EntryAbility extends UIAbility {
### 订阅进程内UIAbility生命周期变化 ### 订阅进程内UIAbility生命周期变化
在应用内的DFX统计场景,如需要统计对应页面停留时间和访问频率等信息,可以使用订阅进程内UIAbility生命周期变化功能。 在应用内的DFX统计场景,如需要统计对应页面停留时间和访问频率等信息,可以使用订阅进程内UIAbility生命周期变化功能。
[ApplicationContext](../reference/apis/js-apis-inner-application-applicationContext)提供了订阅进程内UIAbility生命周期变化的能力。在进程内UIAbility生命周期变化时,如创建、可见/不可见、获焦/失焦、销毁等,会触发进入相应的回调,其中返回的此次注册监听生命周期的ID(每次注册该ID会自增+1,当超过监听上限数量2^63-1时,返回-1),以在[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md)使用为例进行说明。 通过[ApplicationContext](../reference/apis/js-apis-inner-application-applicationContext)提供的能力,可以订阅进程内UIAbility生命周期变化。当进程内的UIAbility生命周期变化时,如创建、可见/不可见、获焦/失焦、销毁等,会触发相应的回调函数。每次注册回调函数时,都会返回一个监听生命周期的ID,此ID会自增+1。当超过监听上限数量2^63-1时,会返回-1。以[UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md)中的使用为例进行说明。
```ts ```ts
import UIAbility from '@ohos.app.ability.UIAbility'; import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window'; import window from '@ohos.window';
const TAG: string = "[Example].[Entry].[EntryAbility]"; const TAG: string = '[Example].[Entry].[EntryAbility]';
export default class EntryAbility extends UIAbility { export default class EntryAbility extends UIAbility {
// 定义生命周期ID
lifecycleId: number; lifecycleId: number;
onCreate(want, launchParam) { onCreate(want, launchParam) {
// 定义生命周期回调对象
let abilityLifecycleCallback = { let abilityLifecycleCallback = {
onAbilityCreate(uiability) { // 当UIAbility创建时被调用
console.info(TAG, "onAbilityCreate uiability:" + JSON.stringify(uiability)); onAbilityCreate(uiAbility) {
console.log(TAG, `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
}, },
onWindowStageCreate(uiability, windowStage) { // 当窗口创建时被调用
console.info(TAG, "onWindowStageCreate uiability:" + JSON.stringify(uiability)); onWindowStageCreate(uiAbility, windowStage: window.WindowStage) {
console.info(TAG, "onWindowStageCreate windowStage:" + JSON.stringify(windowStage)); console.log(TAG, `onWindowStageCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
console.log(TAG, `onWindowStageCreate windowStage: ${JSON.stringify(windowStage)}`);
}, },
onWindowStageActive(uiability, windowStage) { // 当窗口处于活动状态时被调用
console.info(TAG, "onWindowStageActive uiability:" + JSON.stringify(uiability)); onWindowStageActive(uiAbility, windowStage: window.WindowStage) {
console.info(TAG, "onWindowStageActive windowStage:" + JSON.stringify(windowStage)); console.log(TAG, `onWindowStageActive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
console.log(TAG, `onWindowStageActive windowStage: ${JSON.stringify(windowStage)}`);
}, },
onWindowStageInactive(uiability, windowStage) { // 当窗口处于非活动状态时被调用
console.info(TAG, "onWindowStageInactive uiability:" + JSON.stringify(uiability)); onWindowStageInactive(uiAbility, windowStage: window.WindowStage) {
console.info(TAG, "onWindowStageInactive windowStage:" + JSON.stringify(windowStage)); console.log(TAG, `onWindowStageInactive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
console.log(TAG, `onWindowStageInactive windowStage: ${JSON.stringify(windowStage)}`);
}, },
onWindowStageDestroy(uiability, windowStage) { // 当窗口被销毁时被调用
console.info(TAG, "onWindowStageDestroy uiability:" + JSON.stringify(uiability)); onWindowStageDestroy(uiAbility, windowStage: window.WindowStage) {
console.info(TAG, "onWindowStageDestroy windowStage:" + JSON.stringify(windowStage)); console.log(TAG, `onWindowStageDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
console.log(TAG, `onWindowStageDestroy windowStage: ${JSON.stringify(windowStage)}`);
}, },
onAbilityDestroy(uiability) { // 当UIAbility被销毁时被调用
console.info(TAG, "onAbilityDestroy uiability:" + JSON.stringify(uiability)); onAbilityDestroy(uiAbility) {
console.log(TAG, `onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
}, },
onAbilityForeground(uiability) { // 当UIAbility从后台转到前台时触发回调
console.info(TAG, "onAbilityForeground uiability:" + JSON.stringify(uiability)); onAbilityForeground(uiAbility) {
console.log(TAG, `onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
}, },
onAbilityBackground(uiability) { // 当UIAbility从前台转到后台时触发回调
console.info(TAG, "onAbilityBackground uiability:" + JSON.stringify(uiability)); onAbilityBackground(uiAbility) {
console.log(TAG, `onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
}, },
onAbilityContinue(uiability) { // 当UIAbility迁移时被调用
console.info(TAG, "onAbilityContinue uiability:" + JSON.stringify(uiability)); onAbilityContinue(uiAbility) {
console.log(TAG, `onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
} }
} }
// 1. 通过context属性获取applicationContext // 获取应用上下文
let applicationContext = this.context.getApplicationContext(); let applicationContext = this.context.getApplicationContext();
// 2. 通过applicationContext注册监听应用内生命周期 // 注册应用内生命周期回调
this.lifecycleId = applicationContext.on("abilityLifecycle", abilityLifecycleCallback); this.lifecycleId = applicationContext.on("abilityLifecycle", abilityLifecycleCallback);
console.info(TAG, "register callback number: " + JSON.stringify(this.lifecycleId)); console.log(TAG, `register callback number: ${this.lifecycleId}`);
} }
// ...
onDestroy() { onDestroy() {
// 获取应用上下文
let applicationContext = this.context.getApplicationContext(); let applicationContext = this.context.getApplicationContext();
applicationContext.off("abilityLifecycle", this.lifecycleId, (error, data) => { // 取消应用内生命周期回调
console.info(TAG, "unregister callback success, err: " + JSON.stringify(error)); applicationContext.off("abilityLifecycle", this.lifecycleId);
});
} }
} }
``` ```
...@@ -19,11 +19,10 @@ OpenHarmony通过CES(Common Event Service,公共事件服务)为应用程 ...@@ -19,11 +19,10 @@ OpenHarmony通过CES(Common Event Service,公共事件服务)为应用程
- 有序公共事件:CES转发公共事件时,根据订阅者设置的优先级等级,在接收到优先级较高的一个订阅者回复后,再向下一个优先级较低的订阅者转发公共事件。具有相同优先级的订阅者将按随机顺序收到公共事件。 - 有序公共事件:CES转发公共事件时,根据订阅者设置的优先级等级,在接收到优先级较高的一个订阅者回复后,再向下一个优先级较低的订阅者转发公共事件。具有相同优先级的订阅者将按随机顺序收到公共事件。
- 粘性公共事件:能够让订阅者收到在订阅前已经发送的公共事件就是粘性公共事件。普通的公共事件只能在订阅后发送才能收到,而粘性公共事件的特殊性就是可以先发送后订阅,同时也支持先订阅后发送。发送粘性事件必须是系统应用或系统服务,粘性事件发送后会一直存在系统中,且发送者需要申请`ohos.permission.COMMONEVENT_STICKY`权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md#配置文件权限声明) - 粘性公共事件:能够让订阅者收到在订阅前已经发送的公共事件就是粘性公共事件。普通的公共事件只能在订阅后发送才能收到,而粘性公共事件的特殊性就是可以先发送后订阅,同时也支持先订阅后发送。发送粘性事件必须是系统应用或系统服务,粘性事件发送后会一直存在系统中,且发送者需要申请`ohos.permission.COMMONEVENT_STICKY`权限,配置方式请参见[配置文件权限声明](../security/accesstoken-guidelines.md#配置文件权限声明)
每个应用都可以按需订阅公共事件,订阅成功,当公共事件发布时,系统会将其发送给对应的应用。这些公共事件可能来自系统、其他应用和应用自身。 每个应用都可以按需订阅公共事件,订阅成功,当公共事件发布时,系统会将其发送给对应的应用。这些公共事件可能来自系统、其他应用和应用自身。
**图1** 公共事件示意图 **图1** 公共事件示意图
![common-event](figures/common-event.png) ![common-event](figures/common-event.png)
...@@ -47,22 +47,13 @@ ...@@ -47,22 +47,13 @@
## 开发步骤 ## 开发步骤
1. 在module.json5配置数据同步权限,示例代码如下 1. 需要申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[配置文件权限声明](../security/accesstoken-guidelines.md#配置文件权限声明)
```json 2. 同时需要在应用首次启动时弹窗向用户申请授权,使用方式请参见[向用户申请授权](../security/accesstoken-guidelines.md#向用户申请授权)
{
"module": {
"requestPermissions":[
{
"name" : "ohos.permission.DISTRIBUTED_DATASYNC",
}
]
}
}
```
2. 在配置文件中配置跨端迁移相关标签字段。 3. 在配置文件中配置跨端迁移相关标签字段。
- 配置应用支持迁移
配置应用支持迁移
在module.json5中配置continuable标签:true表示支持迁移,false表示不支持,默认为false。配置为false的UIAbility将被系统识别为无法迁移。 在module.json5中配置continuable标签:true表示支持迁移,false表示不支持,默认为false。配置为false的UIAbility将被系统识别为无法迁移。
...@@ -79,21 +70,8 @@ ...@@ -79,21 +70,8 @@
} }
} }
``` ```
- 根据需要配置应用启动模式类型,配置详情请参照[UIAbility组件启动模式](uiability-launch-type.md)
3. 申请数据同步权限,弹框示例代码。
```ts 根据需要配置应用启动模式类型,配置详情请参照[UIAbility组件启动模式](uiability-launch-type.md)
requestPermission() {
let context = this.context
let permissions: Array<string> = ['ohos.permission.DISTRIBUTED_DATASYNC']
context.requestPermissionsFromUser(permissions).then((data) => {
console.info("Succeed to request permission from user with data: "+ JSON.stringify(data))
}).catch((error) => {
console.info("Failed to request permission from user with error: "+ JSON.stringify(error))
})
}
```
4. 在发起端UIAbility中实现[onContinue()](../reference/apis/js-apis-app-ability-uiAbility.md#abilityoncontinue)接口。 4. 在发起端UIAbility中实现[onContinue()](../reference/apis/js-apis-app-ability-uiAbility.md#abilityoncontinue)接口。
当应用触发迁移时,[onContinue()](../reference/apis/js-apis-app-ability-uiAbility.md#abilityoncontinue)接口在发起端被调用,开发者可以在该接口中保存迁移数据,实现应用兼容性检测,决定是否支持此次迁移。 当应用触发迁移时,[onContinue()](../reference/apis/js-apis-app-ability-uiAbility.md#abilityoncontinue)接口在发起端被调用,开发者可以在该接口中保存迁移数据,实现应用兼容性检测,决定是否支持此次迁移。
......
...@@ -47,21 +47,9 @@ ...@@ -47,21 +47,9 @@
### 开发步骤 ### 开发步骤
1. 申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md#配置文件权限声明) 1. 需要申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[配置文件权限声明](../security/accesstoken-guidelines.md#配置文件权限声明)
2. 申请数据同步权限,弹框示例代码。 2. 同时需要在应用首次启动时弹窗向用户申请授权,使用方式请参见[向用户申请授权](../security/accesstoken-guidelines.md#向用户申请授权)
```ts
requestPermission() {
let context = this.context;
let permissions: Array<string> = ['ohos.permission.DISTRIBUTED_DATASYNC'];
context.requestPermissionsFromUser(permissions).then((data) => {
console.info("Succeed to request permission from user with data: "+ JSON.stringify(data));
}).catch((error) => {
console.info("Failed to request permission from user with error: "+ JSON.stringify(error));
})
}
```
3. 获取目标设备的设备ID。 3. 获取目标设备的设备ID。
...@@ -129,21 +117,9 @@ ...@@ -129,21 +117,9 @@
### 开发步骤 ### 开发步骤
1. 申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md#配置文件权限声明) 1. 需要申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[配置文件权限声明](../security/accesstoken-guidelines.md#配置文件权限声明)
2. 申请数据同步权限,弹框示例代码。 2. 同时需要在应用首次启动时弹窗向用户申请授权,使用方式请参见[向用户申请授权](../security/accesstoken-guidelines.md#向用户申请授权)
```ts
requestPermission() {
let context = this.context;
let permissions: Array<string> = ['ohos.permission.DISTRIBUTED_DATASYNC'];
context.requestPermissionsFromUser(permissions).then((data) => {
console.info("Succeed to request permission from user with data: "+ JSON.stringify(data));
}).catch((error) => {
console.info("Failed to request permission from user with error: "+ JSON.stringify(error));
})
}
```
3. 在发起端设置目标组件参数,调用startAbilityForResult()接口启动目标端UIAbility,异步回调中的data用于接收目标端UIAbility停止自身后返回给调用方UIAbility的信息。getRemoteDeviceId方法参照[通过跨设备启动uiability和serviceextensionability组件实现多端协同无返回数据](#通过跨设备启动uiability和serviceextensionability组件实现多端协同无返回数据) 3. 在发起端设置目标组件参数,调用startAbilityForResult()接口启动目标端UIAbility,异步回调中的data用于接收目标端UIAbility停止自身后返回给调用方UIAbility的信息。getRemoteDeviceId方法参照[通过跨设备启动uiability和serviceextensionability组件实现多端协同无返回数据](#通过跨设备启动uiability和serviceextensionability组件实现多端协同无返回数据)
...@@ -218,21 +194,9 @@ ...@@ -218,21 +194,9 @@
### 开发步骤 ### 开发步骤
1. 申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md#配置文件权限声明) 1. 需要申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[配置文件权限声明](../security/accesstoken-guidelines.md#配置文件权限声明)
2. 申请数据同步权限,弹框示例代码。 2. 同时需要在应用首次启动时弹窗向用户申请授权,使用方式请参见[向用户申请授权](../security/accesstoken-guidelines.md#向用户申请授权)
```ts
requestPermission() {
let context = this.context;
let permissions: Array<string> = ['ohos.permission.DISTRIBUTED_DATASYNC'];
context.requestPermissionsFromUser(permissions).then((data) => {
console.info("Succeed to request permission from user with data: "+ JSON.stringify(data));
}).catch((error) => {
console.info("Failed to request permission from user with error: "+ JSON.stringify(error));
})
}
```
3. 如果已有后台服务,请直接进入下一步;如果没有,则[实现一个后台服务](serviceextensionability.md#实现一个后台服务仅对系统应用开放) 3. 如果已有后台服务,请直接进入下一步;如果没有,则[实现一个后台服务](serviceextensionability.md#实现一个后台服务仅对系统应用开放)
...@@ -327,21 +291,9 @@ ...@@ -327,21 +291,9 @@
### 开发步骤 ### 开发步骤
1. 申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md#配置文件权限声明) 1. 需要申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[配置文件权限声明](../security/accesstoken-guidelines.md#配置文件权限声明)
2. 申请数据同步权限,弹框示例代码。 2. 同时需要在应用首次启动时弹窗向用户申请授权,使用方式请参见[向用户申请授权](../security/accesstoken-guidelines.md#向用户申请授权)
```ts
requestPermission() {
let context = this.context;
let permissions: Array<string> = ['ohos.permission.DISTRIBUTED_DATASYNC'];
context.requestPermissionsFromUser(permissions).then((data) => {
console.info("Succeed to request permission from user with data: "+ JSON.stringify(data));
}).catch((error) => {
console.info("Failed to request permission from user with error: "+ JSON.stringify(error));
})
}
```
3. 创建被调用端UIAbility。 3. 创建被调用端UIAbility。
被调用端UIAbility需要实现指定方法的数据接收回调函数、数据的序列化及反序列化方法。在需要接收数据期间,通过on接口注册监听,无需接收数据时通过off接口解除监听。 被调用端UIAbility需要实现指定方法的数据接收回调函数、数据的序列化及反序列化方法。在需要接收数据期间,通过on接口注册监听,无需接收数据时通过off接口解除监听。
......
...@@ -30,18 +30,14 @@ ...@@ -30,18 +30,14 @@
一个UIAbility实例对应一个单独的任务,因此应用调用[startAbility()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability)方法启动一个UIAbility时,就是创建了一个任务。 一个UIAbility实例对应一个单独的任务,因此应用调用[startAbility()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability)方法启动一个UIAbility时,就是创建了一个任务。
1. 桌面应用调用[missionManager](../reference/apis/js-apis-application-missionManager.md)的接口管理任务,需要申请`ohos.permission.MANAGE_MISSIONS`权限,配置方式请参见[配置文件权限声明](../security/accesstoken-guidelines.md#配置文件权限声明)
桌面应用调用[missionManager](../reference/apis/js-apis-application-missionManager.md)的接口管理任务,需要申请`ohos.permission.MANAGE_MISSIONS`权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md#配置文件权限声明) 2. 利用missionManager进行任务管理(监听任务变化、获取任务信息、获取任务快照、清理任务、任务加锁/解锁等)
```ts
import missionManager from '@ohos.app.ability.missionManager'
利用missionManager进行任务管理(监听任务变化、获取任务信息、获取任务快照、清理任务、任务加锁/解锁等),示例代码如下: let listener = {
```ts
import missionManager from '@ohos.app.ability.missionManager'
let listener = {
// 任务创建 // 任务创建
onMissionCreated: function (mission) { onMissionCreated: function (mission) {
console.info("--------onMissionCreated-------") console.info("--------onMissionCreated-------")
...@@ -70,62 +66,64 @@ let listener = { ...@@ -70,62 +66,64 @@ let listener = {
onMissionClosed: function (mission) { onMissionClosed: function (mission) {
console.info("--------onMissionClosed-------") console.info("--------onMissionClosed-------")
} }
}; };
// 1.注册任务变化通知 // 1.注册任务变化通知
let listenerId = missionManager.on('mission', listener); let listenerId = missionManager.on('mission', listener);
// 2.获取系统最近20个任务 // 2.获取系统最近20个任务
missionManager.getMissionInfos("", 20, (error, missions) => { missionManager.getMissionInfos("", 20, (error, missions) => {
console.info("getMissionInfos is called, error.code = " + error.code); console.info("getMissionInfos is called, error.code = " + error.code);
console.info("size = " + missions.length); console.info("size = " + missions.length);
console.info("missions = " + JSON.stringify(missions)); console.info("missions = " + JSON.stringify(missions));
}); });
// 3.获取单个任务的详细信息() // 3.获取单个任务的详细信息()
let missionId = 11; // 11只是示例,实际是从系统中获取的任务id,下面类似 let missionId = 11; // 11只是示例,实际是从系统中获取的任务id,下面类似
let mission = missionManager.getMissionInfo("", missionId).catch(function (err) { let mission = missionManager.getMissionInfo("", missionId).catch(function (err) {
console.info(err); console.info(err);
}); });
// 4.获取任务快照 // 4.获取任务快照
missionManager.getMissionSnapShot("", missionId, (error, snapshot) => { missionManager.getMissionSnapShot("", missionId, (error, snapshot) => {
console.info("getMissionSnapShot is called, error.code = " + error.code); console.info("getMissionSnapShot is called, error.code = " + error.code);
console.info("bundleName = " + snapshot.ability.bundleName); console.info("bundleName = " + snapshot.ability.bundleName);
}) })
// 5.获取低分辨任务快照 // 5.获取低分辨任务快照
missionManager.getLowResolutionMissionSnapShot("", missionId, (error, snapshot) => { missionManager.getLowResolutionMissionSnapShot("", missionId, (error, snapshot) => {
console.info("getLowResolutionMissionSnapShot is called, error.code = " + error.code); console.info("getLowResolutionMissionSnapShot is called, error.code = " + error.code);
console.info("bundleName = " + snapshot.ability.bundleName); console.info("bundleName = " + snapshot.ability.bundleName);
}) })
// 6.加锁/解锁任务 // 6.加锁/解锁任务
missionManager.lockMission(missionId).then(() => { missionManager.lockMission(missionId).then(() => {
console.info("lockMission is called "); console.info("lockMission is called ");
}); });
missionManager.unlockMission(missionId).then(() => { missionManager.unlockMission(missionId).then(() => {
console.info("unlockMission is called "); console.info("unlockMission is called ");
}); });
// 7.把任务切到前台 // 7.把任务切到前台
missionManager.moveMissionToFront(missionId).then(() => { missionManager.moveMissionToFront(missionId).then(() => {
console.info("moveMissionToFront is called "); console.info("moveMissionToFront is called ");
}); });
// 8.删除单个任务 // 8.删除单个任务
missionManager.clearMission(missionId).then(() => { missionManager.clearMission(missionId).then(() => {
console.info("clearMission is called "); console.info("clearMission is called ");
}); });
// 9.删除全部任务 // 9.删除全部任务
missionManager.clearAllMissions().catch(function (err) { missionManager.clearAllMissions().catch(function (err) {
console.info(err); console.info(err);
}); });
// 10.解注册任务变化通知 // 10.解注册任务变化通知
missionManager.off('mission', listenerId, (error) => { missionManager.off('mission', listenerId, (error) => {
console.info("unregisterMissionListener"); console.info("unregisterMissionListener");
}) })
``` ```
...@@ -9,37 +9,7 @@ ...@@ -9,37 +9,7 @@
在config.json声明需要的权限,在module下添加"reqPermissions",并写入对应权限。 在config.json声明需要的权限,在module下添加"reqPermissions",并写入对应权限。
例如申请访问日历权限:
如申请访问日历权限,需要申请`ohos.permission.READ_CALENDAR`权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md#配置文件权限声明) 1. 需要申请`ohos.permission.DISTRIBUTED_DATASYNC`权限,配置方式请参见[配置文件权限声明](../security/accesstoken-guidelines.md#配置文件权限声明)
2. 同时需要在应用首次启动时弹窗向用户申请授权,使用方式请参见[向用户申请授权](../security/accesstoken-guidelines.md#向用户申请授权)
对应config.json文件的示例代码如下所示:
```json
{
"module": {
// ...
"reqPermissions": [
{
"name": "ohos.permission.READ_CALENDAR"
// ...
}
]
}
}
```
通过动态弹窗向用户申请授权:
```ts
import featureAbility from '@ohos.ability.featureAbility';
let context = featureAbility.getContext();
let permissions: Array<string> = ['ohos.permission.READ_CALENDAR']
context.requestPermissionsFromUser(permissions, 1).then((data) => {
console.info("Succeed to request permission from user with data: " + JSON.stringify(data))
}).catch((error) => {
console.info("Failed to request permission from user with error: " + JSON.stringify(error))
})
```
...@@ -240,10 +240,6 @@ Stage模型上同名对象覆盖导致问题的场景举例说明。 ...@@ -240,10 +240,6 @@ Stage模型上同名对象覆盖导致问题的场景举例说明。
struct Index { struct Index {
onPageShow() { onPageShow() {
let ctx = globalThis.context; // 页面中从globalThis中取出context并使用 let ctx = globalThis.context; // 页面中从globalThis中取出context并使用
let permissions = ['com.example.permission']
ctx.requestPermissionsFromUser(permissions,(result) => {
// ...
});
} }
// 页面展示 // 页面展示
build() { build() {
...@@ -274,10 +270,6 @@ Stage模型上同名对象覆盖导致问题的场景举例说明。 ...@@ -274,10 +270,6 @@ Stage模型上同名对象覆盖导致问题的场景举例说明。
struct Index { struct Index {
onPageShow() { onPageShow() {
let ctx = globalThis.context; // Page中从globalThis中取出context并使用 let ctx = globalThis.context; // Page中从globalThis中取出context并使用
let permissions = ['com.example.permission']
ctx.requestPermissionsFromUser(permissions,(result) => {
console.info('requestPermissionsFromUser result:' + JSON.stringify(result));
});
} }
// 页面展示 // 页面展示
build() { build() {
...@@ -307,10 +299,6 @@ Stage模型上同名对象覆盖导致问题的场景举例说明。 ...@@ -307,10 +299,6 @@ Stage模型上同名对象覆盖导致问题的场景举例说明。
struct Index { struct Index {
onPageShow() { onPageShow() {
let ctx = globalThis.context; // 这时候globalThis中的context是UIAbilityB的context let ctx = globalThis.context; // 这时候globalThis中的context是UIAbilityB的context
let permissions=['com.example.permission'];
ctx.requestPermissionsFromUser(permissions,(result) => { // 使用这个对象就会导致进程崩溃
console.info('requestPermissionsFromUser result:' + JSON.stringify(result));
});
} }
// 页面展示 // 页面展示
build() { build() {
......
...@@ -12,9 +12,8 @@ ...@@ -12,9 +12,8 @@
具体接口描述,详见[WantAgent接口文档](../reference/apis/js-apis-app-ability-wantAgent.md) 具体接口描述,详见[WantAgent接口文档](../reference/apis/js-apis-app-ability-wantAgent.md)
| | |
| -------- | -------- |
| **接口名** | **描述** | | **接口名** | **描述** |
| -------- | -------- |
| getWantAgent(info:&nbsp;WantAgentInfo,&nbsp;callback:&nbsp;AsyncCallback&lt;WantAgent&gt;):&nbsp;void | 创建WantAgent。 | | getWantAgent(info:&nbsp;WantAgentInfo,&nbsp;callback:&nbsp;AsyncCallback&lt;WantAgent&gt;):&nbsp;void | 创建WantAgent。 |
| trigger(agent:&nbsp;WantAgent,&nbsp;triggerInfo:&nbsp;TriggerInfo,&nbsp;callback?:&nbsp;Callback&lt;CompleteData&gt;):&nbsp;void | 触发WantAgent意图。 | | trigger(agent:&nbsp;WantAgent,&nbsp;triggerInfo:&nbsp;TriggerInfo,&nbsp;callback?:&nbsp;Callback&lt;CompleteData&gt;):&nbsp;void | 触发WantAgent意图。 |
| cancel(agent:&nbsp;WantAgent,&nbsp;callback:&nbsp;AsyncCallback&lt;void&gt;):&nbsp;void | 取消WantAgent。 | | cancel(agent:&nbsp;WantAgent,&nbsp;callback:&nbsp;AsyncCallback&lt;void&gt;):&nbsp;void | 取消WantAgent。 |
......
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
以允许应用读取日历信息为例进行说明。 以允许应用读取日历信息为例进行说明。
1. 申请`ohos.permission.READ_CALENDAR`权限,配置方式请参见[访问控制授权申请](#配置文件权限声明) 1. 申请`ohos.permission.READ_CALENDAR`权限,配置方式请参见[配置文件权限声明](#配置文件权限声明)
2. 校验当前是否已经授权。 2. 校验当前是否已经授权。
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
## 开发步骤 ## 开发步骤
1. 申请`ohos.permission.PUBLISH_AGENT_REMINDER`权限,配置方式请参见[访问控制授权申请](../security/accesstoken-guidelines.md#配置文件权限声明) 1. 需要申请`ohos.permission.PUBLISH_AGENT_REMINDER`权限,配置方式请参见[配置文件权限声明](../security/accesstoken-guidelines.md#配置文件权限声明)
2. [使能通知开关](../notification/notification-enable.md),获得用户授权后,才能使用代理提醒功能。 2. [使能通知开关](../notification/notification-enable.md),获得用户授权后,才能使用代理提醒功能。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册