提交 7a2ce2c3 编写于 作者: L LiAn 提交者: Gitee

Merge branch 'master' of gitee.com:openharmony/docs into master

Signed-off-by: NLiAn <lian15@huawei.com>
......@@ -123,7 +123,7 @@ In this example, declare the permission under the **acls** field:
"allowed-acls": [
"ohos.permission.PERMISSION2"
]
},
}
}
```
......
......@@ -7,7 +7,7 @@
![IDL-interface-description](./figures/IDL-interface-description.png)
OpenHarmony IDL接口描述语言主要用于:
**OpenHarmony IDL接口描述语言主要用于:**
- 声明系统服务对外提供的服务接口,根据接口声明在编译时生成跨进程调用(IPC)或跨设备调用(RPC)的代理(Proxy)和桩(Stub)的C/C++代码或JS/TS代码。
......@@ -17,7 +17,7 @@ OpenHarmony IDL接口描述语言主要用于:
![IPC-RPC-communication-model](./figures/IPC-RPC-communication-model.png)
使用OpenHarmony IDL接口描述语言声明接口具有以下优点:
**使用OpenHarmony IDL接口描述语言声明接口具有以下优点:**
- OpenHarmony IDL中是以接口的形式定义服务,可以专注于定义而隐藏实现细节。
......@@ -59,7 +59,7 @@ sequenceable namespace.typename
sequenceable a.b..C.D
```
上述声明在生成的的C++头文件中将被解析为如下代码:
上述声明在生成的的C++头文件中将被解析为如下代码:
```cpp
#include “a/b/d.h”
......@@ -81,15 +81,15 @@ import MySequenceable from "./my_sequenceable"
需要注意的是,IDL并不负责该类型的代码实现,仅仅按照指定的形式引入该头文件或import指定模块,并使用该类型,因此开发者需要自行保证引入目录、命名空间及类型的正确性。
#### 接口类型
接口类型是指OpenHarmony IDL文件中定义的接口。对于当前IDL文件中定义的接口,可以直接使用它作为方法参数类型或返回值类型。而在其它OpenHarmony IDL文件中定义的接口,则需要在文件的头部进行前置声明。
接口类型是指OpenHarmony IDL文件中定义的接口。对于当前IDL文件中定义的接口,可以直接使用它作为方法参数类型或返回值类型。而在其它OpenHarmony IDL文件中定义的接口,则需要在文件的头部进行前置声明。
C++中声明的形式与sequenceable类型相似,具体而言可以有如下形式:
C++中声明的形式与sequenceable类型相似,具体而言可以有如下形式:
```cpp
interface includedir..namespace.typename
```
TS中声明的形式,具体而言可以有如下形式:
TS中声明的形式,具体而言可以有如下形式:
```ts
interface namespace.interfacename
......@@ -495,7 +495,7 @@ function connectAbility: void {
开发者可以通过 IPC 接口,将某个类从一个进程发送至另一个进程。但是,必须确保 IPC 通道的另一端可使用该类的代码,并且该类必须支持marshalling和unmarshalling方法。OpenHarmony 需要通过该marshalling和unmarshalling方法将对象序列化和反序列化成各进程能识别的对象。
如需创建支持sequenceable 类型数据,开发者必须执行以下操作:
**如需创建支持sequenceable 类型数据,开发者必须执行以下操作:**
1. 实现marshalling方法,它会获取对象的当前状态并将其序列化后写入Parcel。
2. 实现unmarshalling方法,它会从Parcel中反序列化出对象。
......
......@@ -41,7 +41,7 @@
"module": {
"abilities": [
{
"continuable": true,
"continuable": true
}
]
}
......@@ -62,7 +62,7 @@
"module": {
"abilities": [
{
"launchType": "standard",
"launchType": "standard"
}
]
}
......@@ -76,7 +76,7 @@
"module": {
"abilities": [
{
"launchType": "singleton",
"launchType": "singleton"
}
]
}
......
......@@ -6,10 +6,10 @@
设备类型分为default(默认设备)、tablet、tv、wearable等,有多种查询设备类型的方式。
1. 通过命令行的方式查询设备类型。
通过命令行查询指定系统参数(const.build.characteristics)进而确定设备类型,详见[系统参数介绍](../../../device-dev/subsystems/subsys-boot-syspara.md)
通过命令行查询指定系统参数(const.build.characteristics)进而确定设备类型,详见[系统参数介绍](../../../device-dev/subsystems/subsys-boot-init-sysparam.md)
```ts
```bash
# 方法一
hdc shell param get "const.build.characteristics"
# 方法二
......
......@@ -65,7 +65,6 @@ app.json示例:
| entityType | 该标签标记该应用的类别,具体有 :游戏类(game),影音类(media)、社交通信类(communication)、新闻类(news)、出行类(travel)、工具类(utility)、购物类(shopping)、教育类(education)、少儿类(kids)、商务类(business)、拍摄类(photography)。 | 字符串 | 该标签可以缺省,缺省为unspecified。 |
| singleton | 标识该应用开启单例模式,仅支持系统应用配置,三方应用配置不生效。配置为true时,在多用户场景下,该应用仍然单实例运行,不会随用户切换而变动。采用布尔类型,该字段从API8开始支持。 | 布尔值 | 可缺省,缺省值为false。 |
| removable | 标识应用是否可卸载,仅支持系统应用配置,三方应用配置不生效,该字段从API8开始支持。 | 布尔值 | 可缺省,缺省值为true。 |
| process | 标识应用进程名,标签值为字符串类型,最长为127个字节。如果app标签下配置了process,该应用的所有ability都运行在该进程中。 | 字符串 | 可缺省,缺省值为app标签下的bundleName。 |
| keepAlive | 标识应用是否始终保持运行状态,仅支持系统应用配置,三方应用配置不生效。标签值为布尔类型,如果为true,应用将始终保持为运行状态,并且在系统启动的时候会被系统启动起来,应用进程退出后,系统也会重新启动该应用进程。 | 布尔值 | 可缺省,缺省值为false。 |
| userDataClearable | 标识是否允许应用清除用户数据,仅支持系统应用配置,三方应用配置不生效,该字段从API8开始支持。 | 布尔值 | 可缺省,缺省值为true。 |
| accessible | 标识应用的安装目录是否是可访问的,仅支持系统应用配置,三方应用配置不生效。配置为true表示安装目录可以被三方应用访问,false表示不能被三方应用访问。 | 布尔值 | 可缺省,缺省值为false。 |
......@@ -82,14 +81,13 @@ module.json5示例:
"type": "entry|feature|har",
"srcEntrance" : "./MyAbilityStage.js",
"description" : "$string:description_application",
"process": "string",
"mainElement": "MainAbility",
"deviceTypes": [
"tablet",
"tv",
"wearable",
"car",
"router",
"router"
],
"deliveryWithInstall": true,
"installationFree": false,
......@@ -176,7 +174,7 @@ hap包的配置信息,该标签下的配置只对当前hap包生效。
| type | 该标签标识当前hap的类型。类型有三种,分别是entry、feature和har。 | 字符串 | 该标签不可缺省。 |
| srcEntrance | 该标签标识hap所对应的入口js代码路径,标签值为字符串(最长为127字节)。 | 字符串 | 该标签可缺省。 |
| description | 该标签标识hap包的描述信息,标签值是是字符串类型或对描述内容的资源索引,以支持多语言。 | 字符串 | 该标签可缺省,缺省值为空。 |
| process | 该标签标识hap的进程名,标签值为字符串类型(最长为31个字节)。如果在hap标签下配置了process,该应用的所有ability都运行在该进程中。 | 字符串 | 可缺省,缺省为app标签下的bundleName。 |
| process | 该标签标识hap的进程名,标签值为字符串类型(最长为31个字节)。如果在hap标签下配置了process,该应用的所有ability都运行在该进程中。该标签只支持系统应用配置。 | 字符串 | 可缺省,缺省为app标签下的bundleName。 |
| mainElement | 该标签标识hap的入口ability名称或者extension名称。只有配置为mainElement的ability或者extension才允许在服务中心露出。创建OpenHarmony原子化服务时,该标签不可缺省。 | 字符串 | OpenHarmony应用下,该标签可缺省。 |
| deviceTypes | 该标签标识hap可以运行在哪类设备上,标签值采用字符串数组的表示,系统预定义的设备类型见表4。<br />与syscap不同的是,deviceTypes是以设备类型为粒度,而syscap是以设备能力(例如蓝牙、wifi)为粒度。 | 字符串数组 | 该标签不可缺省,可以为空值。 |
| deliveryWithInstall | 该标签标识当前hap是否在用户主动安装的时候安装,true表示主动安装时安装,false表示主动安装时不安装。 | 布尔值 | 该标签不可缺省。 |
......
......@@ -158,7 +158,7 @@ SystemCapability.BundleManager.BundleFramework
| 名称 | 类型 | 必填 | 描述 |
| ----------- | ------ | ---- | ------------------------------------------------------------ |
| bundleName | string | 是 | 要查询的包名。 |
| bundleFlags | number | 是 | 用于指定返回的应用信息对象中包含信息的标记。默认值:0,取值范围:参考[BundleFlag说明](#bundleflag)信息相关flag。 |
| bundleFlags | number | 是 | 用于指定返回的应用信息对象中包含信息的标记。默认值:0,取值范围:参考[BundleFlag说明](#bundleflag)应用信息相关flag。 |
| userId | number | 是 | 用户ID。默认值:调用方所在用户,取值范围:大于等于0。 |
**返回值:**
......@@ -196,7 +196,7 @@ SystemCapability.BundleManager.BundleFramework
| 名称 | 类型 | 必填 | 描述 |
| ----------- | ------ | ---- | ------------------------------------------------------------ |
| bundleName | string | 是 | 要查询的包名。 |
| bundleFlags | number | 是 | 用于指定返回的应用信息对象中包含信息的标记。默认值:0,取值范围:参考[BundleFlag说明](#bundleflag)信息相关flag。 |
| bundleFlags | number | 是 | 用于指定返回的应用信息对象中包含信息的标记。默认值:0,取值范围:参考[BundleFlag说明](#bundleflag)应用信息相关flag。 |
**返回值:**
......@@ -448,7 +448,7 @@ bundle.getBundleInfo(bundleName, bundleFlags, options, (err, data) => {
getBundleInfoSync(bundleName: string, bundleFlags: number, options: BundleOptions): BundleInfo;
以同步方法根据给定的包名获取ApplicationInfo,返回BundleInfo对象。
以同步方法根据给定的包名获取BundleInfo,返回BundleInfo对象。
**需要权限:**
......@@ -488,7 +488,7 @@ console.info('Operation successful. Name:' + bundleInfo.name);
getBundleInfoSync(bundleName: string, bundleFlags: number): BundleInfo;
以同步方法根据给定的包名获取ApplicationInfo,返回BundleInfo对象。
以同步方法根据给定的包名获取BundleInfo,返回BundleInfo对象。
**需要权限:**
......
......@@ -169,7 +169,12 @@ readPixels(area: PositionArea): Promise\<void>
**示例:**
```js
const area = new ArrayBuffer(400);
const area = {
pixels: new ArrayBuffer(8),
offset: 0,
stride: 8,
region: { size: { height: 1, width: 2 }, x: 0, y: 0 }
}
pixelmap.readPixels(area).then(() => {
console.log('Succeeded in reading the image data in the area.'); //符合条件则进入
}).catch(error => {
......
......@@ -94,23 +94,42 @@ getFileAssets(options: MediaFetchOptions, callback: AsyncCallback&lt;FetchFileRe
```js
let fileKeyObj = mediaLibrary.FileKey;
let imageType = mediaLibrary.MediaType.IMAGE;
let imagesfetchOp = {
let imagesFetchOp = {
selections: fileKeyObj.MEDIA_TYPE + '= ?',
selectionArgs: [imageType.toString()],
};
media.getFileAssets(imagesfetchOp, (error, fetchFileResult) => {
if (fetchFileResult != undefined) {
console.info('mediaLibraryTest : ASSET_CALLBACK fetchFileResult success');
for (let i = 0; i < fetchFileResult.getCount(); i++) {
media.getFileAssets(imagesFetchOp, (error, fetchFileResult) => {
if (fetchFileResult == undefined) {
console.error('Failed to get fetchFileResult: ' + error);
return;
}
const count = fetchFileResult.getCount();
if (count < 0) {
console.error('Failed to get count from fetchFileResult: count: ' + count);
return;
}
if (count == 0) {
console.info('The count of fetchFileResult is zero');
return;
}
console.info('Get fetchFileResult success, count: ' + count);
fetchFileResult.getFirstObject((err, fileAsset) => {
if (fileAsset == undefined) {
console.error('Failed to get first object: ' + err);
return;
}
console.log('fileAsset.displayName ' + ': ' + fileAsset.displayName);
for (let i = 1; i < count; i++) {
fetchFileResult.getNextObject((err, fileAsset) => {
if (err) {
console.error('Failed ');
return;
}
console.log('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
if (fileAsset == undefined) {
console.error('Failed to get next object: ' + err);
return;
}
console.log('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
})
}
}
}
});
});
```
### getFileAssets<sup>7+</sup>
......@@ -140,14 +159,35 @@ getFileAssets(options: MediaFetchOptions): Promise&lt;FetchFileResult&gt;
```js
let fileKeyObj = mediaLibrary.FileKey;
let imageType = mediaLibrary.MediaType.IMAGE;
let imagesfetchOp = {
let imagesFetchOp = {
selections: fileKeyObj.MEDIA_TYPE + '= ?',
selectionArgs: [imageType.toString()],
};
media.getFileAssets(imagesfetchOp).then(function(fetchFileResult){
console.info("getFileAssets successfully: image number is "+ fetchFileResult.getCount());
media.getFileAssets(imagesFetchOp).then(function(fetchFileResult) {
const count = fetchFileResult.getCount();
if (count < 0) {
console.error('Failed to get count from fetchFileResult: count: ' + count);
return;
}
if (count == 0) {
console.info('The count of fetchFileResult is zero');
return;
}
console.info('Get fetchFileResult success, count: ' + count);
fetchFileResult.getFirstObject().then(function(fileAsset) {
console.log('fileAsset.displayName ' + ': ' + fileAsset.displayName);
for (let i = 1; i < count; i++) {
fetchFileResult.getNextObject().then(function(fileAsset) {
console.log('fileAsset.displayName ' + ': ' + fileAsset.displayName);
}).catch(function(err) {
console.error('Failed to get next object: ' + err);
})
}
}).catch(function(err) {
console.error('Failed to get first object: ' + err);
});
}).catch(function(err){
console.info("getFileAssets failed with error:"+ err);
console.error("Failed to get file assets: " + err);
});
```
......@@ -763,13 +803,11 @@ startMediaSelect(option: MediaSelectOption, callback: AsyncCallback&lt;Array&lt;
**示例:**
```js
let fileKeyObj = mediaLibrary.FileKey;
let imageType = mediaLibrary.MediaType.IMAGE;
let imagesfetchOp = {
selections: fileKeyObj.MEDIA_TYPE + '= ?',
selectionArgs: [imageType.toString()],
let option : mediaLibrary.MediaSelectOption = {
type : "media",
count : 2
};
mediaLibrary.getMediaLibrary().startMediaSelect(imagesfetchOp, (err, value) => {
mediaLibrary.getMediaLibrary().startMediaSelect(option, (err, value) => {
if (err) {
console.log("An error occurred when selecting media resources.");
return;
......@@ -805,13 +843,11 @@ startMediaSelect(option: MediaSelectOption): Promise&lt;Array&lt;string&gt;&gt;
**示例:**
```js
let fileKeyObj = mediaLibrary.FileKey;
let imageType = mediaLibrary.MediaType.IMAGE;
let imagesfetchOp = {
selections: fileKeyObj.MEDIA_TYPE + '= ?',
selectionArgs: [imageType.toString()],
let option : mediaLibrary.MediaSelectOption = {
type : "media",
count : 2
};
mediaLibrary.getMediaLibrary().startMediaSelect(imagesfetchOp).then((value) => {
mediaLibrary.getMediaLibrary().startMediaSelect(option).then((value) => {
console.log("Media resources selected.");
// Obtain the media selection value.
}).catch((err) => {
......@@ -1724,18 +1760,13 @@ async function example() {
};
const fetchFileResult = await media.getFileAssets(getImageOp);
const asset = await fetchFileResult.getFirstObject();
asset.isTrash(isTrashCallBack);
function isTrashCallBack(err, isTrash) {
if (isTrash == true) {
console.info('mediaLibraryTest : ASSET_CALLBACK ASSET_CALLBACK isTrash = ' + isTrash);
asset.trash(true, isTrashCallBack);
} else {
console.info('mediaLibraryTest : ASSET_CALLBACK isTrash Unsuccessfull = ' + err);
console.info('mediaLibraryTest : ASSET_CALLBACK isTrash : FAIL');
}
}
asset.isTrash((err, isTrash) => {
if (isTrash == undefined) {
console.error('Failed to get trash state: ' + err);
return;
}
console.info('Get trash state success: ' + isTrash);
});
}
```
......@@ -1765,14 +1796,13 @@ async function example() {
selections: fileKeyObj.MEDIA_TYPE + '= ?',
selectionArgs: [imageType.toString()],
order: fileKeyObj.DATE_ADDED + " DESC",
extendArgs: "",
};
const fetchFileResult = await media.getFileAssets(getImageOp);
const asset = await fetchFileResult.getFirstObject();
asset.isTrash().then(function(isTrash){
console.info("isTrash result:"+ isTrash);
console.info("isTrash result: " + isTrash);
}).catch(function(err){
console.info("isTrash failed with error:"+ err);
console.error("isTrash failed with error: " + err);
});
}
```
......@@ -2557,4 +2587,3 @@ async function example() {
| type | string | 是 | 媒体类型,包括:image, video, media,当前仅支持media类型 |
| count | number | 是 | 媒体选择,count = 1表示单选,count大于1表示多选。 |
......@@ -63,8 +63,8 @@ wait(): Promise&lt;number&gt;
**示例:**
```js
var child = process.runCmd('ls');
var result = child.wait();
let child = process.runCmd('ls');
let result = child.wait();
result.then(val=>{
console.log("result = " + val);
})
......@@ -90,8 +90,8 @@ getOutput(): Promise&lt;Uint8Array&gt;
**示例:**
```js
var child = process.runCmd('ls');
var result = child.wait();
let child = process.runCmd('ls');
let result = child.wait();
child.getOutput().then(val=>{
console.log("child.getOutput = " + val);
})
......@@ -117,8 +117,8 @@ getErrorOutput(): Promise&lt;Uint8Array&gt;
**示例:**
```js
var child = process.runCmd('madir test.text');
var result = child.wait();
let child = process.runCmd('madir test.text');
let result = child.wait();
child.getErrorOutput().then(val=>{
console.log("child.getErrorOutput= " + val);
})
......@@ -138,7 +138,7 @@ close(): void
**示例:**
```js
var child = process.runCmd('sleep 5; ls');
let child = process.runCmd('sleep 5; ls');
child.close();
```
......@@ -162,7 +162,7 @@ kill(signal: number | string): void
**示例:**
```js
var child = process.runCmd('sleep 5; ls');
let child = process.runCmd('sleep 5; ls');
child.kill(9);
```
......@@ -184,7 +184,7 @@ isIsolatedProcess(): boolean
**示例:**
```js
var result = process.isIsolatedProcess();
let result = process.isIsolatedProcess();
```
......@@ -211,7 +211,7 @@ isAppUid(v: number): boolean
**示例:**
```js
var result = process.isAppUid(688);
let result = process.isAppUid(688);
```
......@@ -232,7 +232,7 @@ is64Bit(): boolean
**示例:**
```js
var result = process.is64Bit();
let result = process.is64Bit();
```
......@@ -259,7 +259,7 @@ getUidForName(v: string): number
**示例:**
```js
var pres = process.getUidForName("tool")
let pres = process.getUidForName("tool")
```
......@@ -286,8 +286,8 @@ getThreadPriority(v: number): number
**示例:**
```js
var tid = process.tid;
var pres = process.getThreadPriority(tid);
let tid = process.tid;
let pres = process.getThreadPriority(tid);
```
......@@ -308,7 +308,7 @@ getStartRealtime(): number
**示例:**
```js
var realtime = process.getStartRealtime();
let realtime = process.getStartRealtime();
```
## process.getPastCpuTime<sup>8+</sup>
......@@ -328,7 +328,7 @@ getPastCpuTime(): number
**示例:**
```js
var result = process.getPastCpuTime() ;
let result = process.getPastCpuTime() ;
```
......@@ -355,8 +355,8 @@ getSystemConfig(name: number): number
**示例:**
```js
var _SC_ARG_MAX = 0
var pres = process.getSystemConfig(_SC_ARG_MAX)
let _SC_ARG_MAX = 0
let pres = process.getSystemConfig(_SC_ARG_MAX)
```
......@@ -383,7 +383,7 @@ getEnvironmentVar(name: string): string
**示例:**
```js
var pres = process.getEnvironmentVar("PATH")
let pres = process.getEnvironmentVar("PATH")
```
......@@ -421,8 +421,8 @@ runCmd(command: string, options?: { timeout?: number, killSignal?: number | stri
**示例:**
```js
var child = process.runCmd('ls', { maxBuffer : 2 });
var result = child.wait();
let child = process.runCmd('ls', { maxBuffer : 2 });
let result = child.wait();
child.getOutput.then(val=>{
console.log("child.getOutput = " + val);
})
......@@ -504,7 +504,7 @@ off(type: string): boolean
process.on("data", (e)=>{
console.log("data callback");
})
var result = process.off("data");
let result = process.off("data");
```
......@@ -544,7 +544,7 @@ cwd(): string
**示例:**
```js
var path = process.cwd();
let path = process.cwd();
```
......@@ -588,7 +588,7 @@ uptime(): number
**示例:**
```js
var time = process.uptime();
let time = process.uptime();
```
......@@ -616,6 +616,6 @@ kill(signal: number, pid: number): boolean
**示例:**
```js
var pres = process.pid
var result = process.kill(28, pres)
let pres = process.pid
let result = process.kill(28, pres)
```
......@@ -46,7 +46,7 @@ constructor是URI的构造函数。
**示例:**
```js
var mm = 'http://username:password@host:8080/directory/file?foo=1&bar=2#fragment';
let mm = 'http://username:password@host:8080/directory/file?foo=1&bar=2#fragment';
new uri.URI(mm); // Output 'http://username:password@host:8080/directory/file?foo=1&bar=2#fragment';
```
```js
......
......@@ -30,11 +30,11 @@ URLSearchParams的构造函数。
**示例:**
```js
var objectParams = new Url.URLSearchParams([ ['user1', 'abc1'], ['query2', 'first2'], ['query3', 'second3'] ]);
var objectParams1 = new Url.URLSearchParams({"fod" : '1' , "bard" : '2'});
var objectParams2 = new Url.URLSearchParams('?fod=1&bard=2');
var urlObject = new Url.URL('https://developer.mozilla.org/?fod=1&bard=2');
var params = new Url.URLSearchParams(urlObject.search);
let objectParams = new Url.URLSearchParams([ ['user1', 'abc1'], ['query2', 'first2'], ['query3', 'second3'] ]);
let objectParams1 = new Url.URLSearchParams({"fod" : '1' , "bard" : '2'});
let objectParams2 = new Url.URLSearchParams('?fod=1&bard=2');
let urlObject = new Url.URL('https://developer.mozilla.org/?fod=1&bard=2');
let params = new Url.URLSearchParams(urlObject.search);
```
......@@ -132,7 +132,7 @@ entries(): IterableIterator<[string, string]>
**示例:**
```js
var searchParamsObject = new Url.URLSearchParams("keyName1=valueName1&keyName2=valueName2");
let searchParamsObject = new Url.URLSearchParams("keyName1=valueName1&keyName2=valueName2");
for (var pair of searchParamsObject .entries()) { // Show keyName/valueName pairs
console.log(pair[0]+ ', '+ pair[1]);
}
......@@ -196,9 +196,9 @@ get(name: string): string | null
**示例:**
```js
var paramsOject = new Url.URLSearchParams('name=Jonathan&age=18');
var name = paramsOject.get("name"); // is the string "Jonathan"
var age = parseInt(paramsOject.get("age"), 10); // is the number 18
let paramsOject = new Url.URLSearchParams('name=Jonathan&age=18');
let name = paramsOject.get("name"); // is the string "Jonathan"
let age = parseInt(paramsOject.get("age"), 10); // is the number 18
```
......@@ -266,7 +266,7 @@ sort(): void
**示例:**
```js
var searchParamsObject = new Url.URLSearchParams("c=3&a=9&b=4&d=2"); // Create a test URLSearchParams object
let searchParamsObject = new Url.URLSearchParams("c=3&a=9&b=4&d=2"); // Create a test URLSearchParams object
searchParamsObject.sort(); // Sort the key/value pairs
console.log(searchParamsObject.toString()); // Display the sorted query string // Output a=9&b=2&c=3&d=4
```
......@@ -289,7 +289,7 @@ keys(): IterableIterator&lt;string&gt;
**示例:**
```js
var searchParamsObject = new Url.URLSearchParams("key1=value1&key2=value2"); // Create a URLSearchParamsObject object for testing
let searchParamsObject = new Url.URLSearchParams("key1=value1&key2=value2"); // Create a URLSearchParamsObject object for testing
for (var key of searchParamsObject .keys()) { // Output key-value pairs
console.log(key);
}
......@@ -313,8 +313,8 @@ values(): IterableIterator&lt;string&gt;
**示例:**
```js
var searchParams = new Url.URLSearchParams("key1=value1&key2=value2"); // Create a URLSearchParamsObject object for testing
for (var value of searchParams.values()) {
let searchParams = new Url.URLSearchParams("key1=value1&key2=value2"); // Create a URLSearchParamsObject object for testing
for (var value of searchParams.values()) {
console.log(value);
}
```
......@@ -338,7 +338,7 @@ for (var value of searchParams.values()) {
```js
const paramsObject = new Url.URLSearchParams('fod=bay&edg=bap');
for (const [name, value] of paramsObject) {
for (const [name, value] of paramsObject) {
console.log(name, value);
}
```
......@@ -408,11 +408,11 @@ URL的构造函数。
**示例:**
```js
var mm = 'http://username:password@host:8080';
var a = new Url.URL("/", mm); // Output 'http://username:password@host:8080/';
var b = new Url.URL(mm); // Output 'http://username:password@host:8080/';
let mm = 'http://username:password@host:8080';
let a = new Url.URL("/", mm); // Output 'http://username:password@host:8080/';
let b = new Url.URL(mm); // Output 'http://username:password@host:8080/';
new Url.URL('path/path1', b); // Output 'http://username:password@host:8080/path/path1';
var c = new Url.URL('/path/path1', b); // Output 'http://username:password@host:8080/path/path1';
let c = new Url.URL('/path/path1', b); // Output 'http://username:password@host:8080/path/path1';
new Url.URL('/path/path1', c); // Output 'http://username:password@host:8080/path/path1';
new Url.URL('/path/path1', a); // Output 'http://username:password@host:8080/path/path1';
new Url.URL('/path/path1', "https://www.exampleUrl/fr-FR/toto"); // Output https://www.exampleUrl/path/path1
......
......@@ -31,9 +31,9 @@ XmlSerializer的构造函数。
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var bufView = new DataView(arrayBuffer);
var thatSer = new xml.XmlSerializer(bufView);
let arrayBuffer = new ArrayBuffer(1024);
let bufView = new DataView(arrayBuffer);
let thatSer = new xml.XmlSerializer(bufView);
```
......@@ -55,9 +55,9 @@ setAttributes(name: string, value: string): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var bufView = new DataView(arrayBuffer);
var thatSer = new xml.XmlSerializer(bufView);
let arrayBuffer = new ArrayBuffer(1024);
let bufView = new DataView(arrayBuffer);
let thatSer = new xml.XmlSerializer(bufView);
thatSer.setAttributes("importance", "high");
```
......@@ -79,9 +79,9 @@ addEmptyElement(name: string): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var bufView = new DataView(arrayBuffer);
var thatSer = new xml.XmlSerializer(bufView);
let arrayBuffer = new ArrayBuffer(1024);
let bufView = new DataView(arrayBuffer);
let thatSer = new xml.XmlSerializer(bufView);
thatSer.addEmptyElement("b"); // => <b/>
```
......@@ -97,9 +97,9 @@ setDeclaration(): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var bufView = new DataView(arrayBuffer);
var thatSer = new xml.XmlSerializer(bufView);
let arrayBuffer = new ArrayBuffer(1024);
let bufView = new DataView(arrayBuffer);
let thatSer = new xml.XmlSerializer(bufView);
thatSer.setDeclaration() // => <?xml version="1.0" encoding="utf-8"?>;
```
......@@ -121,8 +121,8 @@ startElement(name: string): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var thatSer = new xml.XmlSerializer(arrayBuffer);
let arrayBuffer = new ArrayBuffer(1024);
let thatSer = new xml.XmlSerializer(arrayBuffer);
thatSer.startElement("notel");
thatSer.endElement();// => '<notel/>';
```
......@@ -139,9 +139,9 @@ endElement(): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var bufView = new DataView(arrayBuffer);
var thatSer = new xml.XmlSerializer(bufView);
let arrayBuffer = new ArrayBuffer(1024);
let bufView = new DataView(arrayBuffer);
let thatSer = new xml.XmlSerializer(bufView);
thatSer.setNamespace("h", "http://www.w3.org/TR/html4/");
thatSer.startElement("table");
thatSer.setAttributes("importance", "high");
......@@ -168,8 +168,8 @@ setNamespace(prefix: string, namespace: string): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var thatSer = new xml.XmlSerializer(arrayBuffer);
let arrayBuffer = new ArrayBuffer(1024);
let thatSer = new xml.XmlSerializer(arrayBuffer);
thatSer.setDeclaration();
thatSer.setNamespace("h", "http://www.w3.org/TR/html4/");
thatSer.startElement("note");
......@@ -193,8 +193,8 @@ setComment(text: string): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var thatSer = new xml.XmlSerializer(arrayBuffer);
let arrayBuffer = new ArrayBuffer(1024);
let thatSer = new xml.XmlSerializer(arrayBuffer);
thatSer.startElement("note");
thatSer.setComment("Hi!");
thatSer.endElement(); // => '<note>\r\n <!--Hi!-->\r\n</note>';
......@@ -218,8 +218,8 @@ setCDATA(text: string): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1028);
var thatSer = new xml.XmlSerializer(arrayBuffer);
let arrayBuffer = new ArrayBuffer(1028);
let thatSer = new xml.XmlSerializer(arrayBuffer);
thatSer.setCDATA('root SYSTEM') // => '<![CDATA[root SYSTEM]]>';
```
......@@ -241,8 +241,8 @@ setText(text: string): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var thatSer = new xml.XmlSerializer(arrayBuffer);
let arrayBuffer = new ArrayBuffer(1024);
let thatSer = new xml.XmlSerializer(arrayBuffer);
thatSer.startElement("note");
thatSer.setAttributes("importance", "high");
thatSer.setText("Happy1");
......@@ -267,8 +267,8 @@ setDocType(text: string): void
**示例:**
```js
var arrayBuffer = new ArrayBuffer(1024);
var thatSer = new xml.XmlSerializer(arrayBuffer);
let arrayBuffer = new ArrayBuffer(1024);
let thatSer = new xml.XmlSerializer(arrayBuffer);
thatSer.setDocType('root SYSTEM'); // => '<!DOCTYPE root SYSTEM>';
```
......@@ -294,20 +294,20 @@ constructor(buffer: ArrayBuffer | DataView, encoding?: string)
**示例:**
```js
var strXml =
let strXml =
'<?xml version="1.0" encoding="utf-8"?>' +
'<note importance="high" logged="true">' +
' <title>Happy</title>' +
' <todo>Work</todo>' +
' <todo>Play</todo>' +
'</note>';
var arrayBuffer = new ArrayBuffer(strXml.length);
var bufView = new Uint8Array(arrayBuffer);
var strLen = strXml.length;
let arrayBuffer = new ArrayBuffer(strXml.length);
let bufView = new Uint8Array(arrayBuffer);
let strLen = strXml.length;
for (var i = 0; i < strLen; ++i) {
bufView[i] = strXml.charCodeAt(i);//设置arraybuffer方式
}
var that = new xml.XmlPullParser(arrayBuffer);
let that = new xml.XmlPullParser(arrayBuffer);
```
......@@ -328,30 +328,30 @@ parse(option: ParseOptions): void
**示例:**
```js
var strXml =
let strXml =
'<?xml version="1.0" encoding="utf-8"?>' +
'<note importance="high" logged="true">' +
' <title>Happy</title>' +
' <todo>Work</todo>' +
' <todo>Play</todo>' +
'</note>';
var arrayBuffer = new ArrayBuffer(strXml.length);
var bufView = new Uint8Array(arrayBuffer);
var strLen = strXml.length;
let arrayBuffer = new ArrayBuffer(strXml.length);
let bufView = new Uint8Array(arrayBuffer);
let strLen = strXml.length;
for (var i = 0; i < strLen; ++i) {
bufView[i] = strXml.charCodeAt(i);
}
var that = new xml.XmlPullParser(arrayBuffer);
var arrTag = {};
var str = "";
var i = 0;
let that = new xml.XmlPullParser(arrayBuffer);
let arrTag = {};
let str = "";
let i = 0;
function func(key, value){
arrTag[i] = 'key:'+key+' value:'+ value.getDepth();
str += arrTag[i];
i++;
return true; // Determines whether to continuely parse, which is used to continue or terminate parsing.
}
var options = {supportDoctype:true, ignoreNameSpace:true, tokenValueCallbackFunction:func}
let options = {supportDoctype:true, ignoreNameSpace:true, tokenValueCallbackFunction:func}
that.parse(options);
console.log(str);
// 输出:
......
......@@ -22,7 +22,7 @@ Marquee(value: { start: boolean, step?: number, loop?: number, fromStart?: boole
| 参数名 | 参数类型 | 必填 | 参数描述 |
| -------- | -------- | -------- | -------- |
| start | boolean | 是 | 控制跑马灯是否进入播放状态。 |
| step | number | 否 | 滚动动画文本滚动步长。<br/>默认值:6vp |
| step | number | 否 | 滚动动画文本滚动步长。<br/>默认值:6,单位vp |
| loop | number | 否 | 设置重复滚动的次数,小于等于零时无限循环。<br/>默认值:-1 |
| fromStart | boolean | 否 | 设置文本从头开始滚动或反向滚动。<br/>默认值:true |
| src | string | 是 | 需要滚动的文本。 |
......@@ -84,7 +84,7 @@ struct MarqueeExample {
Button('start')
.onClick(() => {
this.start = true
})
})
.width(200)
.height(60)
.margin({bottom:20})
......
......@@ -23,7 +23,7 @@ TapGesture(value?: { count?: number, fingers?: number })
| 名称 | 功能描述 |
| -------- | -------- |
| onAction(event: (event?: GestureEvent) => void) | Tap手势识别成功回调。 |
| onAction(event: (event?:&nbsp;[GestureEvent](ts-gesture-settings.md))&nbsp;=&gt;&nbsp;void) | Tap手势识别成功回调。 |
## 示例
......
......@@ -23,12 +23,12 @@
创建数字标记组件。
**参数:**
| 参数名 | 参数类型 | 必填 | 默认值 | 参数描述 |
| -------- | -------- | -------- | -------- | -------- |
| count | number | 是 | - | 设置提醒消息数。 |
| position | BadgePosition | 否 | BadgePosition.RightTop | 设置提示点显示位置。 |
| maxCount | number | 否 | 99 | 最大消息数,超过最大消息时仅显示maxCount+。 |
| style | BadgeStyle | 是 | - | Badge组件可设置样式,支持设置文本颜色、尺寸、圆点颜色和尺寸。 |
| 参数名 | 参数类型 | 必填 | 默认值 | 参数描述 |
| -------- | -------- | -------- | -------- | -------- |
| count | number | 是 | - | 设置提醒消息数。 |
| position | BadgePosition | 否 | BadgePosition.RightTop | 设置提示点显示位置。 |
| maxCount | number | 否 | 99 | 最大消息数,超过最大消息时仅显示maxCount+。 |
| style | BadgeStyle | 是 | - | Badge组件可设置样式,支持设置文本颜色、尺寸、圆点颜色和尺寸。 |
方法2: Badge(value: {value: string, position?: BadgePosition, style: BadgeStyle})
......@@ -92,7 +92,7 @@ struct BadgeExample {
Badge({
value: ' ',
position: 1,
position: BadgePosition.Right,
style: { badgeSize: 6, badgeColor: Color.Red }
}) {
Text('message')
......
......@@ -17,9 +17,9 @@
| 名称 | 参数类型 | 默认值 | 描述 |
| -------- | -------- | -------- | -------- |
| linearGradient | {<br/>angle?:&nbsp;number \| string,<br/>direction?:&nbsp;[GradientDirection](ts-appendix-enums.md#gradientdirection),<br/>colors:&nbsp;Array&lt;[ColorStop](ts-types.md)&gt;<br/>, repeating?:&nbsp;boolean<br/>} | - | 线性渐变。<br/>angle:&nbsp;线性渐变的角度。<br/>direction:&nbsp;线性渐变的方向,设置angle后不生效。<br/>colors:&nbsp;为渐变的颜色描述。<br/>repeating:&nbsp;为渐变的颜色重复着色。 |
| sweepGradient | {<br/>center:&nbsp;Point,<br/>start?:&nbsp;number \| string,<br/>end?:&nbsp;number \| string,<br/>colors:&nbsp;Array&lt;[ColorStop](ts-types.md)&gt;<br/>, repeating?:&nbsp;boolean<br/>} | - | 角度渐变。<br/>center:为角度渐变的中心点。<br/>start:角度渐变的起点。<br/>end:角度渐变的终点<br/>colors:&nbsp;为渐变的颜色描述。<br/>repeating:&nbsp;为渐变的颜色重复着色。 |
| radialGradient | {<br/>center:&nbsp;Point,<br/>radius:&nbsp;number \| string,<br/>colors:&nbsp;Array&lt;[ColorStop](ts-types.md)&gt;<br/>, repeating:&nbsp;boolean<br/>} | - | 径向渐变。<br/>center:径向渐变的中心点。<br/>radius:径向渐变的半径。<br/>colors:&nbsp;为渐变的颜色描述。<br/>repeating:&nbsp;为渐变的颜色重复着色。 |
| linearGradient | {<br/>angle?:&nbsp;number \| string,<br/>direction?:&nbsp;[GradientDirection](ts-appendix-enums.md#gradientdirection),<br/>colors:&nbsp;Array&lt;[ColorStop](ts-basic-components-gauge.md#colorstop)&gt;,<br/>repeating?:&nbsp;boolean<br/>} | - | 线性渐变。<br/>angle:&nbsp;线性渐变的角度。<br/>direction:&nbsp;线性渐变的方向,设置angle后不生效。<br/>colors:&nbsp;为渐变的颜色描述。<br/>repeating:&nbsp;为渐变的颜色重复着色。 |
| sweepGradient | {<br/>center:&nbsp;Point,<br/>start?:&nbsp;number \| string,<br/>end?:&nbsp;number \| string,<br/>rotation?:&nbsp;number\|string,<br/>colors:&nbsp;Array&lt;[ColorStop](ts-basic-components-gauge.md#colorstop)&gt;,<br/>repeating?:&nbsp;boolean<br/>} | - | 角度渐变。<br/>center:为角度渐变的中心点。<br/>start:角度渐变的起点。<br/>end:角度渐变的终点。<br/>rotation:&nbsp;角度渐变的旋转角度<br/>colors:&nbsp;为渐变的颜色描述。<br/>repeating:&nbsp;为渐变的颜色重复着色。 |
| radialGradient | {<br/>center:&nbsp;Point,<br/>radius:&nbsp;number \| string,<br/>colors:&nbsp;Array&lt;[ColorStop](ts-basic-components-gauge.md#colorstop)&gt;,<br/>repeating?:&nbsp;boolean<br/>} | - | 径向渐变。<br/>center:径向渐变的中心点。<br/>radius:径向渐变的半径。<br/>colors:&nbsp;为渐变的颜色描述。<br/>repeating:&nbsp;为渐变的颜色重复着色。 |
## 示例
......
......@@ -70,7 +70,7 @@
Text('1')
.useSizeType({
xs: { span: 2, offset: 0 },
sm: { span: 2, offset: 0 },
sm: { span: 3, offset: 0 },
md: { span: 6, offset: 2 },
lg: { span: 8, offset: 2 },
})
......@@ -90,7 +90,7 @@ GridContainer() {
Text('1')
.useSizeType({
xs: { span: 2, offset: 0 },
sm: { span: 0, offset: 0 },
sm: { span: 2, offset: 0 },
md: { span: 6, offset: 2 },
lg: { span: 8, offset: 2 },
})
......
......@@ -15,9 +15,9 @@
| 9 | 权限说明 | 以二级标题的形式,标题名为“需要权限”<br/>1. 如果仅系统应用可申请,格式:<br/> ohos.permission.xxxx,仅系统应用可用。<br/>2. 如果该权限所有应用可申请,格式:<br/> ohos.permission.xxxx <br/>3. 如果该接口涉及多个权限,则采用“和、或”进行分割,格式:<br/> ohos.permission.A 和 ohos.permission.B<br/> ohos.permission.A 或 ohos.permission.B |
| 10 | @system api | 1. 如果某个模块全部接口均为system api,则在模块开头的版本说明下一行,增加:<br/> - 本模块接口为系统接口。<br/>2. 如果某个接口为system api,仅供OEM厂商使用,则需要在描述中增加:<br/> **系统接口:** 此接口为系统接口。 |
| 11 | 示例代码语言 | 所有的示例代码采用代码块的样式,并标记开发语言为ts,且在示例代码最开始添加注释`// xxx.ets` |
| 12 | 链接写法 | 格式:[链接文字]\(链接内容)<br/>跨文件夹链接:[指南]\(\.\./../xxx/xxx.md),一个`../`表示上移一层文件夹。<br/>页面内链接:[接口A<sup>7+</sup>]\(#xxxa7),页面内链接和需要链接到的标题保持一致,全小写无特殊符号无标签。 |
| 12 | 链接写法 | 格式:[链接文字]\(链接内容)<br/>跨文件夹链接:[指南]\(\.\./../xxx/xxx.md),一个`../`表示上移一层文件夹。<br/>页面内链接:[接口A<sup>7+</sup>]\(#xxxa7),页面内链接和需要链接到的标题保持一致,全小写无特殊符号(-除外)无标签。 |
下面进入具体每个API的写作。
下面进入具体每个组件接口的写作。
***
......@@ -25,7 +25,7 @@
> *写作说明*
>
> 1. **文档标题**:作为文档标题,要求使用中文短语概括本组件功能;但如果部分概念使用英文更便于开发者理解,可以直接使用。如Button、Silder等。
> 1. **文档标题**:作为文档标题,要求使用中文短语概括本组件功能;但如果部分概念使用英文更便于开发者理解,可以直接使用。如Button、Slider等。
> 2. **标题层级**:文档标题为一级标题,使用`# `;其他字段如function、class、interface、enum、type为二级标题,使用`## `;class下的属性、function为三级标题,使用`### `。
> 3. **起始版本说明**:使用markdown的引用语法“>”对接口的起始版本进行说明,说明后需要换行。<br/>版本说明统一放在模块描述之后。一个模块只会有一个起始版本。<br/>采用标准句式:“本模块首批接口从API version x开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。”x需要修改为对应的版本号。
......@@ -43,7 +43,7 @@
**举例1**:Marquee
跑马灯组件,用于滚动展示一段单行文本,仅当文本内容宽度朝国跑马灯组件宽度时滚动。
跑马灯组件,用于滚动展示一段单行文本,仅当文本内容宽度超过跑马灯组件宽度时滚动。
**举例2**:SideBarContainer
......
......@@ -14,11 +14,11 @@
**用词约定:**
规则:必须遵守的约定
规则:必须遵守的约定
建议:需要加以考虑的约定
建议:需要加以考虑的约定
说明:对此规则或建议进行相应的解释
说明:对此规则或建议进行相应的解释
**文档变更说明:**
| 版本 | 变更说明 |
......@@ -132,7 +132,7 @@ Table 1 接口评审&管控角色
- 对废弃接口增加标识废弃标记。
- 废弃HDI至少保留4个OpenHarmony API版本
- 废弃HDI至少保留4个OpenHarmony API版本
## 接口设计约束
......@@ -158,7 +158,7 @@ Table 1 接口评审&管控角色
int (*OpenLayer)(uint32_t devId, const LayerInfo *layerInfo, uint32_t *layerId);
```
在调用OpenLayer接口时,根据入参layerInfo创建图层数据内存,并返回layerId
在调用OpenLayer接口时,根据入参layerInfo创建图层数据内存,并返回layerId
```cpp
int (*CloseLayer)(uint32_t devId, uint32_t layerId);
......@@ -216,14 +216,14 @@ void WriteReady();
#### 【规则】类、结构体、接口方法、参数等采用驼峰命名风格
__驼峰风格(CamelCase)__
大小写字母混用,单词连在一起,不同单词间通过单词首字母大写来分开。
按连接后的首字母是否大写,又分: 大驼峰(UpperCamelCase)和小驼峰(lowerCamelCase)
按连接后的首字母是否大写,又分: 大驼峰(UpperCamelCase)和小驼峰(lowerCamelCase)
| 类型 | 命名风格 |
| ---------------------------------------- | --------- |
| 接口类型,接口方法,结构体类型,枚举类型,联合体类型等类型定义 | 大驼峰 |
| 函数参数,结构体和联合体中的成员变量 | 小驼峰 |
| 常量,枚举值 | 全大写,下划线分割 |
| 常量,枚举值 | 全大写,下划线分割 |
#### 【规则】接口文件应与接口类同名且使用'.idl'文件后缀
- 每个接口类应定义在独立的接口文件中,并使文件命名与接口类保持一致(大驼峰命名),并以`.idl`后缀结尾。
......
......@@ -3,7 +3,7 @@
烧录是指将编译后的程序文件下载到芯片开发板上的动作,为后续的程序调试提供基础。DevEco Device Tool提供一键烧录功能,操作简单,能快捷、高效的完成程序烧录,提升烧录的效率。
RK3568的镜像烧录通过Winodow环境进行烧录,开发者启动烧录操作后,DevEco Device Tool通过Remote远程模式,将Ubuntu环境下编译生成的带烧录程序文件拷贝至Windows目录下,然后通过Windows的烧录工具将程序文件烧录至开发板中。
RK3568的镜像烧录通过Windows环境进行烧录,开发者启动烧录操作后,DevEco Device Tool通过Remote远程模式,将Ubuntu环境下编译生成的带烧录程序文件拷贝至Windows目录下,然后通过Windows的烧录工具将程序文件烧录至开发板中。
1. [下载](https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/%E7%83%A7%E5%86%99%E5%B7%A5%E5%85%B7%E5%8F%8A%E6%8C%87%E5%8D%97/windows/DriverAssitant_v5.1.1.zip)并安装驱动DriverInstall.exe。
......
......@@ -420,7 +420,7 @@ AI业务子系统是OpenHarmony提供原生的分布式AI能力的子系统。
[ai_engine](https://gitee.com/openharmony/ai_engine)
依赖仓:
## 依赖仓:
[build\_lite](https://gitee.com/openharmony/build_lite/blob/master/README_zh.md)
......@@ -430,4 +430,4 @@ AI业务子系统是OpenHarmony提供原生的分布式AI能力的子系统。
## AI引擎开发导航<a name="section6808423133718"></a>
[《AI插件开发指南》](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-aiframework-guide.md)
\ No newline at end of file
[《AI插件开发指南》](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-ai-aiframework-devguide.md)
\ No newline at end of file
......@@ -10,7 +10,7 @@
## 简介
用户身份和访问管理子系统,下称用户IAM(Identity and Access Management),旨在为OpenHarmony提供统一用户身份凭据信息管理和用户身份认证框架能力,支持多用户分别设置认证凭据信息,并根据用户设置的认证凭据信息提供用户身份认证功能,支撑锁屏等安全场景。同时,用户IAM子系统也提供API,支持三方开发者调用系统提供的身份认证能力来实现业务对用户的访问控制要求。
用户身份和访问管理子系统,下称用户IAM(Identity and Access Management),旨在为OpenHarmony提供统一用户身份凭据信息管理和用户身份认证框架能力,支持多用户分别设置认证凭据信息,并根据用户设置的认证凭据信息提供用户身份认证功能,支撑锁屏等安全场景。同时,用户IAM子系统也提供API,支持三方开发者调用系统提供的身份认证能力来实现业务对用户的访问控制要求。
**图1** 子系统架构图
......
# 系统服务管理子系统<a name="ZH-CN_TOPIC_0000001115719369"></a>
- [系统服务管理子系统<a name="ZH-CN_TOPIC_0000001115719369"></a>](#系统服务管理子系统)
- [简介<a name="section11660541593"></a>](#简介)
- [系统架构<a name="section13587185873516"></a>](#系统架构)
- [目录<a name="section161941989596"></a>](#目录)
- [相关仓<a name="section1371113476307"></a>](#相关仓)
## 简介<a name="section11660541593"></a>
系统服务管理子系统实现系统服务框架,提供系统服务的启动、注册、查询功能,提供查询跨设备的分布式系统服务。
## 系统架构<a name="section13587185873516"></a>
系统服务管理子系统架构如下图所示。
**图 1** 子系统架构图<a name="fig4460722185514"></a>
![](figures/samgr-architecture.png)
系统服务管理子系统主要包含四个组件:
- safwk组件
在系统服务管理子系统中safwk组件定义OpenHarmony中SystemAbility的实现方法,并提供启动、注册等接口实现。
- samgr组件
OpenHarmony的核心组件,提供OpenHarmony系统服务启动、注册、查询等功能。
- safwk_lite组件
轻量foundation进程实现,负责提供基础服务运行的空进程。
- samgr_lite组件
轻量系统服务管理模块,主要提供服务的注册与发现能力。
## 目录<a name="section161941989596"></a>
```
......
......@@ -30,7 +30,7 @@
- API差异报告
- OpenHamrony 3.2 Beta2
- OpenHarmony 3.2 Beta2
- JS API差异报告
- [元能力](release-notes/api-change/v3.2-beta2/js-apidiff-ability.md)
- [无障碍](release-notes/api-change/v3.2-beta2/js-apidiff-accessibility.md)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册