From b27c4ec87f51f33972dd35bad876173820b123e7 Mon Sep 17 00:00:00 2001 From: Gloria Date: Mon, 29 May 2023 15:40:13 +0800 Subject: [PATCH] Update docs against 18085+18225+18682+17373+17376+18483+17866+18417+18340+16365+18334+18326+18220+18415+18054+18094+18329+18332+18343+18337 Signed-off-by: wusongqing --- .../application-models/Readme-EN.md | 6 +- .../ability-startup-with-explicit-want.md | 2 +- .../ability-startup-with-implicit-want.md | 23 +- .../application-models/abilitystage.md | 4 +- .../application-models/actions-entities.md | 12 +- .../app-deviceconfig-switch.md | 2 +- .../application-component-configuration-fa.md | 2 +- ...plication-component-configuration-stage.md | 49 ++++- .../application-context-stage.md | 73 +++--- .../application-model-description.md | 11 +- .../application-models/data-share-via-want.md | 17 +- .../explicit-implicit-want-mappings.md | 96 ++++---- .../extensionability-overview.md | 16 +- .../fa-model-development-overview.md | 8 +- .../figures/application_details.jpg | Bin 0 -> 20903 bytes .../figures/stage-concepts.png | Bin 39111 -> 66964 bytes .../figures/want-action.png | Bin 35106 -> 46564 bytes .../hop-cross-device-migration.md | 56 ++--- .../hop-multi-device-collaboration.md | 24 +- .../application-models/itc-with-emitter.md | 24 +- .../application-models/itc-with-worker.md | 41 ++-- ...mission-set-icon-name-for-task-snapshot.md | 10 +- .../application-models/module-switch.md | 24 +- .../application-models/page-mission-stack.md | 3 +- .../pageability-launch-type.md | 6 +- .../application-models/redirection-rules.md | 4 +- .../serviceextensionability.md | 207 +++++++++--------- .../stage-model-development-overview.md | 6 +- .../application-models/start-page.md | 8 +- .../start-pageability-from-stage.md | 4 +- .../start-remote-pageability.md | 76 ++++--- ...ibe-system-environment-variable-changes.md | 54 ++--- .../application-models/thread-model-stage.md | 5 +- .../uiability-data-sync-with-ui.md | 132 ++++++----- .../uiability-intra-device-interaction.md | 166 +++++++------- .../uiability-launch-type.md | 60 ++--- .../application-models/uiability-lifecycle.md | 126 ++++++----- .../application-models/uiability-overview.md | 8 +- .../application-models/uiability-usage.md | 31 ++- .../application-models/want-overview.md | 45 ++-- .../widget-development-fa.md | 113 +++++----- .../windowextensionability.md | 7 +- 42 files changed, 813 insertions(+), 748 deletions(-) create mode 100644 en/application-dev/application-models/figures/application_details.jpg diff --git a/en/application-dev/application-models/Readme-EN.md b/en/application-dev/application-models/Readme-EN.md index 65d5dc91d9..79230cf32f 100644 --- a/en/application-dev/application-models/Readme-EN.md +++ b/en/application-dev/application-models/Readme-EN.md @@ -20,7 +20,7 @@ - [AccessibilityExtensionAbility](accessibilityextensionability.md) - [EnterpriseAdminExtensionAbility](enterprise-extensionAbility.md) - [InputMethodExtensionAbility](inputmethodextentionability.md) - - [WindowExtensionAbility](windowextensionability.md) + - [WindowExtensionAbility (for System Applications Only)](windowextensionability.md) - Service Widget Development in Stage Model - [Service Widget Overview](service-widget-overview.md) - Developing an ArkTS Widget @@ -52,7 +52,7 @@ - [Want Overview](want-overview.md) - [Matching Rules of Explicit Want and Implicit Want](explicit-implicit-want-mappings.md) - [Common action and entities Values](actions-entities.md) - - [Using Explicit Want to Start an Ability](ability-startup-with-explicit-want.md) + - [Using Explicit Want to Start an Application Component](ability-startup-with-explicit-want.md) - [Using Implicit Want to Open a Website](ability-startup-with-implicit-want.md) - [Using Want to Share Data Between Applications](data-share-via-want.md) - [Component Startup Rules](component-startup-rules.md) @@ -71,7 +71,7 @@ - [Subscribing to Common Events in Static Mode (for System Applications Only)](common-event-static-subscription.md) - [Unsubscribing from Common Events](common-event-unsubscription.md) - [Publishing Common Events](common-event-publish.md) - - [Removing Sticky Common Events](common-event-remove-sticky.md) + - [Removing Sticky Common Events (for System Applications Only)](common-event-remove-sticky.md) - [Background Services](background-services.md) - Thread Model - [Thread Model Overview](thread-model-stage.md) diff --git a/en/application-dev/application-models/ability-startup-with-explicit-want.md b/en/application-dev/application-models/ability-startup-with-explicit-want.md index 6b61b06311..36d41c555b 100644 --- a/en/application-dev/application-models/ability-startup-with-explicit-want.md +++ b/en/application-dev/application-models/ability-startup-with-explicit-want.md @@ -1,4 +1,4 @@ -# Using Explicit Want to Start an Ability +# Using Explicit Want to Start an Application Component When a user touches a button in an application, the application often needs to start a UIAbility component to complete a specific task. If the **abilityName** and **bundleName** parameters are specified when starting a UIAbility, then the explicit Want is used. diff --git a/en/application-dev/application-models/ability-startup-with-implicit-want.md b/en/application-dev/application-models/ability-startup-with-implicit-want.md index dbd65bb560..7d92fbccbd 100644 --- a/en/application-dev/application-models/ability-startup-with-implicit-want.md +++ b/en/application-dev/application-models/ability-startup-with-implicit-want.md @@ -5,21 +5,21 @@ This section uses the operation of using a browser to open a website as an examp ```json { "module": { - // ... + ... "abilities": [ { - // ... + ... "skills": [ { "entities": [ "entity.system.home", "entity.system.browsable" - // ... + ... ], "actions": [ "action.system.home", "ohos.want.action.viewData" - // ... + ... ], "uris": [ { @@ -31,9 +31,9 @@ This section uses the operation of using a browser to open a website as an examp }, { "scheme": "http", - // ... + ... } - // ... + ... ] } ] @@ -59,19 +59,18 @@ function implicitStartAbility() { 'uri': 'https://www.test.com:8080/query/student' } context.startAbility(wantInfo).then(() => { - // ... + ... }).catch((err) => { - // ... + ... }) } ``` The matching process is as follows: -1. If **action** in the passed **want** parameter is specified and is included in **actions** under **skills** of the ability to match, the matching is successful. -2. If **entities** in the passed **want** parameter is specified and is included in **entities** under **skills** of the ability to match, the matching is successful. -3. If **uri** in the passed **want** parameter is included in **uris** under **skills** of the ability to match, which is concatenated into https://www.test.com:8080/query* (where * is a wildcard), the matching is successful. -4. If **type** in the passed **want** parameter is specified and is included in **type** under **skills** of the ability to match, the matching is successful. +1. If **action** in the passed **want** parameter is specified and is included in **actions** under **skills** of the application component to match, the matching is successful. +2. If **entities** in the passed **want** parameter is specified and is included in **entities** under **skills** of the application component to match, the matching is successful. +3. If **uri** in the passed **want** parameter is included in **uris** under **skills** of the application component to match, which is concatenated into https://www.test.com:8080/query* (where * is a wildcard), the matching is successful. If there are multiple matching applications, the system displays a dialog box for you to select one of them. The following figure shows an example. diff --git a/en/application-dev/application-models/abilitystage.md b/en/application-dev/application-models/abilitystage.md index 769c6b4540..da764a445a 100644 --- a/en/application-dev/application-models/abilitystage.md +++ b/en/application-dev/application-models/abilitystage.md @@ -24,7 +24,7 @@ AbilityStage is not automatically generated in the default project of DevEco Stu // When the HAP of the application is loaded for the first time, initialize the module. } onAcceptWant(want) { - // Triggered only for the ability with the specified launch type. + // Triggered only for the UIAbility with the specified launch type. return "MyAbilityStage"; } } @@ -37,7 +37,7 @@ AbilityStage is not automatically generated in the default project of DevEco Stu "name": "entry", "type": "entry", "srcEntry": "./ets/myabilitystage/MyAbilityStage.ts", - // ... + ... } } ``` diff --git a/en/application-dev/application-models/actions-entities.md b/en/application-dev/application-models/actions-entities.md index 5c5aed302c..38119a1b1f 100644 --- a/en/application-dev/application-models/actions-entities.md +++ b/en/application-dev/application-models/actions-entities.md @@ -1,9 +1,8 @@ # Common action and entities Values -**action**: Action to take, such as viewing, sharing, and application details, by the caller. In implicit Want, you can define this field and use it together with **uri** or **parameters** to specify the operation to be performed on the data, for example, viewing URI data. For example, if the URI is a website and the action is **ohos.want.action.viewData**, the ability that supports website viewing is matched. Declaring the **action** field in Want indicates that the invoked application should support the declared operation. The **actions** field under **skills** in the configuration file indicates the operations supported by the application. +The **action** field specifies the common operation (such as viewing, sharing, and application details) to be performed by the caller. In implicit [Want](../reference/apis/js-apis-app-ability-want.md), you can define this field and use it together with **uri** or **parameters** to specify the operation to be performed on the data, for example, viewing URI data. For example, if the URI is a website and the action is **ohos.want.action.viewData**, the application component that supports website viewing is matched. Declaring the **action** field in [Want](../reference/apis/js-apis-app-ability-want.md) indicates that the invoked application is expected to support the declared operation. The **actions** field under **skills** in the configuration file indicates the operations supported by the application. - -**Common action Values** +The following **action** values are available: - **ACTION_HOME**: action of starting the application entry component. It must be used together with **ENTITY_HOME**. The application icon on the home screen is an explicit entry component. Users can touch the icon to start the entry component. Multiple entry components can be configured for an application. @@ -14,14 +13,13 @@ - **ACTION_VIEW_MULTIPLE_DATA**: action of launching the UI for sending multiple data records. -**entities**: Category information (such as browser and video player) of the target ability. It is a supplement to **action** in implicit Want. You can define this field to filter application categories, for example, browser. Declaring the **entities** field in Want indicates that the invoked application should belong to the declared category. The **entities** field under **skills** in the configuration file indicates the categories supported by the application. - +The **entities** field specify the category information (such as browser and video player) of the target application component. It is a supplement to **action** in implicit Want. You can define this field to filter application categories, for example, browser. Declaring the **entities** field in Want indicates that the invoked application should belong to the declared category. The **entities** field under **skills** in the configuration file indicates the categories supported by the application. -**Common entities Values** +The following **entities** values are available: - **ENTITY_DEFAULT**: default category, which is meaningless. -- **ENTITY_HOME**: abilities with an icon displayed on the home screen. +- **ENTITY_HOME**: application components with an icon displayed on the home screen. - **ENTITY_BROWSABLE**: browser type. diff --git a/en/application-dev/application-models/app-deviceconfig-switch.md b/en/application-dev/application-models/app-deviceconfig-switch.md index 1092c21081..6c872f0c16 100644 --- a/en/application-dev/application-models/app-deviceconfig-switch.md +++ b/en/application-dev/application-models/app-deviceconfig-switch.md @@ -22,7 +22,7 @@ OpenHarmony has reconstructed the [deviceConfig](../quick-start/deviceconfig-str | deviceConfig in the FA Model| Description| Stage Model| Difference| | -------- | -------- | -------- | -------- | | deviceConfig| Device information.| / | This tag is no longer available in the stage model. In the stage model, device information is configured under the **app** tag.| -| process | Name of the process running the application or ability. If the **process** attribute is configured in the **deviceConfig** tag, all abilities of the application run in this process. You can set the **process** attribute for a specific ability in the **abilities** attribute, so that the ability can run in the particular process.| / | The stage model does not support the configuration of process names.| +| process | Name of the process running the application or UIAbility. If the **process** attribute is configured in the **deviceConfig** tag, all UIAbilities of the application run in this process. You can set the **process** attribute for a specific UIAbility in the **abilities** attribute, so that the UIAbility can run in the particular process.| / | The stage model does not support the configuration of process names.| | keepAlive | Whether the application is always running. This attribute applies only to system applications and does not take effect for third-party applications.| / | The stage model does not support changing of the model control mode for system applications.| | supportBackup | Whether the application supports data backup and restore.| / | This configuration is not supported in the stage model.| | compressNativeLibs | Whether the **libs** libraries are packaged in the HAP file after being compressed.| / | This configuration is not supported in the stage model.| diff --git a/en/application-dev/application-models/application-component-configuration-fa.md b/en/application-dev/application-models/application-component-configuration-fa.md index 4cc1c9ad68..336ad698d0 100644 --- a/en/application-dev/application-models/application-component-configuration-fa.md +++ b/en/application-dev/application-models/application-component-configuration-fa.md @@ -22,7 +22,7 @@ When developing an application, you may need to configure certain tags to identi "actions": ["action.system.home"] } ] - // ... + ... } ``` diff --git a/en/application-dev/application-models/application-component-configuration-stage.md b/en/application-dev/application-models/application-component-configuration-stage.md index bcf9b09546..b50d40b4a6 100644 --- a/en/application-dev/application-models/application-component-configuration-stage.md +++ b/en/application-dev/application-models/application-component-configuration-stage.md @@ -1,10 +1,12 @@ # Application- or Component-Level Configuration (Stage Model) +When developing an application, you may need to configure certain tags to identify the application, such as the bundle name and application icon. This topic describes key tags that need to be configured during application development. -When developing an application, you may need to configure certain tags to identify the application, such as the bundle name and application icon. This topic describes key tags that need to be configured during application development. Icons and labels are usually configured together. There is the application icon, application label, entry icon, and entry label, which correspond to the **icon** and **label** fields in the [app.json5 file](../quick-start/app-configuration-file.md) and [module.json5 file](../quick-start/module-configuration-file.md). The application icon and label are used in **Settings**. For example, they are displayed in the application list in **Settings**. The entry icon is displayed on the device's home screen after the application is installed. The entry icon maps to a [UIAbility](uiability-overview.md) component. Therefore, an application can have multiple entry icons and labels. When you touch one of them, the corresponding UIAbility page is displayed. +Icons and labels are usually configured together. There is the application icon, application label, entry icon, and entry label, which correspond to the **icon** and **label** fields in the [app.json5 file](../quick-start/app-configuration-file.md) and [module.json5 file](../quick-start/module-configuration-file.md). +The application icon and label are used in **Settings**. For example, they are displayed in the application list in **Settings**. The entry icon is displayed on the device's home screen after the application is installed. The entry icon maps to a [UIAbility](uiability-overview.md) component. Therefore, an application can have multiple entry icons and entry labels. When you touch one of them, the corresponding UIAbility page is displayed. - **Figure 1** Icons and labels +**Figure 1** Icons and labels ![application-component-configuration-stage](figures/application-component-configuration-stage.png) @@ -22,13 +24,13 @@ When developing an application, you may need to configure certain tags to identi The application label is specified by the **label** field in the [app.json5 file](../quick-start/app-configuration-file.md) in the **AppScope** module of the project. The **label** field specifies the application name displayed to users. It must be set to the index of a string resource. ```json - { - "app": { - "icon": "$media:app_icon", - "label": "$string:app_name" - // ... - } + { + "app": { + "icon": "$media:app_icon", + "label": "$string:app_name" + ... } + } ``` - **Configuring the entry icon and label** @@ -40,7 +42,7 @@ When developing an application, you may need to configure certain tags to identi ```json { "module": { - // ... + ... "abilities": [ { // The information starting with $ is the resource value. @@ -61,6 +63,35 @@ When developing an application, you may need to configure certain tags to identi } } ``` + OpenHarmony strictly controls applications without icons to prevent malicious applications from deliberately configuring no icon to block uninstall attempts. + + To hide an application icon from the home screen, you must configure the **AllowAppDesktopIconHide** privilege. For details, see [Application Privilege Configuration Guide](../../device-dev/subsystems/subsys-app-privilege-config-guide.md). The rules for displaying the entry icon and entry label are as follows: + + 1. The HAP file contains UIAbility configuration. + * An entry icon is set in the **abilities** field of the **module.json5** file. + * The application does not have the privilege to hide its icon from the home screen. + * The system uses the icon configured for the UIAbility as the entry icon and displays it on the home screen. Touching this icon will direct the user to the home page of the UIAbility. + * The system uses the label configured for the UIAbility as the entry label and displays it on the home screen. If no label is configured, the system uses the label specified in the **app.json5** file as the entry label and displays it on the home screen. + * The application has the privilege to hide its icon from the home screen. + * The application information is not returned when the home screen queries the information, and the entry icon and label of the application are not displayed on the home screen. + * No entry icon is set in the **abilities** field of the **module.json5** file. + * The application does not have the privilege to hide its icon from the home screen. + * The system uses the icon specified in the **app.json5** file as the entry icon and displays it on the home screen. Touching this icon will direct the user to the application details page, as shown below. + * The system uses the label specified in the **app.json5** file as the entry label and displays it on the home screen. + * The application has the privilege to hide its icon from the home screen. + * The application information is not returned when the home screen queries the information, and the entry icon and label of the application are not displayed on the home screen. + + 2. The HAP file does not contain UIAbility configuration. + * The application does not have the privilege to hide its icon from the home screen. + * The system uses the icon specified in the **app.json5** file as the entry icon and displays it on the home screen. Touching this icon will direct the user to the application details page, as shown below. + * The system uses the label specified in the **app.json5** file as the entry label and displays it on the home screen. + * The application has the privilege to hide its icon from the home screen. + * The application information is not returned when the home screen queries the information, and the entry icon and label of the application are not displayed on the home screen. + + **Figure 2** Application details page + + ![Application details page](figures/application_details.jpg) + - **Configuring application version declaration** To declare the application version, configure the **versionCode** and **versionName** fields in the [app.json5 file](../quick-start/app-configuration-file.md) in the **AppScope** directory of the project. **versionCode** specifies the version number of the application. The value is a 32-bit non-negative integer. It is used only to determine whether a version is later than another version. A larger value indicates a later version. **versionName** provides the text description of the version number. diff --git a/en/application-dev/application-models/application-context-stage.md b/en/application-dev/application-models/application-context-stage.md index 3fc6df944c..2063eee286 100644 --- a/en/application-dev/application-models/application-context-stage.md +++ b/en/application-dev/application-models/application-context-stage.md @@ -1,19 +1,16 @@ # Context (Stage Model) - ## Overview -[Context](../reference/apis/js-apis-inner-application-context.md) is the context of an object in an application. It provides basic information about the application, for example, **resourceManager**, **applicationInfo**, **dir** (application development path), and **area** (encryption level). It also provides basic methods such as **createBundleContext()** and **getApplicationContext()**. The UIAbility component and ExtensionAbility derived class components have their own **Context** classes, for example, the base class **Context**, **ApplicationContext**, **AbilityStageContext**, **UIAbilityContext**, **ExtensionContext**, and **ServiceExtensionContext**. +[Context](../reference/apis/js-apis-inner-application-context.md) is the context of an object in an application. It provides basic information about the application, for example, **resourceManager**, **applicationInfo**, **dir** (application development path), and **area** (encrypted level). It also provides basic methods such as **createBundleContext()** and **getApplicationContext()**. The UIAbility component and ExtensionAbility derived class components have their own **Context** classes, for example, the base class **Context**, **ApplicationContext**, **AbilityStageContext**, **UIAbilityContext**, **ExtensionContext**, and **ServiceExtensionContext**. - The figure below illustrates the inheritance relationship of contexts. - ![context-inheritance](figures/context-inheritance.png) - + - The figure below illustrates the holding relationship of contexts. - ![context-holding](figures/context-holding.png) -- The following describes the information provided by different contexts. +The following describes the information provided by different contexts. - [UIAbilityContext](../reference/apis/js-apis-inner-application-uiAbilityContext.md): Each UIAbility has the **Context** attribute, which provides APIs to operate an application component, obtain the application component configuration, and more. ```ts @@ -21,7 +18,7 @@ export default class EntryAbility extends UIAbility { onCreate(want, launchParam) { let uiAbilityContext = this.context; - // ... + ... } } ``` @@ -36,7 +33,7 @@ export default class MyService extends ServiceExtensionAbility { onCreate(want) { let serviceExtensionContext = this.context; - // ... + ... } } ``` @@ -47,7 +44,7 @@ export default class MyAbilityStage extends AbilityStage { onCreate() { let abilityStageContext = this.context; - // ... + ... } } ``` @@ -58,7 +55,7 @@ export default class EntryAbility extends UIAbility { onCreate(want, launchParam) { let applicationContext = this.context.getApplicationContext(); - // ... + ... } } ``` @@ -84,13 +81,13 @@ The following table describes the application development paths obtained from co | Name| Type| Readable| Writable| Description| | -------- | -------- | -------- | -------- | -------- | -| bundleCodeDir | string | Yes | No | Path for storing the application's installation package, that is, installation directory of the application on the internal storage. Do not access resource files by concatenating paths. Use [@ohos.resourceManager] instead. | -| cacheDir | string | Yes| No| Path for storing the application's cache files, that is, cache directory of the application on the internal storage.
It is the content of **Storage** of an application under **Settings > Apps & services > Apps**.| -| filesDir | string | Yes | No | Path for storing the application's common files, that is, file directory of the application on the internal storage.
Files in this directory may be synchronized to other directories during application migration or backup.| -| preferencesDir | string | Yes | Yes | Path for storing the application's preference files, that is, preferences directory of the application. | -| tempDir | string | Yes | No | Path for storing the application's temporary files.
Files in this directory are deleted after the application is uninstalled.| +| bundleCodeDir | string | Yes | No | Path for storing the application's installation package, that is, installation directory of the application on the internal storage. | +| cacheDir | string | Yes| No| Path for storing the cache files, that is, cache directory of the application on the internal storage.
It is the content of **Storage** of an application under **Settings > Apps & services > Apps**.| +| filesDir | string | Yes | No | Path for storing the common files, that is, file directory of the application on the internal storage.
Files in this directory may be synchronized to other directories during application migration or backup.| +| preferencesDir | string | Yes | Yes | Path for storing the preference files, that is, preferences directory of the application. | +| tempDir | string | Yes | No | Path for storing the temporary files.
Files in this directory are deleted after the application is uninstalled.| | databaseDir | string | Yes | No | Path for storing the application's database, that is, storage directory of the local database. | -| distributedFilesDir | string | Yes| No| Path for storing the application's distributed files.| +| distributedFilesDir | string | Yes| No| Path for storing the distributed files.| The capability of obtaining the application development path is provided by the base class **Context**. This capability is also provided by **ApplicationContext**, **AbilityStageContext**, **UIAbilityContext**, and **ExtensionContext**. However, the paths obtained from different contexts may differ, as shown below. @@ -135,7 +132,7 @@ export default class EntryAbility extends UIAbility { let bundleCodeDir = this.context.bundleCodeDir; let distributedFilesDir = this.context.distributedFilesDir; let preferencesDir = this.context.preferencesDir; - // ... + ... } } ``` @@ -187,13 +184,13 @@ The base class **Context** provides [createBundleContext(bundleName:string)](../ > **NOTE** > > To obtain the context of another application: - > + > > - Request the **ohos.permission.GET_BUNDLE_INFO_PRIVILEGED** permission. For details, see [Declaring Permissions in the Configuration File](../security/accesstoken-guidelines.md#declaring-permissions-in-the-configuration-file). - > + > > - This is a system API and cannot be called by third-party applications. For example, application information displayed on the home screen includes the application name and icon. The home screen application calls the foregoing method to obtain the context information, so as to obtain the resource information including the application name and icon. - + ```ts import UIAbility from '@ohos.app.ability.UIAbility'; @@ -202,7 +199,7 @@ The base class **Context** provides [createBundleContext(bundleName:string)](../ let bundleName2 = 'com.example.application'; let context2 = this.context.createBundleContext(bundleName2); let label2 = context2.applicationInfo.label; - // ... + ... } } ``` @@ -224,7 +221,7 @@ The base class **Context** provides [createBundleContext(bundleName:string)](../ let bundleName2 = 'com.example.application'; let moduleName2 = 'module1'; let context2 = this.context.createModuleContext(bundleName2, moduleName2); - // ... + ... } } ``` @@ -238,7 +235,7 @@ The base class **Context** provides [createBundleContext(bundleName:string)](../ onCreate(want, launchParam) { let moduleName2 = 'module1'; let context2 = this.context.createModuleContext(moduleName2); - // ... + ... } } ``` @@ -266,53 +263,53 @@ export default class EntryAbility extends UIAbility { let abilityLifecycleCallback = { // Called when a UIAbility is created. onAbilityCreate(uiAbility) { - console.log(TAG, `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); + console.info(TAG, `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); }, // Called when a window is created. onWindowStageCreate(uiAbility, windowStage: window.WindowStage) { - console.log(TAG, `onWindowStageCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); - console.log(TAG, `onWindowStageCreate windowStage: ${JSON.stringify(windowStage)}`); + console.info(TAG, `onWindowStageCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); + console.info(TAG, `onWindowStageCreate windowStage: ${JSON.stringify(windowStage)}`); }, // Called when the window becomes active. onWindowStageActive(uiAbility, windowStage: window.WindowStage) { - console.log(TAG, `onWindowStageActive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); - console.log(TAG, `onWindowStageActive windowStage: ${JSON.stringify(windowStage)}`); + console.info(TAG, `onWindowStageActive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); + console.info(TAG, `onWindowStageActive windowStage: ${JSON.stringify(windowStage)}`); }, // Called when the window becomes inactive. onWindowStageInactive(uiAbility, windowStage: window.WindowStage) { - console.log(TAG, `onWindowStageInactive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); - console.log(TAG, `onWindowStageInactive windowStage: ${JSON.stringify(windowStage)}`); + console.info(TAG, `onWindowStageInactive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); + console.info(TAG, `onWindowStageInactive windowStage: ${JSON.stringify(windowStage)}`); }, // Called when the window is destroyed. onWindowStageDestroy(uiAbility, windowStage: window.WindowStage) { - console.log(TAG, `onWindowStageDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); - console.log(TAG, `onWindowStageDestroy windowStage: ${JSON.stringify(windowStage)}`); + console.info(TAG, `onWindowStageDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); + console.info(TAG, `onWindowStageDestroy windowStage: ${JSON.stringify(windowStage)}`); }, // Called when the UIAbility is destroyed. onAbilityDestroy(uiAbility) { - console.log(TAG, `onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); + console.info(TAG, `onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); }, // Called when the UIAbility is switched from the background to the foreground. onAbilityForeground(uiAbility) { - console.log(TAG, `onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); + console.info(TAG, `onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); }, // Called when the UIAbility is switched from the foreground to the background. onAbilityBackground(uiAbility) { - console.log(TAG, `onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); + console.info(TAG, `onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); }, // Called when UIAbility is continued on another device. onAbilityContinue(uiAbility) { - console.log(TAG, `onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); + console.info(TAG, `onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`); } } // Obtain the application context. let applicationContext = this.context.getApplicationContext(); // Register the application lifecycle callback. this.lifecycleId = applicationContext.on('abilityLifecycle', abilityLifecycleCallback); - console.log(TAG, `register callback number: ${this.lifecycleId}`); + console.info(TAG, `register callback number: ${this.lifecycleId}`); } - // ... + ... onDestroy() { // Obtain the application context. diff --git a/en/application-dev/application-models/application-model-description.md b/en/application-dev/application-models/application-model-description.md index 0cdfa7323c..20fa9019d1 100644 --- a/en/application-dev/application-models/application-model-description.md +++ b/en/application-dev/application-models/application-model-description.md @@ -12,10 +12,9 @@ Along its evolution, OpenHarmony has provided two application models: The stage model is designed based on the following considerations, which make it become the recommended model: 1. **Designed for complex applications** - - In the stage model, multiple application components share an ArkTS engine (VM running the programming language ArkTS) instance, making it easy for application components to share objects and status while requiring less memory. - The object-oriented development mode makes the code of complex applications easy to read, maintain, and scale. - + 2. **Native support for [cross-device migration](hop-cross-device-migration.md) and [multi-device collaboration](hop-multi-device-collaboration.md) at the application component level** The stage model decouples application components from User Interfaces (UIs). @@ -38,7 +37,7 @@ The stage model is designed based on the following considerations, which make it The stage model redefines the boundary of application capabilities to well balance application capabilities and system management costs. - - Diverse application components (such as widgets and input methods) for specific scenarios. + - Diverse application components (such as service widgets and input methods) for specific scenarios. - Standardized background process management. To deliver a better user experience, the stage model manages background application processes in a more orderly manner. Applications cannot reside in the background randomly, and their background behavior is strictly managed to minimize malicious behavior. @@ -52,8 +51,8 @@ The table below describes their differences in detail. | Item| FA model| Stage model| | -------- | -------- | -------- | -| **Application component**| 1. Component classification
![fa-model-component](figures/fa-model-component.png)
- PageAbility: has the UI and supports user interaction For details, see [PageAbility Component Overview](pageability-overview.md).
- ServiceAbility: provides background services and has no UI. For details, see [ServiceAbility Component Overview](serviceability-overview.md).
- DataAbility: provides the data sharing capability and has no UI. For details, see [DataAbility Component Overview](dataability-overview.md).
2. Development mode
Application components are specified by exporting anonymous objects and fixed entry files. You cannot perform derivation. It is inconvenient for capability expansion. | 1. Component classification
![stage-model-component](figures/stage-model-component.png)
- UIAbility: has the UI and supports user interaction. For details, see [UIAbility Component Overview](uiability-overview.md).
- ExtensionAbility: provides extension capabilities (such as widget and input methods) for specific scenarios. For details, see [ExtensionAbility Component Overview](extensionability-overview.md).
2. Development mode
The object-oriented mode is used to provide open application components as classes. You can derive application components for capability expansion. | -| **Process model**| There are two types of processes:
1. Main process
2. Rendering process
For details, see [Process Model (FA Model)](process-model-fa.md).| There are three types of processes:
1. Main process
2. ExtensionAbility process
3. Rendering process
For details, see [Process Model (Stage Model)](process-model-stage.md).| -| **Thread model**| 1. ArkTS engine instance creation
A process can run multiple application component instances, and each application component instance runs in an independent ArkTS engine instance.
2. Thread model
Each ArkTS engine instance is created on an independent thread (non-main thread). The main thread does not have an ArkTS engine instance.
3. Intra-process object sharing: not supported.
For details, see [Thread Model (FA Model)](thread-model-fa.md).| 1. ArkTS engine instance creation
A process can run multiple application component instances, and all application component instances share one ArkTS engine instance.
2. Thread model
The ArkTS engine instance is created on the main thread.
3. Intra-process object sharing: supported.
For details, see [Thread Model (Stage Model)](thread-model-stage.md).| +| **Application component**| 1. Component classification
![fa-model-component](figures/fa-model-component.png)
- PageAbility: has the UI and supports user interaction For details, see [PageAbility Component Overview](pageability-overview.md).
- ServiceAbility: provides background services and has no UI. For details, see [ServiceAbility Component Overview](serviceability-overview.md).
- DataAbility: provides the data sharing capability and has no UI. For details, see [DataAbility Component Overview](dataability-overview.md).
2. Development mode
Application components are specified by exporting anonymous objects and fixed entry files. You cannot perform derivation. It is inconvenient for capability expansion.| 1. Component classification
![stage-model-component](figures/stage-model-component.png)
- UIAbility: has the UI and supports user interaction. For details, see [UIAbility Component Overview](uiability-overview.md).
- ExtensionAbility: provides extension capabilities (such as widget and input methods) for specific scenarios. For details, see [ExtensionAbility Component Overview](extensionability-overview.md).
2. Development mode
The object-oriented mode is used to provide open application components as classes. You can derive application components for capability expansion.| +| **Process model**| There are two types of processes:
1. Main process
2. Rendering process
For details, see [Process Model Overview (FA Model)](process-model-fa.md). | There are three types of processes:
1. Main process
2. ExtensionAbility process
3. Rendering process
For details, see [Process Model Overview (Stage Model)](process-model-stage.md). | +| **Thread model**| 1. ArkTS engine instance creation
A process can run multiple application component instances, and each application component instance runs in an independent ArkTS engine instance.
2. Thread model
Each ArkTS engine instance is created on an independent thread (non-main thread). The main thread does not have an ArkTS engine instance.
3. Intra-process object sharing: not supported.
For details, see [Thread Model Overview (FA Model)](thread-model-fa.md). | 1. ArkTS engine instance creation
A process can run multiple application component instances, and all application component instances share one ArkTS engine instance.
2. Thread model
The ArkTS engine instance is created on the main thread.
3. Intra-process object sharing: supported.
For details, see [Thread Model Overview (Stage Model)](thread-model-stage.md). | | **Mission management model**| - A mission is created for each PageAbility component instance.
- Missions are stored persistently until the number of missions exceeds the maximum (customized based on the product configuration) or users delete missions.
- PageAbility components do not form a stack structure.
For details, see [Mission Management Scenarios](mission-management-overview.md).| - A mission is created for each UIAbility component instance.
- Missions are stored persistently until the number of missions exceeds the maximum (customized based on the product configuration) or users delete missions.
- UIAbility components do not form a stack structure.
For details, see [Mission Management Scenarios](mission-management-overview.md).| | **Application configuration file**| The **config.json** file is used to describe the application, HAP, and application component information.
For details, see [Application Configuration File Overview (FA Model)](../quick-start/application-configuration-file-overview-fa.md).| The **app.json5** file is used to describe the application information, and the **module.json5** file is used to describe the HAP and application component information.
For details, see [Application Configuration File Overview (Stage Model)](../quick-start/application-configuration-file-overview-stage.md).| diff --git a/en/application-dev/application-models/data-share-via-want.md b/en/application-dev/application-models/data-share-via-want.md index d5512e0c44..28184edbc9 100644 --- a/en/application-dev/application-models/data-share-via-want.md +++ b/en/application-dev/application-models/data-share-via-want.md @@ -48,9 +48,9 @@ function implicitStartAbility() { } } context.startAbility(wantInfo).then(() => { - // ... + ... }).catch((err) => { - // ... + ... }) } ``` @@ -66,8 +66,7 @@ In the preceding code, under the custom field **parameters**, the following **ab - **ability.picker.fileSizes**: file size, in bytes. - **ability.picker.fileNames** and **ability.picker.fileSizes** are arrays and have a one-to-one mapping. -The following figure shows an example. - +The following figure shows an example. ![](figures/ability-startup-with-implicit-want2.png) ## Shared Party @@ -77,17 +76,17 @@ To enable the shared party to identify the shared content, configure **skills** ```json { "module": { - // ... + ... "abilities": [ { - // ... + ... "skills": [ { - // ... + ... "actions": [ "action.system.home", "ohos.want.action.sendData" - // ... + ... ], "uris": [ { @@ -102,7 +101,7 @@ To enable the shared party to identify the shared content, configure **skills** } ``` -After the user selects an application, the Want nested in the **ability.want.params.INTENT** field is passed to that application. The UIAbility of the shared party, after being started, can call [onCreate()](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityoncreate) or [onNewWant()](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityonnewwant) to obtain the passed Want. +After the user selects an application, the Want nested in the **ability.want.params.INTENT** field is passed to that application. After the UIAbility of the application starts, the application obtains **want** information from [**onCreate()**](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityoncreate) or [**onNewWant()**](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityonnewwant). The following is an example of the Want obtained. You can use the FD of the shared file to perform required operations. diff --git a/en/application-dev/application-models/explicit-implicit-want-mappings.md b/en/application-dev/application-models/explicit-implicit-want-mappings.md index 9e748a3179..454fc89d71 100644 --- a/en/application-dev/application-models/explicit-implicit-want-mappings.md +++ b/en/application-dev/application-models/explicit-implicit-want-mappings.md @@ -1,28 +1,28 @@ # Matching Rules of Explicit Want and Implicit Want -Both explicit Want and implicit Want can be used to match an ability to start based on certain rules. These rules determine how the parameters set in Want match the configuration file declared by the target ability. +Both explicit [Want](../reference/apis/js-apis-app-ability-want.md) and implicit [Want](../reference/apis/js-apis-app-ability-want.md) can be used to match an application component to start based on certain rules. These rules determine how the parameters set in [want](../reference/apis/js-apis-app-ability-want.md) match the configuration file declared by the target application component. ## Matching Rules of Explicit Want -The table below describes the matching rules of explicit Want. +The table below describes the matching rules of explicit [Want](../reference/apis/js-apis-app-ability-want.md). | Name| Type| Matching Item| Mandatory| Rule Description| | -------- | -------- | -------- | -------- | -------- | -| deviceId | string | Yes| No| If this field is unspecified, only abilities on the local device are matched.| +| deviceId | string | Yes| No| If this field is unspecified, only application components on the local device are matched.| | bundleName | string | Yes| Yes| If **abilityName** is specified but **bundleName** is unspecified, the matching fails.| -| moduleName | string | Yes| No| If this field is unspecified and multiple modules with the same ability name exist in the application, the first ability is matched by default.| +| moduleName | string | Yes| No| If this field is unspecified and multiple modules with the same ability name exist in the application, the first application component is matched by default.| | abilityName | string | Yes| Yes| To use explicit Want, this field must be specified.| -| uri | string | No| No| This field is not used for matching. It is passed to the target ability as a parameter.| -| type | string | No| No| This field is not used for matching. It is passed to the target ability as a parameter.| -| action | string | No| No| This field is not used for matching. It is passed to the target ability as a parameter.| -| entities | Array<string> | No| No| This field is not used for matching. It is passed to the target ability as a parameter.| +| uri | string | No| No| This field is not used for matching. It is passed to the target application component as a parameter.| +| type | string | No| No| This field is not used for matching. It is passed to the target application component as a parameter.| +| action | string | No| No| This field is not used for matching. It is passed to the target application component as a parameter.| +| entities | Array<string> | No| No| This field is not used for matching. It is passed to the target application component as a parameter.| | flags | number | No| No| This field is not used for matching and is directly transferred to the system for processing. It is generally used to set runtime information, such as URI data authorization.| -| parameters | {[key: string]: any} | No| No| This field is not used for matching. It is passed to the target ability as a parameter.| +| parameters | {[key: string]: any} | No| No| This field is not used for matching. It is passed to the target application component as a parameter.| ## Matching Rules for Implicit Want -The table below describes the matching rules of implicit Want. +The table below describes the matching rules of implicit [Want](../reference/apis/js-apis-app-ability-want.md). | Name | Type | Matching Item| Mandatory| Rule Description | | ----------- | ------------------------------ | ------ | ---- | ------------------------------------------------------------ | @@ -35,30 +35,32 @@ The table below describes the matching rules of implicit Want. | action | string | Yes | No | | | entities | Array<string> | Yes | No | | | flags | number | No | No | This field is not used for matching and is directly transferred to the system for processing. It is generally used to set runtime information, such as URI data authorization.| -| parameters | {[key: string]: any} | No | No | This field is not used for matching. It is passed to the target ability as a parameter. | +| parameters | {[key: string]: any} | No | No | This field is not used for matching. It is passed to the target application component as a parameter. | Get familiar with the following about implicit Want: - The **want** parameter passed by the caller indicates the operation to be performed by the caller. It also provides data and application type restrictions. -- The **skills** field declares the capabilities of the target ability. For details, see [the skills tag](../quick-start/module-configuration-file.md#skills) in the [module.json5 file](../quick-start/module-configuration-file.md). +- The **skills** field declares the capabilities of the target application component. For details, see [the skills tag](../quick-start/module-configuration-file.md#skills) in the [module.json5 file](../quick-start/module-configuration-file.md). -The system matches the **want** parameter (including the **action**, **entities**, **uri**, and **type** attributes) passed by the caller against the **skills** configuration (including the **actions**, **entities**, **uris**, and **type** attributes) of the abilities one by one. When all the four attributes are matched, a dialog box is displayed for users to select a matched application. +The system matches the **want** parameter (including the **action**, **entities**, **uri**, and **type** attributes) passed by the caller against the **skills** configuration (including the **actions**, **entities**, **uris**, and **type** attributes) of the application components one by one. When all the four attributes are matched, a dialog box is displayed for users to select a matched application. ### Matching Rules of action in the want Parameter -The system matches the **action** attribute in the **want** parameter passed by the caller against **actions** under **skills** of the abilities. +The system matches the **action** attribute in the **want** parameter passed by the caller against **actions** under **skills** of the application components. -- If **action** in the passed **want** parameter is specified but **actions** under **skills** of an ability is unspecified, the matching fails. +- If **action** in the passed **want** parameter is unspecified and **actions** under **skills** of an application component is unspecified, the matching fails. -- If **action** in the passed **want** parameter is unspecified but **actions** under **skills** of an ability is specified, the matching is successful. +- If **action** in the passed **want** parameter is specified but **actions** under **skills** of an application component is unspecified, the matching fails. -- If **action** in the passed **want** parameter is specified, and **actions** under **skills** of an ability is specified and contains **action** in the passed **want** parameter, the matching is successful. +- If **action** in the passed **want** parameter is unspecified but **actions** under **skills** of an application component is specified, the matching is successful. -- If **action** in the passed **want** parameter is specified, and **actions** under **skills** of an ability is specified but does not contain **action** in the passed **want** parameter, the matching fails. +- If **action** in the passed **want** parameter is specified, and **actions** under **skills** of an application component is specified and contains **action** in the passed **want** parameter, the matching is successful. + +- If **action** in the passed **want** parameter is specified, and **actions** under **skills** of an application component is specified but does not contain **action** in the passed **want** parameter, the matching fails. **Figure 1** Matching rules of action in the want parameter @@ -67,55 +69,56 @@ The system matches the **action** attribute in the **want** parameter passed by ### Matching Rules of entities in the want Parameter -The system matches the **entities** attribute in the **want** parameter passed by the caller against **entities** under **skills** of the abilities. +The system matches the **entities** attribute in the **want** parameter passed by the caller against **entities** under **skills** of the application components. -- If **entities** in the passed **want** parameter is unspecified but **entities** under **skills** of an ability is specified, the matching is successful. +- If **entities** in the passed **want** parameter is unspecified but **entities** under **skills** of an application component is specified, the matching is successful. -- If **entities** in the passed **want** parameter is unspecified but **entities** under **skills** of an ability is unspecified, the matching is successful. +- If **entities** in the passed **want** parameter is unspecified but **entities** under **skills** of an application component is unspecified, the matching is successful. -- If **entities** in the passed **want** parameter is specified but **entities** under **skills** of an ability is unspecified, the matching fails. +- If **entities** in the passed **want** parameter is specified but **entities** under **skills** of an application component is unspecified, the matching fails. -- If **entities** in the passed **want** parameter is specified, and **entities** under **skills** of an ability is specified and contains **entities** in the passed **want** parameter, the matching is successful. +- If **entities** in the passed **want** parameter is specified, and **entities** under **skills** of an application component is specified and contains **entities** in the passed **want** parameter, the matching is successful. -- If **entities** in the passed **want** parameter is specified, and **entities** under **skills** of an ability is specified but does not contain **entities** in the passed **want** parameter, the matching fails. +- If **entities** in the passed **want** parameter is specified, and **entities** under **skills** of an application component is specified but does not contain **entities** in the passed **want** parameter, the matching fails. - **Figure 2** Matching rule of entities in the want parameter + **Figure 2** Matching rules of entities in the want parameter ![want-entities](figures/want-entities.png) ### Matching Rules of uri and type in the want Parameter -When the **uri** and **type** parameters are specified in the **want** parameter to initiate a component startup request, the system traverses the list of installed components and matches the **uris** array under **skills** of the abilities one by one. If one of the **uris** arrays under **skills** matches the **uri** and **type** in the passed **want**, the matching is successful. +When the **uri** and **type** parameters are specified in the **want** parameter to initiate an application component startup request, the system traverses the list of installed components and matches the **uris** array under **skills** of the application components one by one. If one of the **uris** arrays under **skills** matches the **uri** and **type** in the passed **want**, the matching is successful. There are four combinations of **uri** and **type** settings. The matching rules are as follows: - Neither **uri** or **type** is specified in the **want** parameter. - - If the **uris** array under **skills** of an ability is unspecified, the matching is successful. - - If the **uris** array under **skills** of an ability contains an URI element whose **scheme** and **type** are unspecified, the matching is successful. + - If the **uris** array under **skills** of an application component is unspecified, the matching is successful. + - If the **uris** array under **skills** of an application component contains an URI element whose **scheme** and **type** are unspecified, the matching is successful. - In other cases, the matching fails. - Only **uri** is specified in the **want** parameter. - - If the **uris** array under **skills** of an ability is unspecified, the matching fails. - - If the **uris** array under **skills** of an ability contains an element whose [uri is matched](#matching-rules-of-uri) and **type** is unspecified, the matching is successful. Otherwise, the matching fails. + - If the **uris** array under **skills** of an application component is unspecified, the matching fails. + - If the **uris** array under **skills** of an application component contains an element whose [uri is matched](#matching-rules-of-uri) and **type** is unspecified, the matching is successful. Otherwise, the matching fails. - Only **type** is specified in the **want** parameter. - - If the **uris** array under **skills** of an ability is unspecified, the matching fails. - - If the **uris** array under **skills** of an ability contains an URI element whose **scheme** is unspecified and [type is matched](#matching-rules-of-type), the matching is successful. Otherwise, the matching fails. + - If the **uris** array under **skills** of an application component is unspecified, the matching fails. + - If the **uris** array under **skills** of an application component contains an URI element whose **scheme** is unspecified and [type is matched](#matching-rules-of-type), the matching is successful. Otherwise, the matching fails. -- Both **uri** and **type** are specified in the **want** parameter, as shown in Figure 3. - - If the **uris** array under **skills** of an ability is unspecified, the matching fails. - - If the **uris** array under **skills** of an ability contains an element whose [uri is matched](#matching-rules-of-uri) and [type is matched](#matching-rules-of-type), the matching is successful. Otherwise, the matching fails. +- Both **uri** and **type** are specified in the **want** parameter, as shown below. + - If the **uris** array under **skills** of an application component is unspecified, the matching fails. + - If the **uris** array under **skills** of an application component contains an element whose [uri is matched](#matching-rules-of-uri) and [type is matched](#matching-rules-of-type), the matching is successful. Otherwise, the matching fails. -Leftmost URI matching: When only **scheme**, a combination of **scheme** and **host**, or a combination of **scheme**, **host**, and **port** is configured in the **uris** array under **skills** of the ability, -the matching is successful only if the leftmost URI in the passed **want** parameter matches **scheme**, the combination of **scheme** and **host**, or the combination of **scheme**, **host**, and **port**. +Leftmost URI matching: When only **scheme**, a combination of **scheme** and **host**, or a combination of **scheme**, **host**, and **port** is configured in the **uris** array under **skills** of the application component, the matching is successful only if the leftmost URI in the passed **want** parameter matches **scheme**, the combination of **scheme** and **host**, or the combination of **scheme**, **host**, and **port**. **Figure 3** Matching rules when uri and type are specified in the want parameter - ![want-uri-type1](figures/want-uri-type1.png) +![want-uri-type1](figures/want-uri-type1.png) +To simplify the description: -To simplify the description, **uri** and **type** passed in the **want** parameter are called **w_uri** and **w_type**, respectively; the **uris** array under **skills** of an ability to match is called **s_uris**; each element in the array is called **s_uri**. Matching is performed from top to bottom. +- **uri** in the **want** parameter passed in by the caller is called **w_uri**; each element in the **uris** array under **skills** of the application component to match is called **s_uri**. +- **type** in the **want** parameter passed in by the caller is called **w_type**; the type in the **uris** array under **skills** of the application component to match is called **s_type**. **Figure 4** Matching rules of uri and type in the want parameter @@ -124,7 +127,7 @@ To simplify the description, **uri** and **type** passed in the **want** paramet ### Matching Rules of uri -To simplify the description, **uri** in the passed **want** parameter is called **w_uri**; **uri** under **skills** of an ability to match is called **s_uri**. The matching rules are as follows: +The rules are as follows: - If **scheme** of **s_uri** is unspecified and **w_uri** is unspecified, the matching is successful. Otherwise, the matching fails. @@ -142,18 +145,15 @@ To simplify the description, **uri** in the passed **want** parameter is called > **NOTE** > -> The **scheme**, **host**, **port**, **path**, **pathStartWith**, and **pathRegex** attributes of **uris** under **skills** of an ability are concatenated. If **path**, **pathStartWith**, and **pathRegex** are declared in sequence, **uris** can be concatenated into the following expressions: -> -> - **Full path expression**: `scheme://host:port/path` -> -> - **Prefix expression**: `scheme://host:port/pathStartWith` -> -> - **Regular expression**: `scheme://host:port/pathRegex` +> The **scheme**, **host**, **port**, **path**, **pathStartWith**, and **pathRegex** attributes of **uris** under **skills** of an application component are concatenated. If **path**, **pathStartWith**, and **pathRegex** are declared in sequence, **uris** can be concatenated into the following expressions: > > - **Prefix URI expression**: When only **scheme**, a combination of **scheme** and **host**, or a combination of **scheme**, **host**, and **port** is configured in the configuration file, the matching is successful if a URI prefixed with the configuration file is passed in. > * `scheme://` > * `scheme://host` > * `scheme://host:port` +> - **Full path expression**: `scheme://host:port/path` +> - **Prefix expression**: `scheme://host:port/pathStartWith` +> - **Regular expression**: `scheme://host:port/pathRegex` ### Matching Rules of type @@ -162,7 +162,7 @@ To simplify the description, **uri** in the passed **want** parameter is called > > The matching rules of **type** described in this section are based on the fact that **type** in the **want** parameter is specified. If **type** is unspecified, follow the [matching rules of uri and type in the want parameter](#matching-rules-of-uri-and-type-in-the-want-parameter). -To simplify the description, **uri** in the passed **want** parameter is called **w_type**, and **type** of **uris** under **skills** of an ability to match is called **s_type**. The matching rules are as follows: +The matching rules are as follows: - If **s_type** is unspecified, the matching fails. diff --git a/en/application-dev/application-models/extensionability-overview.md b/en/application-dev/application-models/extensionability-overview.md index d176b2d532..f55686f33a 100644 --- a/en/application-dev/application-models/extensionability-overview.md +++ b/en/application-dev/application-models/extensionability-overview.md @@ -11,17 +11,17 @@ An [ExtensionAbilityType](../reference/apis/js-apis-bundleManager.md#extensionab - [WorkSchedulerExtensionAbility](../reference/apis/js-apis-WorkSchedulerExtensionAbility.md): ExtensionAbility component of the work_scheduler type, which provides callbacks for Work Scheduler tasks. -- [InputMethodExtensionAbility](../reference/apis/js-apis-inputmethod.md): ExtensionAbility component of the input_method type, which provides an input method framework that can be used to hide the keyboard, obtain the list of installed input methods, display the dialog box for input method selection, and more. +- [InputMethodExtensionAbility](../reference/apis/js-apis-inputmethod.md): ExtensionAbility component of the input_method type, which is used to develop input method applications. - [ServiceExtensionAbility](../reference/apis/js-apis-app-ability-serviceExtensionAbility.md): ExtensionAbility component of the service type, which provides APIs related to background service scenarios. - [AccessibilityExtensionAbility](../reference/apis/js-apis-application-accessibilityExtensionAbility.md): ExtensionAbility component of the accessibility type, which provides APIs related to the accessibility feature. -- [DataShareExtensionAbility](../reference/apis/js-apis-application-dataShareExtensionAbility.md): ExtensionAbility component of the data_share type, which provides APIs for data sharing. +- [DataShareExtensionAbility (for system applications only)](../reference/apis/js-apis-application-dataShareExtensionAbility.md): ExtensionAbility component of the data_share type, which provides APIs for data sharing. - [StaticSubscriberExtensionAbility](../reference/apis/js-apis-application-staticSubscriberExtensionAbility.md): ExtensionAbility component of the static_subscriber type, which provides APIs for static broadcast. -- [WindowExtensionAbility](../reference/apis/js-apis-application-windowExtensionAbility.md): ExtensionAbility component of the window type, which allows a system application to be embedded in and displayed over another application. +- [WindowExtensionAbility (for system applications only)](../reference/apis/js-apis-application-windowExtensionAbility.md): ExtensionAbility component of the window type, which allows a system application to be embedded in and displayed over another application. - [EnterpriseAdminExtensionAbility](../reference/apis/js-apis-EnterpriseAdminExtensionAbility.md): ExtensionAbility component of the enterprise_admin type, which provides APIs for processing enterprise management events, such as application installation events on devices and events indicating too many incorrect screen-lock password attempts. @@ -56,13 +56,11 @@ You do not need to care when to add or delete a widget. The lifecycle of the For > **NOTE** > > For an application, all ExtensionAbility components of the same type run in an independent process, whereas UIAbility, ServiceExtensionAbility, and DataShareExtensionAbility run in another independent process. For details, see [Process Model (Stage Model)](process-model-stage.md). -> +> > For example, an application has one UIAbility component, one ServiceExtensionAbility, one DataShareExtensionAbility, two FormExtensionAbility, and one ImeExtensionAbility. When the application is running, there are three processes: -> +> > - UIAbility, ServiceExtensionAbility, and DataShareExtensionAbility run in an independent process. -> +> > - The two FormExtensionAbility components run in an independent process. -> +> > - The two ImeExtensionAbility components run in an independent process. - - \ No newline at end of file diff --git a/en/application-dev/application-models/fa-model-development-overview.md b/en/application-dev/application-models/fa-model-development-overview.md index 07e7ef8a0b..295e186355 100644 --- a/en/application-dev/application-models/fa-model-development-overview.md +++ b/en/application-dev/application-models/fa-model-development-overview.md @@ -8,8 +8,8 @@ During application development based on the Feature Ability (FA) model, the foll | Task| Introduction| Guide| | -------- | -------- | -------- | -| Application component development| Use the PageAbility, ServiceAbility, DataAbility, and widgets of the FA model to develop applications.| - [Application- or Component-Level Configuration](application-component-configuration-fa.md)
- [PageAbility Component](pageability-overview.md)
- [ServiceAbility Component](serviceability-overview.md)
- [DataAbility Component](dataability-overview.md)
- [Widget Development](Widget-development-fa.md)
- [Context](application-context-fa.md)
- [Want](want-fa.md) | -| Inter-process communication (IPC)| Learn the process model and common IPC modes of the FA model.| [Common Events](common-event-fa.md)
[Background Services](rpc.md) | -| Inter-thread communication| Learn the thread model and common inter-thread communication modes of the FA model.| [Inter-Thread Communication](itc-fa-overview.md)| +| Application component development| Use the PageAbility, ServiceAbility, DataAbility, and widgets of the FA model to develop applications.| - [Application- or Component-Level Configuration](application-component-configuration-fa.md)
- [PageAbility Component](pageability-overview.md)
- [ServiceAbility Component](serviceability-overview.md)
- [DataAbility Component](dataability-overview.md)
- [Widget Development](widget-development-fa.md)
- [Context](application-context-fa.md)
- [Want](want-fa.md)| +| Process model| Learn the process model and common IPC modes of the FA model.| [Common Events](common-event-fa.md)
[Background Services](rpc.md)| +| Thread model| Learn the thread model and common inter-thread communication modes of the FA model.| [Inter-Thread Communication](itc-fa-overview.md)| | Mission management| Learn the basic concepts and typical scenarios of mission management in the FA model.| [Mission Management](mission-management-fa.md)| -| Application configuration file| Learn the requirements for developing application configuration files in the FA model.| [Application Configuration File](config-file-fa.md) | +| Application configuration file| Learn the requirements for developing application configuration files in the FA model.| [Application Configuration File](config-file-fa.md)| diff --git a/en/application-dev/application-models/figures/application_details.jpg b/en/application-dev/application-models/figures/application_details.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e849a47b3d10faefafbf76a7b6309da305a2e9b0 GIT binary patch literal 20903 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 aao8^}Va9MxQEPel`S%Q9h+KwHzx^+=98S3a literal 0 HcmV?d00001 diff --git a/en/application-dev/application-models/figures/stage-concepts.png b/en/application-dev/application-models/figures/stage-concepts.png index 42e99447a780b167adaf6ddd196bea4437dfa1a7..9d753f27fca4d507da20b5d5060f9b3d28e616b0 100644 GIT binary patch literal 66964 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�+z5~27Kq#b_Kk<5y{?|L5*O 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 G{Qd{kumuGG literal 39111 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

?yZqQ%qWcK5z3&L!>G78vn7ue@v9 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 JwWv|>{{j*?ydMAn diff --git a/en/application-dev/application-models/hop-cross-device-migration.md b/en/application-dev/application-models/hop-cross-device-migration.md index c51e82e15f..418eac519c 100644 --- a/en/application-dev/application-models/hop-cross-device-migration.md +++ b/en/application-dev/application-models/hop-cross-device-migration.md @@ -55,21 +55,21 @@ The table below describes the main APIs used for cross-device migration. For det Configure the application to support migration. Set the **continuable** field in the **module.json5** file to **true**. The default value is **false**. If this parameter is set to **false**, the application cannot be continued on the target device. - - - ```json - { - "module": { - // ... - "abilities": [ - { - // ... - "continuable": true, - } - ] - } - } - ``` + + + ```json + { + "module": { + ... + "abilities": [ + { + ... + "continuable": true, + } + ] + } + } + ``` Configure the application launch type. For details, see [UIAbility Component Launch Type](uiability-launch-type.md). @@ -83,19 +83,19 @@ The table below describes the main APIs used for cross-device migration. For det The sample code is as follows: - ```ts - import UIAbility from '@ohos.app.ability.UIAbility'; - import AbilityConstant from '@ohos.app.ability.AbilityConstant'; - - onContinue(wantParam : {[key: string]: any}) { - console.info(`onContinue version = ${wantParam.version}, targetDevice: ${wantParam.targetDevice}`) - let workInput = AppStorage.Get('ContinueWork'); - // Set the user input data into wantParam. - wantParam["work"] = workInput // set user input data into want params - console.info(`onContinue input = ${wantParam["input"]}`); - return AbilityConstant.OnContinueResult.AGREE - } - ``` + ```ts + import UIAbility from '@ohos.app.ability.UIAbility'; + import AbilityConstant from '@ohos.app.ability.AbilityConstant'; + + onContinue(wantParam : {[key: string]: any}) { + console.info(`onContinue version = ${wantParam.version}, targetDevice: ${wantParam.targetDevice}`) + let workInput = AppStorage.Get('ContinueWork'); + // Set the user input data into wantParam. + wantParam["work"] = workInput // set user input data into want params + console.info(`onContinue input = ${wantParam["input"]}`); + return AbilityConstant.OnContinueResult.AGREE + } + ``` 5. Implement **onCreate()** and **onNewWant()** in the UIAbility of the target application to implement data restoration. - Implementation example of **onCreate** in the multi-instance scenario diff --git a/en/application-dev/application-models/hop-multi-device-collaboration.md b/en/application-dev/application-models/hop-multi-device-collaboration.md index b761037182..a6e767964e 100644 --- a/en/application-dev/application-models/hop-multi-device-collaboration.md +++ b/en/application-dev/application-models/hop-multi-device-collaboration.md @@ -63,7 +63,7 @@ On device A, touch the **Start** button provided by the initiator application to // createDeviceManager is a system API. deviceManager.createDeviceManager('ohos.samples.demo', (err, dm) => { if (err) { - // ... + ... return } dmClass = dm @@ -94,13 +94,13 @@ On device A, touch the **Start** button provided by the initiator application to } // context is the AbilityContext of the initiator UIAbility. this.context.startAbility(want).then(() => { - // ... + ... }).catch((err) => { - // ... + ... }) ``` -5. Call stopServiceExtensionAbility(../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstopserviceextensionability) to stop the ServiceExtensionAbility when it is no longer required on device B. (This API cannot be used to stop a UIAbility. Users must manually stop a UIAbility through task management.) +5. Call [stopServiceExtensionAbility](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstopserviceextensionability) to stop the ServiceExtensionAbility when it is no longer required on device B. (This API cannot be used to stop a UIAbility. Users must manually stop a UIAbility through task management.) ```ts let want = { @@ -150,9 +150,9 @@ On device A, touch the **Start** button provided by the initiator application to } // context is the AbilityContext of the initiator UIAbility. this.context.startAbilityForResult(want).then((data) => { - // ... + ... }).catch((err) => { - // ... + ... }) ``` @@ -170,7 +170,7 @@ On device A, touch the **Start** button provided by the initiator application to } // context is the AbilityContext of the target UIAbility. this.context.terminateSelfWithResult(abilityResult, (err) => { - // ... + ... }); ``` @@ -179,17 +179,17 @@ On device A, touch the **Start** button provided by the initiator application to ```ts const RESULT_CODE: number = 1001; - // ... + ... // context is the UIAbilityContext of the initiator UIAbility. this.context.startAbilityForResult(want).then((data) => { if (data?.resultCode === RESULT_CODE) { // Parse the information returned by the target UIAbility. let info = data.want?.parameters?.info - // ... + ... } }).catch((err) => { - // ... + ... }) ``` @@ -444,10 +444,10 @@ The following describes how to implement multi-device collaboration through cros // Register the onRemoteStateChange listener of the CallerAbility. try { caller.onRemoteStateChange((str) => { - console.log('Remote state changed ' + str); + console.info('Remote state changed ' + str); }); } catch (error) { - console.log('Caller.onRemoteStateChange catch error, error.code: ${JSON.stringify(error.code)}, error.message: ${JSON.stringify(error.message)}'); + console.info('Caller.onRemoteStateChange catch error, error.code: ${JSON.stringify(error.code)}, error.message: ${JSON.stringify(error.message)}'); } } }).catch((error) => { diff --git a/en/application-dev/application-models/itc-with-emitter.md b/en/application-dev/application-models/itc-with-emitter.md index 2966bd8eea..43a5dc67be 100644 --- a/en/application-dev/application-models/itc-with-emitter.md +++ b/en/application-dev/application-models/itc-with-emitter.md @@ -13,12 +13,12 @@ To develop the Emitter mode, perform the following steps: // Define an event with eventId 1. let event = { - eventId: 1 + eventId: 1 }; // Trigger the callback after the event with eventId 1 is received. let callback = (eventData) => { - console.info('event callback'); + console.info('event callback'); }; // Subscribe to the event with eventId 1. @@ -29,21 +29,21 @@ To develop the Emitter mode, perform the following steps: ```ts import emitter from "@ohos.events.emitter"; - + // Define an event with eventId 1 and priority Low. let event = { - eventId: 1, - priority: emitter.EventPriority.LOW + eventId: 1, + priority: emitter.EventPriority.LOW }; - + let eventData = { - data: { - "content": "c", - "id": 1, - "isEmpty": false, - } + data: { + "content": "c", + "id": 1, + "isEmpty": false, + } }; - + // Emit the event with eventId 1 and event content eventData. emitter.emit(event, eventData); ``` diff --git a/en/application-dev/application-models/itc-with-worker.md b/en/application-dev/application-models/itc-with-worker.md index 996ab941b0..1f105d4f0c 100644 --- a/en/application-dev/application-models/itc-with-worker.md +++ b/en/application-dev/application-models/itc-with-worker.md @@ -9,13 +9,13 @@ To develop the Worker mode, perform the following steps: 1. Configure the **buildOption** field in the [module-level build-profile.json5](https://developer.harmonyos.com/en/docs/documentation/doc-guides/ohos-building-configuration-0000001218440654#section6887184182020) file of the project. ```ts - "buildOption": { - "sourceOption": { - "workers": [ - "./src/main/ets/workers/worker.ts" - ] - } + "buildOption": { + "sourceOption": { + "workers": [ + "./src/main/ets/workers/worker.ts" + ] } + } ``` 2. Create the **worker.ts** file based on the configuration in **build-profile.json5**. @@ -27,9 +27,9 @@ To develop the Worker mode, perform the following steps: // Process messages from the main thread. parent.onmessage = function(message) { - console.info("onmessage: " + message) - // Send a message to the main thread. - parent.postMessage("message from worker thread.") + console.info("onmessage: " + message) + // Send a message to the main thread. + parent.postMessage("message from worker thread.") } ``` @@ -46,10 +46,10 @@ To develop the Worker mode, perform the following steps: // Process messages from the worker thread. wk.onmessage = function(message) { - console.info("message from worker: " + message) + console.info("message from worker: " + message) - // Stop the worker thread based on service requirements. - wk.terminate() + // Stop the worker thread based on service requirements. + wk.terminate(); } ``` @@ -57,23 +57,22 @@ To develop the Worker mode, perform the following steps: ```ts import worker from '@ohos.worker'; - + let wk = new worker.ThreadWorker("../workers/worker.ts"); - + // Send a message to the worker thread. wk.postMessage("message from main thread.") - + // Process messages from the worker thread. wk.onmessage = function(message) { - console.info("message from worker: " + message) - - // Stop the worker thread based on service requirements. - wk.terminate() + console.info("message from worker: " + message) + + // Stop the worker thread based on service requirements. + wk.terminate(); } ``` > **NOTE** -> +> > - If the relative path of **worker.ts** configured in **build-profile.json5** is **./src/main/ets/workers/worker.ts**, pass in the path **entry/ets/workers/worker.ts** when creating a worker thread in the stage model, and pass in the path **../workers/worker.ts** when creating a worker thread in the FA model. -> > - For details about the data types supported between the main thread and worker thread, see [Sequenceable Data Types](../reference/apis/js-apis-worker.md#sequenceable-data-types). diff --git a/en/application-dev/application-models/mission-set-icon-name-for-task-snapshot.md b/en/application-dev/application-models/mission-set-icon-name-for-task-snapshot.md index c98d39ff83..a5da1eeaa1 100644 --- a/en/application-dev/application-models/mission-set-icon-name-for-task-snapshot.md +++ b/en/application-dev/application-models/mission-set-icon-name-for-task-snapshot.md @@ -21,8 +21,10 @@ Call [UIAbilityContext.setMissionIcon()](../reference/apis/js-apis-inner-applica ```ts let imagePixelMap: PixelMap = undefined; // Obtain the PixelMap information. -this.context.setMissionIcon(imagePixelMap, (err) => { - console.error(`setMissionLabel failed, code is ${err.code}, message is ${err.message}`); +context.setMissionIcon(imagePixelMap, (err) => { + if (err.code) { + console.error(`Failed to set mission icon. Code is ${err.code}, message is ${err.message}`); + } }) ``` @@ -38,9 +40,9 @@ Call [UIAbilityContext.setMissionLabel()](../reference/apis/js-apis-inner-applic ```ts this.context.setMissionLabel('test').then(() => { - console.info('setMissionLabel succeeded.'); + console.info('Succeeded in seting mission label.'); }).catch((err) => { - console.error(`setMissionLabel failed, code is ${err.code}, message is ${err.message}`); + console.error(`Failed to set mission label. Code is ${err.code}, message is ${err.message}`); }); ``` diff --git a/en/application-dev/application-models/module-switch.md b/en/application-dev/application-models/module-switch.md index 9f31f892cd..749c41ebdd 100644 --- a/en/application-dev/application-models/module-switch.md +++ b/en/application-dev/application-models/module-switch.md @@ -3,7 +3,7 @@ When switching an application from the FA model to the stage model, you must migrate the configurations under the **module** tag in the **config.json** file to the **module** tag in the **module.json5** file. -### Table 1 module Comparison +**Table 1** module comparison | Field Name in the FA Model| Field Description| Field Name in the Stage Model| Difference| | -------- | -------- | -------- | -------- | @@ -15,8 +15,8 @@ When switching an application from the FA model to the stage model, you must mig | moduleType in the distro object| Type of the HAP file. The value can be **entry** or **feature**. For the HAR type, set this field to **har**.| type | The field name is changed.| | installationFree in the distro object| Whether the HAP file supports the installation-free feature.| installationFree | The field name is changed.| | deliveryWithInstall in the distro object| Whether the HAP file is installed with the application.| deliveryWithInstall | The field name is changed.| -| metaData | Metadata of the HAP file.| metadata | See [Table 2](#table-2-metadata-comparison).| -| abilities | All abilities in the current module.| abilities | See [Table 5](#table-5-abilities-comparison).| +| metaData | Metadata of the HAP file.| metadata | For details, see Table 2.| +| abilities | All abilities in the current module.| abilities | For details, see Table 5.| | js | A set of JS modules developed using ArkUI. Each element in the set represents the information about a JS module.| pages | The stage model retains **pages** under the **module** tag. The window configuration is the lower level of **pages**.| | shortcuts | Shortcuts of the application.| shortcut_config.json| In the stage model, the **shortcut_config.json** file is defined in **resources/base/profile** in the development view.| | reqPermissions | Permissions that the application requests from the system when it is running.| requestPermissions | The field name is changed.| @@ -27,38 +27,38 @@ When switching an application from the FA model to the stage model, you must mig | entryTheme | Keyword of an OpenHarmony internal theme.| / | This configuration is not supported in the stage model.| -### Table 2 metaData Comparison +**Table 2** metaData comparison -| Field Name Under metaData in the FA Model| Field Description| Field Name Under metaData in the Stage Model| Difference| +| Field Name in the FA Model| Field Description| Field Name in the Stage Model| Difference| | -------- | -------- | -------- | -------- | | parameters | Metadata of the parameters to be passed for calling the ability.| / | This configuration is not supported in the stage model.| | results | Metadata of the ability return value.| / | This configuration is not supported in the stage model.| -| customizeData | Custom metadata of the parent component. **parameters** and **results** cannot be configured in **application**.| metadata | See [Table 3](#table-3-comparison-between-customizedata-under-metadata-in-the-fa-model-and-metadata-in-the-stage-model).| +| customizeData | Custom metadata of the parent component. **parameters** and **results** cannot be configured in **application**.| metadata | **For details**, see Table 3.| -### Table 3 Comparison Between customizeData Under metaData in the FA Model and metadata in the Stage Model +**Table 3** Comparison between customizeData under metaData in the FA model and metadata in the stage Model -| Field Name Under customizeData in metaData in the FA Model| Field Description| Field Name Under metaData in the Stage Model| Difference| +| Field Name in the FA Model| Field Description| Field Name in the Stage Model| Difference| | -------- | -------- | -------- | -------- | | name | Key name that identifies a data item. The value is a string with a maximum of 255 bytes.| name | None.| | value | Value of the data item. The value is a string with a maximum of 255 bytes.| value | None.| -| extra | Format of the current custom data. The value is the resource value of **extra**.| resource | The field name is changed. For details, see [Table 4](#table 4-metadata-examples).| +| extra | Format of the current custom data. The value is the resource value of **extra**.| resource | The field name is changed. For details, see Table 4.| -### Table 4 metaData Examples +**Table 4** metaData examples | Example in the FA Model| Example in the Stage Model| | -------- | -------- | | "meteData": {
"customizeDate": [{
"name": "label",
"value": "string",
"extra": "$string:label",
}]
} | "meteData": [{
"name": "label",
"value": "string",
"resource": "$string:label",
}] | -### Table 5 abilities Comparison +**Table 5** abilities comparison | Field Name Under abilities in the FA Model| Field Description| Field Name Under abilities in the Stage Model| Difference| | -------- | -------- | -------- | -------- | | process | Name of the process running the application or ability.| / | The stage model does not support configuration of **process** under **abilities**. The configuration of **process** is available under the **module** tag.| | uri | URI of the ability.| / | This configuration is not supported in the stage model.| | deviceCapability | Device capabilities required to run the ability.| / | This configuration is not supported in the stage model.| -| metaData | Metadata of the ability.| metadata | See [Table 2](#table-2-metadata-comparison).| +| metaData | Metadata of the ability.| metadata | For details, see Table 2.| | type | Ability type.| / | This configuration is not supported in the stage model.| | grantPermission | Whether permissions can be granted for any data in the ability.| / | The stage model does not support such a configuration under **abilities**.| | readPermission | Permission required for reading data in the ability. This field applies only to the ability using the Data template.| / | In the stage model, this configuration is available under **extensionAbilities**, but not **abilities**.| diff --git a/en/application-dev/application-models/page-mission-stack.md b/en/application-dev/application-models/page-mission-stack.md index 702cb9ba92..cdb7ce724f 100644 --- a/en/application-dev/application-models/page-mission-stack.md +++ b/en/application-dev/application-models/page-mission-stack.md @@ -5,7 +5,8 @@ A single UIAbility component can implement multiple pages and redirection between these pages. The redirection relationship inside the UIAbility component is called page stack, which is managed by the ArkUI framework. For example, Page1 -> Page2 -> Page3 of UIAbility1 and PageA -> PageB -> PageC of UIAbility2 in the figure below are two page stacks. - **Figure 1** Page stack +**Figure 1** Page stack + ![mission-record](figures/mission-record.png) - A page stack is formed as follows (Steps 2, 3, 5, and 6 are page redirection and managed by ArkUI): diff --git a/en/application-dev/application-models/pageability-launch-type.md b/en/application-dev/application-models/pageability-launch-type.md index 3b75ff6a60..1e5d14c303 100644 --- a/en/application-dev/application-models/pageability-launch-type.md +++ b/en/application-dev/application-models/pageability-launch-type.md @@ -5,7 +5,7 @@ Depending on the launch type, the action performed when the PageAbility starts d **Table 1** PageAbility launch types -| Launch Type| Meaning | Description| +| Launch Type| Meaning| Description | | -------- | -------- | -------- | | singleton | Singleton mode| Each time **startAbility()** is called, if an ability instance of this type already exists in the application process, the instance is reused. There is only one ability instance of this type in **Recents**.
A typical scenario is as follows: When a user opens a video playback application and watches a video, returns to the home screen, and opens the video playback application again, the video that the user watched before returning to the home screen is still played.| | standard | Multiton mode| Default type. Each time **startAbility()** is called, a new ability instance is created in the application process. Multiple ability instances of this type are displayed in **Recents**.
A typical scenario is as follows: When a user opens a document application and touches **New**, a new document task is created. Multiple new document missions are displayed in **Recents**.| @@ -16,13 +16,13 @@ You can set **launchType** in the **config.json** file to configure the launch t ```json { "module": { - // ... + ... "abilities": [ { // singleton means the singleton mode. // standard means the multiton mode. "launchType": "standard", - // ... + ... } ] } diff --git a/en/application-dev/application-models/redirection-rules.md b/en/application-dev/application-models/redirection-rules.md index 4e9f65a8b3..19c74c605c 100644 --- a/en/application-dev/application-models/redirection-rules.md +++ b/en/application-dev/application-models/redirection-rules.md @@ -21,11 +21,11 @@ To enable an ability to be called by any application, configure the **config.jso ```ts { "module": { - // ... + ... "abilities": [ { "visible": "true", - // ... + ... } ] } diff --git a/en/application-dev/application-models/serviceextensionability.md b/en/application-dev/application-models/serviceextensionability.md index 2e9aaeb481..3f9e96cf03 100644 --- a/en/application-dev/application-models/serviceextensionability.md +++ b/en/application-dev/application-models/serviceextensionability.md @@ -29,6 +29,7 @@ Note the following: [ServiceExtensionAbility](../reference/apis/js-apis-app-ability-serviceExtensionAbility.md) provides the callbacks **onCreate()**, **onRequest()**, **onConnect()**, **onDisconnect()**, and **onDestory()**. Override them as required. The following figure shows the lifecycle of ServiceExtensionAbility. **Figure 1** ServiceExtensionAbility lifecycle + ![ServiceExtensionAbility-lifecycle](figures/ServiceExtensionAbility-lifecycle.png) - **onCreate** @@ -61,7 +62,7 @@ Note the following: Only system applications can implement ServiceExtensionAbility. You must make the following preparations before development: -- **Switching to the full SDK**: All APIs related to ServiceExtensionAbility are marked as system APIs and hidden by default. Therefore, you must manually obtain the full SDK from the mirror and switch to it in DevEco Studio. For details, see [Guide to Switching to Full SDK](../quick-start/full-sdk-switch-guide.md). +- **Switching to the full SDK**: All APIs related to ServiceExtensionAbility are marked as system APIs and hidden by default. Therefore, you must manually obtain the full SDK from the mirror and switch to it in DevEco Studio. For details, see [Guide to Switching to Full SDK](../faqs/full-sdk-switch-guide.md). - **Requesting the AllowAppUsePrivilegeExtension privilege**: Only applications with the **AllowAppUsePrivilegeExtension** privilege can develop ServiceExtensionAbility. For details about how to request the privilege, see [Application Privilege Configuration Guide](../../device-dev/subsystems/subsys-app-privilege-config-guide.md). @@ -109,7 +110,7 @@ export default class ServiceExtImpl extends IdlServiceExtStub { insertDataToMap(key: string, val: number, callback: insertDataToMapCallback): void { // Implement service logic. - console.log(TAG, `insertDataToMap, key: ${key} val: ${val}`); + console.info(TAG, `insertDataToMap, key: ${key} val: ${val}`); callback(ERR_OK); } } @@ -175,7 +176,7 @@ To manually create a ServiceExtensionAbility in the DevEco Studio project, perfo ```json { "module": { - // ... + ... "extensionAbilities": [ { "name": "ServiceExtAbility", @@ -201,41 +202,43 @@ A system application uses the [startServiceExtensionAbility()](../reference/apis 1. Start a new ServiceExtensionAbility in a system application. For details about how to obtain the context, see [Obtaining the Context of UIAbility](uiability-usage.md#obtaining-the-context-of-uiability). ```ts + let context = ...; // UIAbilityContext let want = { - "deviceId": "", - "bundleName": "com.example.myapplication", - "abilityName": "ServiceExtAbility" + "deviceId": "", + "bundleName": "com.example.myapplication", + "abilityName": "ServiceExtAbility" }; - this.context.startServiceExtensionAbility(want).then(() => { - console.info('startServiceExtensionAbility success'); - }).catch((error) => { - console.info('startServiceExtensionAbility failed'); + context.startServiceExtensionAbility(want).then(() => { + console.info('Succeeded in starting ServiceExtensionAbility.'); + }).catch((err) => { + console.error(`Failed to start ServiceExtensionAbility. Code is ${err.code}, message is ${err.message}`); }) ``` 2. Stop ServiceExtensionAbility in the system application. ```ts + let context = ...; // UIAbilityContext let want = { - "deviceId": "", - "bundleName": "com.example.myapplication", - "abilityName": "ServiceExtAbility" + "deviceId": "", + "bundleName": "com.example.myapplication", + "abilityName": "ServiceExtAbility" }; - this.context.stopServiceExtensionAbility(want).then(() => { - console.info('stopServiceExtensionAbility success'); - }).catch((error) => { - console.info('stopServiceExtensionAbility failed'); + context.stopServiceExtensionAbility(want).then(() => { + console.info('Succeeded in stoping ServiceExtensionAbility.'); + }).catch((err) => { + console.error(`Failed to stop ServiceExtensionAbility. Code is ${err.code}, message is ${err.message}`); }) ``` 3. ServiceExtensionAbility stops itself. ```ts - // this is the current ServiceExtensionAbility component. - this.context.terminateSelf().then(() => { - console.info('terminateSelf success'); - }).catch((error) => { - console.info('terminateSelf failed'); + let context = ...; // ServiceExtensionContext + context.terminateSelf().then(() => { + console.info('Succeeded in terminating self.'); + }).catch((err) => { + console.error(`Failed to terminate self. Code is ${err.code}, message is ${err.message}`); }) ``` @@ -257,27 +260,27 @@ The ServiceExtensionAbility component returns an IRemoteObject in the **onConnec ```ts let want = { - "deviceId": "", - "bundleName": "com.example.myapplication", - "abilityName": "ServiceExtAbility" + "deviceId": "", + "bundleName": "com.example.myapplication", + "abilityName": "ServiceExtAbility" }; let options = { - onConnect(elementName, remote) { - /* The input parameter remote is the object returned by ServiceExtensionAbility in the onConnect lifecycle callback. - * This object is used for communication with ServiceExtensionAbility. For details, see the section below. - */ - console.info('onConnect callback'); - if (remote === null) { - console.info(`onConnect remote is null`); - return; - } - }, - onDisconnect(elementName) { - console.info('onDisconnect callback') - }, - onFailed(code) { - console.info('onFailed callback') + onConnect(elementName, remote) { + /* The input parameter remote is the object returned by ServiceExtensionAbility in the onConnect lifecycle callback. + * This object is used for communication with ServiceExtensionAbility. For details, see the section below. + */ + console.info('onConnect callback'); + if (remote === null) { + console.info(`onConnect remote is null`); + return; } + }, + onDisconnect(elementName) { + console.info('onDisconnect callback') + }, + onFailed(code) { + console.info('onFailed callback') + } } // The ID returned after the connection is set up must be saved. The ID will be passed for service disconnection. let connectionId = this.context.connectServiceExtensionAbility(want, options); @@ -288,9 +291,9 @@ The ServiceExtensionAbility component returns an IRemoteObject in the **onConnec ```ts // connectionId is returned when connectServiceExtensionAbility is called and needs to be manually maintained. this.context.disconnectServiceExtensionAbility(connectionId).then((data) => { - console.info('disconnectServiceExtensionAbility success'); + console.info('disconnectServiceExtensionAbility success'); }).catch((error) => { - console.error('disconnectServiceExtensionAbility failed'); + console.error('disconnectServiceExtensionAbility failed'); }) ``` @@ -305,27 +308,27 @@ After obtaining the [rpc.RemoteObject](../reference/apis/js-apis-rpc.md#iremoteo import IdlServiceExtProxy from '../IdlServiceExt/idl_service_ext_proxy'; let options = { - onConnect(elementName, remote) { - console.info('onConnect callback'); - if (remote === null) { - console.info(`onConnect remote is null`); - return; - } - let serviceExtProxy = new IdlServiceExtProxy(remote); - // Communication is carried out by interface calling, without exposing RPC details. - serviceExtProxy.processData(1, (errorCode, retVal) => { - console.log(`processData, errorCode: ${errorCode}, retVal: ${retVal}`); - }); - serviceExtProxy.insertDataToMap('theKey', 1, (errorCode) => { - console.log(`insertDataToMap, errorCode: ${errorCode}`); - }) - }, - onDisconnect(elementName) { - console.info('onDisconnect callback') - }, - onFailed(code) { - console.info('onFailed callback') + onConnect(elementName, remote) { + console.info('onConnect callback'); + if (remote === null) { + console.info(`onConnect remote is null`); + return; } + let serviceExtProxy = new IdlServiceExtProxy(remote); + // Communication is carried out by interface calling, without exposing RPC details. + serviceExtProxy.processData(1, (errorCode, retVal) => { + console.info(`processData, errorCode: ${errorCode}, retVal: ${retVal}`); + }); + serviceExtProxy.insertDataToMap('theKey', 1, (errorCode) => { + console.info(`insertDataToMap, errorCode: ${errorCode}`); + }) + }, + onDisconnect(elementName) { + console.info('onDisconnect callback') + }, + onFailed(code) { + console.info('onFailed callback') + } } ``` @@ -333,40 +336,40 @@ After obtaining the [rpc.RemoteObject](../reference/apis/js-apis-rpc.md#iremoteo ```ts import rpc from '@ohos.rpc'; - + const REQUEST_CODE = 1; let options = { - onConnect(elementName, remote) { - console.info('onConnect callback'); - if (remote === null) { - console.info(`onConnect remote is null`); - return; - } - // Directly call the RPC interface to send messages to the server. The client needs to serialize the input parameters and deserialize the return values. The process is complex. - let option = new rpc.MessageOption(); - let data = new rpc.MessageSequence(); - let reply = new rpc.MessageSequence(); - data.writeInt(100); - - // @param code Indicates the service request code sent by the client. - // @param data Indicates the {@link MessageSequence} object sent by the client. - // @param reply Indicates the response message object sent by the remote service. - // @param options Specifies whether the operation is synchronous or asynchronous. - // - // @return Returns {@code true} if the operation is successful; returns {@code false} otherwise. - remote.sendMessageRequest(REQUEST_CODE, data, reply, option).then((ret) => { - let msg = reply.readInt(); - console.info(`sendMessageRequest ret:${ret} msg:${msg}`); - }).catch((error) => { - console.info('sendMessageRequest failed'); - }); - }, - onDisconnect(elementName) { - console.info('onDisconnect callback') - }, - onFailed(code) { - console.info('onFailed callback') + onConnect(elementName, remote) { + console.info('onConnect callback'); + if (remote === null) { + console.info(`onConnect remote is null`); + return; } + // Directly call the RPC interface to send messages to the server. The client needs to serialize the input parameters and deserialize the return values. The process is complex. + let option = new rpc.MessageOption(); + let data = new rpc.MessageSequence(); + let reply = new rpc.MessageSequence(); + data.writeInt(100); + + // @param code Indicates the service request code sent by the client. + // @param data Indicates the {@link MessageSequence} object sent by the client. + // @param reply Indicates the response message object sent by the remote service. + // @param options Specifies whether the operation is synchronous or asynchronous. + // + // @return Returns {@code true} if the operation is successful; returns {@code false} otherwise. + remote.sendMessageRequest(REQUEST_CODE, data, reply, option).then((ret) => { + let msg = reply.readInt(); + console.info(`sendMessageRequest ret:${ret} msg:${msg}`); + }).catch((error) => { + console.info('sendMessageRequest failed'); + }); + }, + onDisconnect(elementName) { + console.info('onDisconnect callback') + }, + onFailed(code) { + console.info('onFailed callback') + } } ``` @@ -381,8 +384,8 @@ When ServiceExtensionAbility is used to provide sensitive services, the client i ```ts import rpc from '@ohos.rpc'; import bundleManager from '@ohos.bundle.bundleManager'; - import {processDataCallback} from './i_idl_service_ext'; - import {insertDataToMapCallback} from './i_idl_service_ext'; + import { processDataCallback } from './i_idl_service_ext'; + import { insertDataToMapCallback } from './i_idl_service_ext'; import IdlServiceExtStub from './idl_service_ext_stub'; const ERR_OK = 0; @@ -397,7 +400,7 @@ When ServiceExtensionAbility is used to provide sensitive services, the client i bundleManager.getBundleNameByUid(callerUid).then((callerBundleName) => { console.info(TAG, 'getBundleNameByUid: ' + callerBundleName); // Identify the bundle name of the client. - if (callerBundleName != 'com.example.connectextapp') { // The verification fails. + if (callerBundleName != 'com.example.connectextapp') { // The verification fails. console.info(TAG, 'The caller bundle is not in whitelist, reject'); return; } @@ -409,7 +412,7 @@ When ServiceExtensionAbility is used to provide sensitive services, the client i insertDataToMap(key: string, val: number, callback: insertDataToMapCallback): void { // Implement service logic. - console.log(TAG, `insertDataToMap, key: ${key} val: ${val}`); + console.info(TAG, `insertDataToMap, key: ${key} val: ${val}`); callback(ERR_OK); } } @@ -425,15 +428,15 @@ When ServiceExtensionAbility is used to provide sensitive services, the client i import {processDataCallback} from './i_idl_service_ext'; import {insertDataToMapCallback} from './i_idl_service_ext'; import IdlServiceExtStub from './idl_service_ext_stub'; - + const ERR_OK = 0; const ERR_DENY = -1; const TAG: string = "[IdlServiceExtImpl]"; - + export default class ServiceExtImpl extends IdlServiceExtStub { processData(data: number, callback: processDataCallback): void { console.info(TAG, `processData: ${data}`); - + let callerTokenId = rpc.IPCSkeleton.getCallingTokenId(); let accessManger = abilityAccessCtrl.createAtManager(); // The permission to be verified varies depending on the service requirements. ohos.permission.SET_WALLPAPER is only an example. @@ -446,10 +449,10 @@ When ServiceExtensionAbility is used to provide sensitive services, the client i } callback(ERR_OK, data + 1); // The verification is successful, and service logic is executed normally. } - + insertDataToMap(key: string, val: number, callback: insertDataToMapCallback): void { // Implement service logic. - console.log(TAG, `insertDataToMap, key: ${key} val: ${val}`); + console.info(TAG, `insertDataToMap, key: ${key} val: ${val}`); callback(ERR_OK); } } diff --git a/en/application-dev/application-models/stage-model-development-overview.md b/en/application-dev/application-models/stage-model-development-overview.md index 451649bdb1..d4ad1d87c6 100644 --- a/en/application-dev/application-models/stage-model-development-overview.md +++ b/en/application-dev/application-models/stage-model-development-overview.md @@ -12,7 +12,7 @@ The following figure shows the basic concepts used in the stage model. The stage model provides two types of application components: UIAbility and ExtensionAbility. Both have specific classes and support object-oriented development. - - UIAbility has the UI and is mainly used for user interaction. For example, with UIAbility, the Gallery application can display images in the liquid layout. After a user selects an image, it uses a new UI to display the image details. The user can touch the **Back** button to return to the liquid layout. The lifecycle of the UIAbility component contains the creation, destruction, foreground, and background states. Display-related states are exposed through WindowStage events. + - UIAbility is a type of application component that provides the UI for user interaction. For example, with UIAbility, the Gallery application can display images in the liquid layout. After a user selects an image, it uses a new UI to display the image details. The user can touch the **Back** button to return to the liquid layout. The lifecycle of the UIAbility component contains the creation, destruction, foreground, and background states. Display-related states are exposed through WindowStage events. - ExtensionAbility is oriented to specific scenarios. You cannot derive directly from ExtensionAbility. Instead, use the derived classes of ExtensionAbility for your scenarios, such as FormExtensionAbility for widget scenarios, InputMethodExtensionAbility for input method scenarios, and WorkSchedulerExtensionAbility for Work Scheduled task scenarios. For example, to enable a user to create an application widget on the home screen, you must derive FormExtensionAbility, implement the callback functions, and configure the capability in the configuration file. The derived class instances are created by developers and their lifecycles are managed by the system. In the stage model, you must use the derived classes of ExtensionAbility to develop custom services based on your service scenarios. - [WindowStage](../windowmanager/application-window-stage.md) @@ -37,7 +37,7 @@ During application development based on the stage model, the following tasks are | Task| Introduction| Guide| | -------- | -------- | -------- | | Application component development| Use the UIAbility and ExtensionAbility components of the stage model to develop applications.| - [Application- or Component-Level Configuration](application-component-configuration-stage.md)
- [UIAbility Component](uiability-overview.md)
- [ExtensionAbility Component](extensionability-overview.md)
- [AbilityStage Container Component](abilitystage.md)
- [Context](application-context-stage.md)
- [Component Startup Rules](component-startup-rules.md)| -| Inter-process communication (IPC)| Learn the process model and common IPC modes of the stage model.| - [Common Events](common-event-overview.md)
- [Background Services](background-services.md)| -| Inter-thread communication| Learn the thread model and common inter-thread communication modes of the stage model.| - [Emitter](itc-with-emitter.md)
- [Worker](itc-with-worker.md)| +| Process model| Learn the process model and common IPC modes of the stage model.| - [Common Events](common-event-overview.md)
- [Background Services](background-services.md)| +| Thread model| Learn the thread model and common inter-thread communication modes of the stage model.| - [Emitter](itc-with-emitter.md)
- [Worker](itc-with-worker.md)| | Mission management| Learn the basic concepts and typical scenarios of mission management in the stage model.| - [Mission Management Scenarios](mission-management-overview.md)
- [Mission Management and Launch Type](mission-management-launch-type.md)
- [Page Stack and Mission List](page-mission-stack.md)| | Application configuration file| Learn the requirements for developing application configuration files in the stage model.| [Application Configuration File](config-file-stage.md)| diff --git a/en/application-dev/application-models/start-page.md b/en/application-dev/application-models/start-page.md index 5831ea0c6f..1def472cd5 100644 --- a/en/application-dev/application-models/start-page.md +++ b/en/application-dev/application-models/start-page.md @@ -83,7 +83,7 @@ struct Index { @State message: string = 'Hello World' build() { - // ... + ... Button("startAbility") .onClick(() => { featureAbility.startAbility({ @@ -98,7 +98,7 @@ struct Index { console.info("startAbility failed errcode:" + err.code) }) }) - // ... + ... Button("page2") .onClick(() => { featureAbility.startAbility({ @@ -113,7 +113,7 @@ struct Index { console.info("startAbility failed errcode:" + err.code) }) }) - // ... + ... } } ``` @@ -136,7 +136,7 @@ export default { }) }, onDestroy() { - // ... + ... }, } ``` diff --git a/en/application-dev/application-models/start-pageability-from-stage.md b/en/application-dev/application-models/start-pageability-from-stage.md index 9d1b7ed27f..bd6a11187f 100644 --- a/en/application-dev/application-models/start-pageability-from-stage.md +++ b/en/application-dev/application-models/start-pageability-from-stage.md @@ -21,7 +21,7 @@ export default class EntryAbility extends UIAbility { onWindowStageCreate(windowStage) { console.info("EntryAbility onWindowStageCreate") windowStage.loadContent('pages/Index', (err, data) => { - // ... + ... }); let want = { bundleName: "com.ohos.fa", @@ -66,7 +66,7 @@ export default class EntryAbility extends UIAbility { onWindowStageCreate(windowStage) { console.info("EntryAbility onWindowStageCreate") windowStage.loadContent('pages/Index', (err, data) => { - // ... + ... }); let want = { bundleName: "com.ohos.fa", diff --git a/en/application-dev/application-models/start-remote-pageability.md b/en/application-dev/application-models/start-remote-pageability.md index 36ee305b49..a52378af30 100644 --- a/en/application-dev/application-models/start-remote-pageability.md +++ b/en/application-dev/application-models/start-remote-pageability.md @@ -83,28 +83,31 @@ After obtaining the data synchronization permission, obtain the trusted device l The following sample code shows how to use **getTrustedDeviceListSync()** to obtain the trusted device list. ```ts -import deviceManager from '@ohos.distributedHardware.deviceManager'; -let dmClass; +import deviceManager from '@ohos.distributedHardware.deviceManager'; + +let dmClass; + function getDeviceManager() { - deviceManager.createDeviceManager('ohos.example.distributedService', (error, dm) => { - if (error) { - console.info('create device manager failed with ' + error) - } - dmClass = dm; - }) + deviceManager.createDeviceManager('ohos.example.distributedService', (error, dm) => { + if (error) { + console.info('create device manager failed with ' + error) + } + dmClass = dm; + }) } -function getRemoteDeviceId() { - if (typeof dmClass === 'object' && dmClass != null) { - let list = dmClass.getTrustedDeviceListSync(); - if (typeof (list) == 'undefined' || typeof (list.length) == 'undefined') { - console.info("EntryAbility onButtonClick getRemoteDeviceId err: list is null"); - return; - } - console.info("EntryAbility onButtonClick getRemoteDeviceId success:" + list[0].deviceId); - return list[0].deviceId; - } else { - console.info("EntryAbility onButtonClick getRemoteDeviceId err: dmClass is null"); - } + +function getRemoteDeviceId() { + if (typeof dmClass === 'object' && dmClass != null) { + let list = dmClass.getTrustedDeviceListSync(); + if (typeof (list) == 'undefined' || typeof (list.length) == 'undefined') { + console.info("EntryAbility onButtonClick getRemoteDeviceId err: list is null"); + return; + } + console.info("EntryAbility onButtonClick getRemoteDeviceId success:" + list[0].deviceId); + return list[0].deviceId; + } else { + console.info("EntryAbility onButtonClick getRemoteDeviceId err: dmClass is null"); + } } ``` @@ -116,21 +119,22 @@ The following sample code shows how to explicitly start a remote PageAbility thr ```ts import featureAbility from '@ohos.ability.featureAbility'; -function onStartRemoteAbility() { - console.info('onStartRemoteAbility begin'); - let params; - let wantValue = { - bundleName: 'ohos.samples.etsDemo', - abilityName: 'ohos.samples.etsDemo.RemoteAbility', - deviceId: getRemoteDeviceId(), // getRemoteDeviceId is defined in the preceding sample code. - parameters: params - }; - console.info('onStartRemoteAbility want=' + JSON.stringify(wantValue)); - featureAbility.startAbility({ - want: wantValue - }).then((data) => { - console.info('onStartRemoteAbility finished, ' + JSON.stringify(data)); - }); - console.info('onStartRemoteAbility end'); + +function onStartRemoteAbility() { + console.info('onStartRemoteAbility begin'); + let params; + let wantValue = { + bundleName: 'ohos.samples.etsDemo', + abilityName: 'ohos.samples.etsDemo.RemoteAbility', + deviceId: getRemoteDeviceId(), // getRemoteDeviceId is defined in the preceding sample code. + parameters: params + }; + console.info('onStartRemoteAbility want=' + JSON.stringify(wantValue)); + featureAbility.startAbility({ + want: wantValue + }).then((data) => { + console.info('onStartRemoteAbility finished, ' + JSON.stringify(data)); + }); + console.info('onStartRemoteAbility end'); } ``` diff --git a/en/application-dev/application-models/subscribe-system-environment-variable-changes.md b/en/application-dev/application-models/subscribe-system-environment-variable-changes.md index c231f483e9..4eecf15808 100644 --- a/en/application-dev/application-models/subscribe-system-environment-variable-changes.md +++ b/en/application-dev/application-models/subscribe-system-environment-variable-changes.md @@ -54,7 +54,7 @@ In OpenHarmony, you can subscribe to system environment variable changes in the // Page display. build() { - // ... + ... } } ``` @@ -77,7 +77,7 @@ In OpenHarmony, you can subscribe to system environment variable changes in the // Page display. build() { - // ... + ... } } ``` @@ -99,19 +99,19 @@ import AbilityStage from '@ohos.app.ability.AbilityStage'; let systemLanguage: string; // System language in use. export default class MyAbilityStage extends AbilityStage { - onCreate() { - systemLanguage = this.context.config.language; // Obtain the system language in use when the AbilityStage instance is loaded for the first time. - console.info(`systemLanguage is ${systemLanguage} `); - } + onCreate() { + systemLanguage = this.context.config.language; // Obtain the system language in use when the AbilityStage instance is loaded for the first time. + console.info(`systemLanguage is ${systemLanguage} `); + } - onConfigurationUpdate(newConfig) { - console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`); + onConfigurationUpdate(newConfig) { + console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`); - if (systemLanguage !== newConfig.language) { - console.info(`systemLanguage from ${systemLanguage} changed to ${newConfig.language}`); - systemLanguage = newConfig.language; // Save the new system language as the system language in use, which will be used for comparison. - } + if (systemLanguage !== newConfig.language) { + console.info(`systemLanguage from ${systemLanguage} changed to ${newConfig.language}`); + systemLanguage = newConfig.language; // Save the new system language as the system language in use, which will be used for comparison. } + } } ``` @@ -131,21 +131,21 @@ import UIAbility from '@ohos.app.ability.UIAbility'; let systemLanguage: string; // System language in use. export default class EntryAbility extends UIAbility { - onCreate(want, launchParam) { - systemLanguage = this.context.config.language; // Obtain the system language in use when the UIAbility instance is loaded for the first time. - console.info(`systemLanguage is ${systemLanguage} `); - } + onCreate(want, launchParam) { + systemLanguage = this.context.config.language; // Obtain the system language in use when the UIAbility instance is loaded for the first time. + console.info(`systemLanguage is ${systemLanguage} `); + } - onConfigurationUpdate(newConfig) { - console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`); + onConfigurationUpdate(newConfig) { + console.info(`onConfigurationUpdated systemLanguage is ${systemLanguage}, newConfig: ${JSON.stringify(newConfig)}`); - if (systemLanguage !== newConfig.language) { - console.info(`systemLanguage from ${systemLanguage} changed to ${newConfig.language}`); - systemLanguage = newConfig.language; // Save the new system language as the system language in use, which will be used for comparison. - } + if (systemLanguage !== newConfig.language) { + console.info(`systemLanguage from ${systemLanguage} changed to ${newConfig.language}`); + systemLanguage = newConfig.language; // Save the new system language as the system language in use, which will be used for comparison. } + } - // ... + ... } ``` @@ -163,10 +163,10 @@ The code snippet below uses FormExtensionAbility as an example to describe how t import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility'; export default class EntryFormAbility extends FormExtensionAbility { - onConfigurationUpdate(newConfig) { - console.info(`newConfig is ${JSON.stringify(newConfig)}`); - } + onConfigurationUpdate(newConfig) { + console.info(`newConfig is ${JSON.stringify(newConfig)}`); + } - // ... + ... } ``` diff --git a/en/application-dev/application-models/thread-model-stage.md b/en/application-dev/application-models/thread-model-stage.md index 7343b9b619..2b1f855980 100644 --- a/en/application-dev/application-models/thread-model-stage.md +++ b/en/application-dev/application-models/thread-model-stage.md @@ -17,5 +17,6 @@ Based on the OpenHarmony thread model, different services run on different threa > **NOTE** > -> - The stage model provides only the main thread and worker thread. Emitter is mainly used for event synchronization within the main thread or between the main thread and worker thread. -> - To view thread information about an application process, run the **hdc shell** command to enter the shell CLI of the device, and then run the **ps -p ** -T command**, where ** indicates the ID of the application process. +> - The stage model provides only the main thread and worker thread. Emitter is mainly used for event synchronization within the worker thread or between the main thread and worker thread. +> - The UIAbility and UI are in the main thread. For details about data synchronization between them, see [Data Synchronization Between UIAbility and UI](uiability-data-sync-with-ui.md). +> - To view thread information about an application process, run the **hdc shell** command to enter the shell CLI of the device, and then run the **ps -p ** -T command**, where ** indicates the [process ID](process-model-stage.md) of the application. diff --git a/en/application-dev/application-models/uiability-data-sync-with-ui.md b/en/application-dev/application-models/uiability-data-sync-with-ui.md index 52967c25c8..6998001c76 100644 --- a/en/application-dev/application-models/uiability-data-sync-with-ui.md +++ b/en/application-dev/application-models/uiability-data-sync-with-ui.md @@ -22,21 +22,21 @@ Before using the APIs provided by **EventHub**, you must obtain an **EventHub** const TAG: string = '[Example].[Entry].[EntryAbility]'; export default class EntryAbility extends UIAbility { - func1(...data) { - // Trigger the event to complete the service operation. - console.info(TAG, '1. ' + JSON.stringify(data)); - } - - onCreate(want, launch) { - // Obtain an eventHub object. - let eventhub = this.context.eventHub; - // Subscribe to the event. - eventhub.on('event1', this.func1); - eventhub.on('event1', (...data) => { - // Trigger the event to complete the service operation. - console.info(TAG, '2. ' + JSON.stringify(data)); - }); - } + func1(...data) { + // Trigger the event to complete the service operation. + console.info(TAG, '1. ' + JSON.stringify(data)); + } + + onCreate(want, launch) { + // Obtain an eventHub object. + let eventhub = this.context.eventHub; + // Subscribe to the event. + eventhub.on('event1', this.func1); + eventhub.on('event1', (...data) => { + // Trigger the event to complete the service operation. + console.info(TAG, '2. ' + JSON.stringify(data)); + }); + } } ``` @@ -62,7 +62,7 @@ Before using the APIs provided by **EventHub**, you must obtain an **EventHub** // Page display. build() { - // ... + ... } } ``` @@ -90,8 +90,7 @@ Before using the APIs provided by **EventHub**, you must obtain an **EventHub** **globalThis** is a global object inside the [ArkTS engine instance](thread-model-stage.md) and can be used by UIAbility, ExtensionAbility, and Page inside the engine. Therefore, you can use **globalThis** for data synchronization. **Figure 1** Using globalThis for data synchronization - - ![globalThis1](figures/globalThis1.png) +![globalThis1](figures/globalThis1.png) The following describes how to use **globalThis** in three scenarios. Precautions are provided as well. @@ -105,18 +104,18 @@ The following describes how to use **globalThis** in three scenarios. Precaution By binding attributes or methods to **globalThis**, you can implement data synchronization between the UIAbility component and UI. For example, if you bind the **want** parameter in the UIAbility component, you can use the **want** parameter information on the UI corresponding to the UIAbility component. -1. When [startAbility()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability) is called to start a UIAbility instance, the **onCreate()** callback is invoked, and the **want** parameter can be passed in the callback. Therefore, you can bind the **want** parameter to **globalThis**. +1. When [startAbility()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability) is called to start a UIAbility instance, the [onCreate()](../reference/apis/js-apis-app-ability-uiAbility.md#uiabilityoncreate) callback is invoked, and the **want** parameter can be passed in the callback. Therefore, you can bind the **want** parameter to **globalThis**. ```ts import UIAbility from '@ohos.app.ability.UIAbility'; export default class EntryAbility extends UIAbility { - onCreate(want, launch) { - globalThis.entryAbilityWant = want; - // ... - } + onCreate(want, launch) { + globalThis.entryAbilityWant = want; + ... + } - // ... + ... } ``` @@ -124,17 +123,17 @@ By binding attributes or methods to **globalThis**, you can implement data synch ```ts let entryAbilityWant; - + @Entry @Component struct Index { aboutToAppear() { entryAbilityWant = globalThis.entryAbilityWant; } - + // Page display. build() { - // ... + ... } } ``` @@ -150,10 +149,10 @@ To implement data synchronization between two UIAbility components in the same a import UIAbility from '@ohos.app.ability.UIAbility' export default class UIAbilityA extends UIAbility { - onCreate(want, launch) { - globalThis.entryAbilityStr = 'UIAbilityA'; // UIAbilityA stores the string "UIAbilityA" to globalThis. - // ... - } + onCreate(want, launch) { + globalThis.entryAbilityStr = 'UIAbilityA'; // UIAbilityA stores the string "UIAbilityA" to globalThis. + ... + } } ``` @@ -161,13 +160,13 @@ To implement data synchronization between two UIAbility components in the same a ```ts import UIAbility from '@ohos.app.ability.UIAbility' - + export default class UIAbilityB extends UIAbility { - onCreate(want, launch) { - // UIAbilityB reads name from globalThis and outputs it. - console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr); - // ... - } + onCreate(want, launch) { + // UIAbilityB reads name from globalThis and outputs it. + console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr); + ... + } } ``` @@ -182,11 +181,11 @@ To implement data synchronization between the UIAbility and ExtensionAbility com import UIAbility from '@ohos.app.ability.UIAbility' export default class UIAbilityA extends UIAbility { - onCreate(want, launch) { - // UIAbilityA stores the string "UIAbilityA" to globalThis. - globalThis.entryAbilityStr = 'UIAbilityA'; - // ... - } + onCreate(want, launch) { + // UIAbilityA stores the string "UIAbilityA" to globalThis. + globalThis.entryAbilityStr = 'UIAbilityA'; + ... + } } ``` @@ -194,21 +193,20 @@ To implement data synchronization between the UIAbility and ExtensionAbility com ```ts import Extension from '@ohos.app.ability.ServiceExtensionAbility' - + export default class ServiceExtAbility extends Extension { - onCreate(want) { - / / ServiceExtAbility reads name from globalThis and outputs it. - console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr); - // ... - } + onCreate(want) { + / / ServiceExtAbility reads name from globalThis and outputs it. + console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr); + ... + } } ``` ### Precautions for Using globalThis -**Figure 2** Precautions for globalThis - +**Figure 2** Precautions for globalThis ![globalThis2](figures/globalThis2.png) - In the stage model, all the UIAbility components in a process share one ArkTS engine instance. When using **globalThis**, do not store objects with the same name. For example, if UIAbilityA and UIAbilityB use **globalThis** to store two objects with the same name, the object stored earlier will be overwritten. @@ -225,10 +223,10 @@ The following provides an example to describe the object overwritten problem in import UIAbility from '@ohos.app.ability.UIAbility' export default class UIAbilityA extends UIAbility { - onCreate(want, launch) { - globalThis.context = this.context; // UIAbilityA stores the context in globalThis. - // ... - } + onCreate(want, launch) { + globalThis.context = this.context; // UIAbilityA stores the context in globalThis. + ... + } } ``` @@ -243,7 +241,7 @@ The following provides an example to describe the object overwritten problem in } // Page display. build() { - // ... + ... } } ``` @@ -254,11 +252,11 @@ The following provides an example to describe the object overwritten problem in import UIAbility from '@ohos.app.ability.UIAbility' export default class UIAbilityB extends UIAbility { - onCreate(want, launch) { - // UIAbilityB overwrites the context stored by UIAbilityA in globalThis. - globalThis.context = this.context; - // ... - } + onCreate(want, launch) { + // UIAbilityB overwrites the context stored by UIAbilityA in globalThis. + globalThis.context = this.context; + ... + } } ``` @@ -273,7 +271,7 @@ The following provides an example to describe the object overwritten problem in } // Page display. build() { - // ... + ... } } ``` @@ -284,10 +282,10 @@ The following provides an example to describe the object overwritten problem in import UIAbility from '@ohos.app.ability.UIAbility' export default class UIAbilityA extends UIAbility { - onCreate(want, launch) { // UIAbilityA will not enter this lifecycle. - globalThis.context = this.context; - // ... - } + onCreate(want, launch) { // UIAbilityA will not enter this lifecycle. + globalThis.context = this.context; + ... + } } ``` @@ -302,7 +300,7 @@ The following provides an example to describe the object overwritten problem in } // Page display. build() { - // ... + ... } } ``` @@ -310,5 +308,3 @@ The following provides an example to describe the object overwritten problem in ## Using AppStorage or LocalStorage for Data Synchronization ArkUI provides AppStorage and LocalStorage to implement application- and UIAbility-level data synchronization, respectively. Both solutions can be used to manage the application state, enhance application performance, and improve user experience. The AppStorage is a global state manager and is applicable when multiple UIAbilities share the same state data. The LocalStorage is a local state manager that manages state data used inside a single UIAbility. They help you control the application state more flexibly and improve the maintainability and scalability of applications. For details, see [State Management of Application-Level Variables](../quick-start/arkts-application-state-management-overview.md). - - \ No newline at end of file diff --git a/en/application-dev/application-models/uiability-intra-device-interaction.md b/en/application-dev/application-models/uiability-intra-device-interaction.md index 9dbbc2be90..208fd1af3b 100644 --- a/en/application-dev/application-models/uiability-intra-device-interaction.md +++ b/en/application-dev/application-models/uiability-intra-device-interaction.md @@ -32,20 +32,20 @@ Assume that your application has two UIAbility components: EntryAbility and Func ```ts let context = ...; // UIAbilityContext - let wantInfo = { + let want = { deviceId: '', // An empty deviceId indicates the local device. bundleName: 'com.example.myapplication', abilityName: 'FuncAbility', - moduleName: 'module1', // moduleName is optional. + moduleName: 'func', // moduleName is optional. parameters: {// Custom information. info: 'From the Index page of EntryAbility', }, } // context is the UIAbilityContext of the initiator UIAbility. - context.startAbility(wantInfo).then(() => { - // ... + context.startAbility(want).then(() => { + console.info('Succeeded in starting ability.'); }).catch((err) => { - // ... + console.error(`Failed to start ability. Code is ${err.code}, message is ${err.message}`); }) ``` @@ -53,18 +53,17 @@ Assume that your application has two UIAbility components: EntryAbility and Func ```ts import UIAbility from '@ohos.app.ability.UIAbility'; - import window from '@ohos.window'; export default class FuncAbility extends UIAbility { onCreate(want, launchParam) { // Receive the parameters passed by the initiator UIAbility. let funcAbilityWant = want; let info = funcAbilityWant?.parameters?.info; - // ... + ... } } ``` - + > **NOTE**
> > In FuncAbility started, you can obtain the PID and bundle name of the UIAbility through **parameters** in the passed **want** parameter. @@ -76,11 +75,14 @@ Assume that your application has two UIAbility components: EntryAbility and Func // context is the UIAbilityContext of the UIAbility instance to stop. context.terminateSelf((err) => { - // ... + if (err.code) { + console.error(`Failed to terminate Self. Code is ${err.code}, message is ${err.message}`); + return; + } }); ``` - > **NOTE** + > **NOTE**
> > When [terminateSelf()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextterminateself) is called to stop the **UIAbility** instance, the snapshot of the instance is retained by default. That is, the mission corresponding to the instance is still displayed in Recents. If you do not want to retain the snapshot, set **removeMissionAfterTerminate** under the [abilities](../quick-start/module-configuration-file.md#abilities) tag to **true** in the [module.json5 file](../quick-start/module-configuration-file.md) of the corresponding UIAbility. @@ -95,20 +97,20 @@ When starting FuncAbility from EntryAbility, you want the result to be returned ```ts let context = ...; // UIAbilityContext - let wantInfo = { + let want = { deviceId: '', // An empty deviceId indicates the local device. bundleName: 'com.example.myapplication', abilityName: 'FuncAbility', - moduleName: 'module1', // moduleName is optional. + moduleName: 'func', // moduleName is optional. parameters: {// Custom information. info: 'From the Index page of EntryAbility', }, } // context is the UIAbilityContext of the initiator UIAbility. - context.startAbilityForResult(wantInfo).then((data) => { - // ... + context.startAbilityForResult(want).then((data) => { + ... }).catch((err) => { - // ... + console.error(`Failed to start ability for result. Code is ${err.code}, message is ${err.message}`); }) ``` @@ -122,7 +124,7 @@ When starting FuncAbility from EntryAbility, you want the result to be returned want: { bundleName: 'com.example.myapplication', abilityName: 'FuncAbility', - moduleName: 'module1', + moduleName: 'func', parameters: { info: 'From the Index page of FuncAbility', }, @@ -130,7 +132,10 @@ When starting FuncAbility from EntryAbility, you want the result to be returned } // context is the AbilityContext of the target UIAbility. context.terminateSelfWithResult(abilityResult, (err) => { - // ... + if (err.code) { + console.error(`Failed to terminate self with result. Code is ${err.code}, message is ${err.message}`); + return; + } }); ``` @@ -140,17 +145,17 @@ When starting FuncAbility from EntryAbility, you want the result to be returned let context = ...; // UIAbilityContext const RESULT_CODE: number = 1001; - // ... + ... // context is the UIAbilityContext of the initiator UIAbility. - context.startAbilityForResult(wantInfo).then((data) => { + context.startAbilityForResult(want).then((data) => { if (data?.resultCode === RESULT_CODE) { // Parse the information returned by the target UIAbility. let info = data.want?.parameters?.info; - // ... + ... } }).catch((err) => { - // ... + console.error(`Failed to start ability for result. Code is ${err.code}, message is ${err.message}`); }) ``` @@ -174,15 +179,15 @@ This section describes how to start the UIAbility of another application through "module": { "abilities": [ { - // ... + ... "skills": [ { "entities": [ - // ... + ... "entity.system.default" ], "actions": [ - // ... + ... "ohos.want.action.viewData" ] } @@ -197,7 +202,7 @@ This section describes how to start the UIAbility of another application through ```ts let context = ...; // UIAbilityContext - let wantInfo = { + let want = { deviceId: '', // An empty deviceId indicates the local device. // Uncomment the line below if you want to implicitly query data only in the specific bundle. // bundleName: 'com.example.myapplication', @@ -207,14 +212,14 @@ This section describes how to start the UIAbility of another application through } // context is the UIAbilityContext of the initiator UIAbility. - context.startAbility(wantInfo).then(() => { - // ... + context.startAbility(want).then(() => { + console.info('Succeeded in starting ability.'); }).catch((err) => { - // ... + console.error(`Failed to start ability. Code is ${err.code}, message is ${err.message}`); }) ``` - The following figure shows the effect. When you click **Open PDF**, a dialog box is displayed for you to select. + The following figure shows the effect. When you click **Open PDF**, a dialog box is displayed for you to select. ![](figures/uiability-intra-device-interaction.png) 3. To stop the **UIAbility** instance after the document application is used, call [terminateSelf()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextterminateself). @@ -224,7 +229,10 @@ This section describes how to start the UIAbility of another application through // context is the UIAbilityContext of the UIAbility instance to stop. context.terminateSelf((err) => { - // ... + if (err.code) { + console.error(`Failed to terminate self. Code is ${err.code}, message is ${err.message}`); + return; + } }); ``` @@ -240,15 +248,15 @@ If you want to obtain the return result when using implicit Want to start the UI "module": { "abilities": [ { - // ... + ... "skills": [ { "entities": [ - // ... + ... "entity.system.default" ], "actions": [ - // ... + ... "ohos.want.action.editData" ] } @@ -263,20 +271,20 @@ If you want to obtain the return result when using implicit Want to start the UI ```ts let context = ...; // UIAbilityContext - let wantInfo = { + let want = { deviceId: '', // An empty deviceId indicates the local device. // Uncomment the line below if you want to implicitly query data only in the specific bundle. // bundleName: 'com.example.myapplication', action: 'ohos.want.action.editData', // entities can be omitted. - entities: ['entity.system.default'], + entities: ['entity.system.default'] } // context is the UIAbilityContext of the initiator UIAbility. - context.startAbilityForResult(wantInfo).then((data) => { - // ... + context.startAbilityForResult(want).then((data) => { + ... }).catch((err) => { - // ... + console.error(`Failed to start ability for result. Code is ${err.code}, message is ${err.message}`); }) ``` @@ -298,7 +306,10 @@ If you want to obtain the return result when using implicit Want to start the UI } // context is the AbilityContext of the target UIAbility. context.terminateSelfWithResult(abilityResult, (err) => { - // ... + if (err.code) { + console.error(`Failed to terminate self with result. Code is ${err.code}, message is ${err.message}`); + return; + } }); ``` @@ -317,10 +328,10 @@ If you want to obtain the return result when using implicit Want to start the UI if (data?.resultCode === RESULT_CODE) { // Parse the information returned by the target UIAbility. let payResult = data.want?.parameters?.payResult; - // ... + ... } }).catch((err) => { - // ... + console.error(`Failed to start ability for result. Code is ${err.code}, message is ${err.message}`); }) ``` @@ -352,27 +363,28 @@ For details about how to obtain the context, see [Obtaining the Context of UIAbi import AbilityConstant from '@ohos.app.ability.AbilityConstant'; let context = ...; // UIAbilityContext -let wantInfo = { +let want = { deviceId: '', // An empty deviceId indicates the local device. bundleName: 'com.example.myapplication', abilityName: 'FuncAbility', - moduleName: 'module1', // moduleName is optional. + moduleName: 'func', // moduleName is optional. parameters: {// Custom information. info: 'From the Index page of EntryAbility', }, } let options = { windowMode: AbilityConstant.WindowMode.WINDOW_MODE_FLOATING -} +}; // context is the UIAbilityContext of the initiator UIAbility. -context.startAbility(wantInfo, options).then(() => { - // ... +context.startAbility(want, options).then(() => { + console.info('Succeeded in starting ability.'); }).catch((err) => { - // ... + console.error(`Failed to start ability. Code is ${err.code}, message is ${err.message}`); }) ``` -The display effect is shown below. +The display effect is shown below. + ![](figures/start-uiability-floating-window.png) ## Starting a Specified Page of UIAbility @@ -387,20 +399,20 @@ When the initiator UIAbility starts another UIAbility, it usually needs to redir ```ts let context = ...; // UIAbilityContext -let wantInfo = { +let want = { deviceId: '', // An empty deviceId indicates the local device. bundleName: 'com.example.myapplication', abilityName: 'FuncAbility', - moduleName: 'module1', // moduleName is optional. + moduleName: 'func', // moduleName is optional. parameters: {// Custom parameter used to pass the page information. router: 'funcA', }, } // context is the UIAbilityContext of the initiator UIAbility. -context.startAbility(wantInfo).then(() => { - // ... +context.startAbility(want).then(() => { + console.info('Succeeded in starting ability.'); }).catch((err) => { - // ... + console.error(`Failed to start ability. Code is ${err.code}, message is ${err.message}`); }) ``` @@ -431,7 +443,7 @@ export default class FuncAbility extends UIAbility { } } windowStage.loadContent(url, (err, data) => { - // ... + ... }); } } @@ -455,7 +467,7 @@ In summary, when a UIAbility instance of application A has been created and the onNewWant(want, launchParam) { // Receive the parameters passed by the initiator UIAbility. globalThis.funcAbilityWant = want; - // ... + ... } } ``` @@ -480,7 +492,7 @@ In summary, when a UIAbility instance of application A has been created and the // Page display. build() { - // ... + ... } } ``` @@ -494,11 +506,11 @@ In summary, when a UIAbility instance of application A has been created and the Call is an extension of the UIAbility capability. It enables the UIAbility to be invoked by and communicate with external systems. The UIAbility invoked can be either started in the foreground or created and run in the background. You can use the call to implement data sharing between two UIAbility instances (CallerAbility and CalleeAbility) through IPC. -The core API used for the call is **startAbilityByCall**, which differs from **startAbility** in the following ways: +The core API used for the call is **startAbilityByCall()**, which differs from **startAbility()** in the following ways: -- **startAbilityByCall** supports UIAbility launch in the foreground and background, whereas **startAbility** supports UIAbility launch in the foreground only. +- **startAbilityByCall()** supports UIAbility launch in the foreground and background, whereas **startAbility()** supports UIAbility launch in the foreground only. -- The CallerAbility can use the caller object returned by **startAbilityByCall** to communicate with the CalleeAbility, but **startAbility** does not provide the communication capability. +- The CallerAbility can use the caller object returned by **startAbilityByCall()** to communicate with the CalleeAbility, but **startAbility()** does not provide the communication capability. Call is usually used in the following scenarios: @@ -506,6 +518,7 @@ Call is usually used in the following scenarios: - Starting the CalleeAbility in the background + **Table 1** Terms used in the call | **Term**| Description| @@ -517,9 +530,9 @@ Call is usually used in the following scenarios: The following figure shows the call process. - Figure 1 Call process +Figure 1 Call process - ![call](figures/call.png) +![call](figures/call.png) - The CallerAbility uses **startAbilityByCall** to obtain a caller object and uses **call()** of the caller object to send data to the CalleeAbility. @@ -537,7 +550,7 @@ The following figure shows the call process. The following table describes the main APIs used for the call. For details, see [AbilityContext](../reference/apis/js-apis-app-ability-uiAbility.md#caller). - **Table 2** Call APIs +**Table 2** Call APIs | API| Description| | -------- | -------- | @@ -571,7 +584,6 @@ For the CalleeAbility, implement the callback to receive data and the methods to ``` 3. Define the agreed parcelable data. - The data formats sent and received by the CallerAbility and CalleeAbility must be consistent. In the following example, the data formats are number and string. @@ -588,7 +600,7 @@ For the CalleeAbility, implement the callback to receive data and the methods to marshalling(messageSequence) { messageSequence.writeInt(this.num); messageSequence.writeString(this.str); - return true + return true; } unmarshalling(messageSequence) { @@ -600,9 +612,9 @@ For the CalleeAbility, implement the callback to receive data and the methods to ``` 4. Implement **Callee.on** and **Callee.off**. - + The time to register a listener for the CalleeAbility depends on your application. The data sent and received before the listener is registered and that after the listener is deregistered are not processed. In the following example, the **MSG_SEND_METHOD** listener is registered in **onCreate** of the UIAbility and deregistered in **onDestroy**. After receiving parcelable data, the application processes the data and returns the data result. You need to implement processing based on service requirements. The sample code is as follows: - + ```ts const TAG: string = '[CalleeAbility]'; @@ -625,16 +637,16 @@ For the CalleeAbility, implement the callback to receive data and the methods to onCreate(want, launchParam) { try { this.callee.on(MSG_SEND_METHOD, sendMsgCallback); - } catch (error) { - console.info(`${MSG_SEND_METHOD} register failed with error ${JSON.stringify(error)}`); + } catch (err) { + console.error(`Failed to register. Code is ${err.code}, message is ${err.message}`); } } onDestroy() { try { this.callee.off(MSG_SEND_METHOD); - } catch (error) { - console.error(TAG, `${MSG_SEND_METHOD} unregister failed with error ${JSON.stringify(error)}`); + } catch (err) { + console.error(`Failed to unregister. Code is ${err.code}, message is ${err.message}`); } } } @@ -661,9 +673,9 @@ For the CalleeAbility, implement the callback to receive data and the methods to caller.on('release', (msg) => { console.info(`caller onRelease is called ${msg}`); }) - console.info('caller register OnRelease succeed'); - } catch (error) { - console.info(`caller register OnRelease failed with ${error}`); + console.info('Succeeded in registering on release.'); + } catch (err) { + console.err(`Failed to caller register on release. Code is ${err.code}, message is ${err.message}`); } } @@ -672,15 +684,15 @@ For the CalleeAbility, implement the callback to receive data and the methods to this.caller = await context.startAbilityByCall({ bundleName: 'com.samples.CallApplication', abilityName: 'CalleeAbility' - }) + }); if (this.caller === undefined) { console.info('get caller failed') - return + return; } console.info('get caller success') this.regOnRelease(this.caller) - } catch (error) { - console.info(`get caller failed with ${error}`) + } (err) { + console.err(`Failed to get caller. Code is ${err.code}, message is ${err.message}`); } } ``` diff --git a/en/application-dev/application-models/uiability-launch-type.md b/en/application-dev/application-models/uiability-launch-type.md index 8f5762fcde..c7aac3d4bc 100644 --- a/en/application-dev/application-models/uiability-launch-type.md +++ b/en/application-dev/application-models/uiability-launch-type.md @@ -17,7 +17,8 @@ The launch type of the UIAbility component refers to the state of the UIAbility Each time [startAbility()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability) is called, if a UIAbility instance of this type already exists in the application process, the instance is reused. Therefore, only one UIAbility instance of this type exists in the system, that is, displayed in **Recents**. -**Figure 1** Demonstration effect in singleton mode +**Figure 1** Demonstration effect in singleton mode + ![uiability-launch-type1](figures/uiability-launch-type1.gif) > **NOTE** @@ -30,11 +31,11 @@ To use the singleton mode, set **launchType** in the [module.json5 configuration ```json { "module": { - // ... + ... "abilities": [ { "launchType": "singleton", - // ... + ... } ] } @@ -56,11 +57,11 @@ To use the multiton mode, set **launchType** in the [module.json5 file](../quick ```json { "module": { - // ... + ... "abilities": [ { "launchType": "multiton", - // ... + ... } ] } @@ -73,6 +74,7 @@ To use the multiton mode, set **launchType** in the [module.json5 file](../quick The **specified** mode is used in some special scenarios. For example, in a document application, you want a document instance to be created each time you create a document, but you want to use the same document instance when you repeatedly open an existing document. **Figure 3** Demonstration effect in specified mode + ![uiability-launch-type3](figures/uiability-launch-type3.gif) For example, there are two UIAbility components: EntryAbility and SpecifiedAbility (with the launch type **specified**). You are required to start SpecifiedAbility from EntryAbility. @@ -82,11 +84,11 @@ For example, there are two UIAbility components: EntryAbility and SpecifiedAbili ```json { "module": { - // ... + ... "abilities": [ { "launchType": "specified", - // ... + ... } ] } @@ -99,23 +101,24 @@ For example, there are two UIAbility components: EntryAbility and SpecifiedAbili // Configure an independent key for each UIAbility instance. // For example, in the document usage scenario, use the document path as the key. function getInstance() { - // ... + ... } + let context =...; // context is the UIAbilityContext of the initiator UIAbility. let want = { - deviceId: '', // An empty deviceId indicates the local device. - bundleName: 'com.example.myapplication', - abilityName: 'SpecifiedAbility', - moduleName: 'module1', // moduleName is optional. - parameters: {// Custom information. - instanceKey: getInstance(), - }, + deviceId: '', // An empty deviceId indicates the local device. + bundleName: 'com.example.myapplication', + abilityName: 'SpecifiedAbility', + moduleName: 'specified', // moduleName is optional. + parameters: {// Custom information. + instanceKey: getInstance(), + }, } - // context is the UIAbilityContext of the initiator UIAbility. - this.context.startAbility(want).then(() => { - // ... + + context.startAbility(want).then(() => { + console.info('Succeeded in starting ability.'); }).catch((err) => { - // ... + console.error(`Failed to start ability. Code is ${err.code}, message is ${err.message}`); }) ``` @@ -127,16 +130,16 @@ For example, there are two UIAbility components: EntryAbility and SpecifiedAbili import AbilityStage from '@ohos.app.ability.AbilityStage'; export default class MyAbilityStage extends AbilityStage { - onAcceptWant(want): string { - // In the AbilityStage instance of the callee, a key value corresponding to a UIAbility instance is returned for UIAbility whose launch type is specified. - // In this example, SpecifiedAbility of module1 is returned. - if (want.abilityName === 'SpecifiedAbility') { - // The returned key string is a custom string. - return `SpecifiedAbilityInstance_${want.parameters.instanceKey}`; - } - - return ''; + onAcceptWant(want): string { + // In the AbilityStage instance of the callee, a key value corresponding to a UIAbility instance is returned for UIAbility whose launch type is specified. + // In this example, SpecifiedAbility of module1 is returned. + if (want.abilityName === 'SpecifiedAbility') { + // The returned key string is a custom string. + return `SpecifiedAbilityInstance_${want.parameters.instanceKey}`; } + + return ''; + } } ``` @@ -154,4 +157,3 @@ For example, there are two UIAbility components: EntryAbility and SpecifiedAbili 3. Return to the home screen and open file B. A new UIAbility instance is started, for example, UIAbility instance 3. 4. Return to the home screen and open file A again. UIAbility instance 2 is started. This is because the system automatically matches the key of the UIAbility instance and starts the UIAbility instance that has a matching key. In this example, UIAbility instance 2 has the same key as file A. Therefore, the system pulls back UIAbility instance 2 and focuses it without creating a new instance. - \ No newline at end of file diff --git a/en/application-dev/application-models/uiability-lifecycle.md b/en/application-dev/application-models/uiability-lifecycle.md index 57200abb8f..8a8506a71f 100644 --- a/en/application-dev/application-models/uiability-lifecycle.md +++ b/en/application-dev/application-models/uiability-lifecycle.md @@ -9,7 +9,7 @@ The lifecycle of UIAbility has four states: **Create**, **Foreground**, **Backgr **Figure 1** UIAbility lifecycle states -![Ability-Life-Cycle](figures/Ability-Life-Cycle.png) +![Ability-Life-Cycle](figures/Ability-Life-Cycle.png) ## Description of Lifecycle States @@ -22,24 +22,25 @@ The **Create** state is triggered when the UIAbility instance is created during ```ts import UIAbility from '@ohos.app.ability.UIAbility'; -import window from '@ohos.window'; export default class EntryAbility extends UIAbility { - onCreate(want, launchParam) { - // Initialize the application. - } - // ... + onCreate(want, launchParam) { + // Initialize the application. + } + ... } ``` +> **NOTE** +> +> [Want](../reference/apis/js-apis-app-ability-want.md) is used as the carrier to transfer information between application components. For details, see [Want](want-overview.md). ### WindowStageCreate and WindowStageDestory After the UIAbility instance is created but before it enters the **Foreground** state, the system creates a WindowStage instance and triggers the **onWindowStageCreate()** callback. You can set UI loading and WindowStage event subscription in the callback. -**Figure 2** WindowStageCreate and WindowStageDestory - -![Ability-Life-Cycle-WindowStage](figures/Ability-Life-Cycle-WindowStage.png) +**Figure 2** WindowStageCreate and WindowStageDestory +![Ability-Life-Cycle-WindowStage](figures/Ability-Life-Cycle-WindowStage.png) In the **onWindowStageCreate()** callback, use [loadContent()](../reference/apis/js-apis-window.md#loadcontent9-2) to set the page to be loaded, and call [on('windowStageEvent')](../reference/apis/js-apis-window.md#onwindowstageevent9) to subscribe to [WindowStage events](../reference/apis/js-apis-window.md#windowstageeventtype9), for example, having or losing focus, or becoming visible or invisible. @@ -48,29 +49,44 @@ import UIAbility from '@ohos.app.ability.UIAbility'; import window from '@ohos.window'; export default class EntryAbility extends UIAbility { - // ... - - onWindowStageCreate(windowStage: Window.WindowStage) { - // Subscribe to the WindowStage events (having or losing focus, or becoming visible or invisible). - try { - windowStage.on('windowStageEvent', (data) => { - console.info('Succeeded in enabling the listener for window stage event changes. Data: ' + - JSON.stringify(data)); - }); - } catch (exception) { - console.error('Failed to enable the listener for window stage event changes. Cause:' + - JSON.stringify(exception)); - }; - - // Set the UI loading. - windowStage.loadContent('pages/Index', (err, data) => { - // ... - }); + ... + + onWindowStageCreate(windowStage: window.WindowStage) { + // Subscribe to the WindowStage events (having or losing focus, or becoming visible or invisible). + try { + windowStage.on('windowStageEvent', (data) => { + let stageEventType: window.WindowStageEventType = data; + switch (stageEventType) { + case window.WindowStageEventType.SHOWN: // Switch to the foreground. + console.info('windowStage foreground.'); + break; + case window.WindowStageEventType.ACTIVE: // Gain focus. + console.info('windowStage active.'); + break; + case window.WindowStageEventType.INACTIVE: // Lose focus. + console.info('windowStage inactive.'); + break; + case window.WindowStageEventType.HIDDEN: // Switch to the background. + console.info('windowStage background.'); + break; + default: + break; + } + }); + } catch (exception) { + console.error('Failed to enable the listener for window stage event changes. Cause:' + + JSON.stringify(exception)); } + + // Set UI loading. + windowStage.loadContent('pages/Index', (err, data) => { + ... + }); + } } ``` -> **NOTE** +> **NOTE**
> > For details about how to use WindowStage, see [Window Development](../windowmanager/application-window-stage.md). @@ -82,18 +98,23 @@ import UIAbility from '@ohos.app.ability.UIAbility'; import window from '@ohos.window'; export default class EntryAbility extends UIAbility { - // ... - - onWindowStageDestroy() { - // Release UI resources. - // Unsubscribe from the WindowStage events such as having or losing focus in the onWindowStageDestroy() callback. - try { - windowStage.off('windowStageEvent'); - } catch (exception) { - console.error('Failed to disable the listener for window stage event changes. Cause:' + - JSON.stringify(exception)); - }; - } + windowStage: window.WindowStage; + ... + + onWindowStageCreate(windowStage: window.WindowStage) { + this.windowStage = windowStage; + ... + } + + onWindowStageDestroy() { + // Release UIresources. + // Unsubscribe from the WindowStage events such as having or losing focus in the onWindowStageDestroy() callback. + try { + 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}`); + }; + } } ``` @@ -115,16 +136,16 @@ When the application is switched to the background, you can disable positioning import UIAbility from '@ohos.app.ability.UIAbility'; export default class EntryAbility extends UIAbility { - // ... + ... - onForeground() { - // Apply for the resources required by the system or re-apply for the resources released in onBackground(). - } + onForeground() { + // Apply for the resources required by the system or re-apply for the resources released in onBackground(). + } - onBackground() { - // Release useless resources when the UI is invisible, or perform time-consuming operations in this callback, - // for example, saving the status. - } + onBackground() { + // Release useless resources when the UI is invisible, or perform time-consuming operations in this callback, + // for example, saving the status. + } } ``` @@ -137,13 +158,12 @@ The UIAbility instance is destroyed when **terminateSelf()** is called or the us ```ts import UIAbility from '@ohos.app.ability.UIAbility'; -import window from '@ohos.window'; export default class EntryAbility extends UIAbility { - // ... + ... - onDestroy() { - // Release system resources and save data. - } + onDestroy() { + // Release system resources and save data. + } } ``` diff --git a/en/application-dev/application-models/uiability-overview.md b/en/application-dev/application-models/uiability-overview.md index e9a904e060..5aa0ca79c4 100644 --- a/en/application-dev/application-models/uiability-overview.md +++ b/en/application-dev/application-models/uiability-overview.md @@ -11,7 +11,9 @@ The following design philosophy is behind UIAbility: 2. Support for multiple device types and window forms -For details, see [Interpretation of the Application Model] (application-model-description.md). +> **NOTE** +> +> For details, see [Interpretation of the Application Model](application-model-description.md). The UIAbility division principles and suggestions are as follows: @@ -33,7 +35,7 @@ To enable an application to properly use a UIAbility component, declare the UIAb ```json { "module": { - // ... + ... "abilities": [ { "name": "EntryAbility", // Name of the UIAbility component. @@ -43,7 +45,7 @@ To enable an application to properly use a UIAbility component, declare the UIAb "label": "$string:EntryAbility_label", // Label of the UIAbility component. "startWindowIcon": "$media:icon", // Index of the icon resource file. "startWindowBackground": "$color:start_window_background", // Index of the background color resource file. - // ... + ... } ] } diff --git a/en/application-dev/application-models/uiability-usage.md b/en/application-dev/application-models/uiability-usage.md index fa8badc6d4..46959284ef 100644 --- a/en/application-dev/application-models/uiability-usage.md +++ b/en/application-dev/application-models/uiability-usage.md @@ -14,14 +14,14 @@ import UIAbility from '@ohos.app.ability.UIAbility'; import window from '@ohos.window'; export default class EntryAbility extends UIAbility { - onWindowStageCreate(windowStage: window.WindowStage) { - // Main window is created. Set a main page for this ability. - windowStage.loadContent('pages/Index', (err, data) => { - // ... - }); - } + onWindowStageCreate(windowStage: window.WindowStage) { + // Main window is created. Set a main page for this ability. + windowStage.loadContent('pages/Index', (err, data) => { + ... + }); + } - // ... + ... } ``` @@ -40,15 +40,14 @@ The UIAbility class has its own context, which is an instance of the [UIAbilityC import UIAbility from '@ohos.app.ability.UIAbility'; export default class EntryAbility extends UIAbility { - onCreate(want, launchParam) { - // Obtain the context of the UIAbility instance. - let context = this.context; - - // ... - } + onCreate(want, launchParam) { + // Obtain the context of the UIAbility instance. + let context = this.context; + ... + } } ``` - + - Import the context module and define the **context** variable in the component. ```ts @@ -68,7 +67,7 @@ The UIAbility class has its own context, which is an instance of the [UIAbilityC // Page display. build() { - // ... + ... } } ``` @@ -93,7 +92,7 @@ The UIAbility class has its own context, which is an instance of the [UIAbilityC // Page display. build() { - // ... + ... } } ``` diff --git a/en/application-dev/application-models/want-overview.md b/en/application-dev/application-models/want-overview.md index 1ce771daf1..cf5cac4399 100644 --- a/en/application-dev/application-models/want-overview.md +++ b/en/application-dev/application-models/want-overview.md @@ -6,43 +6,46 @@ [Want](../reference/apis/js-apis-app-ability-want.md) is an object that transfers information between application components. It is often used as a parameter of [startAbility()](../reference/apis/js-apis-inner-application-uiAbilityContext.md#uiabilitycontextstartability). For example, when UIAbilityA needs to start UIAbilityB and transfer some data to UIAbilityB, it can use the **want** parameter in **startAbility()** to transfer the data. **Figure 1** Want usage + ![usage-of-want](figures/usage-of-want.png) ## Types of Want -- **Explicit Want**: If **abilityName** and **bundleName** are specified when starting an ability, explicit Want is used. - Explicit Want is usually used to start a known target ability in the same application. The target ability is started by specifying **bundleName** of the application where the target ability is located and **abilityName** in the **Want** object. When there is an explicit object to process the request, explicit Want is a simple and effective way to start the target ability. - +- **Explicit Want**: If **abilityName** and **bundleName** are specified in the **want** parameter when starting an an application component, explicit Want is used. + + Explicit Want is usually used to start a known target application component in the same application. The target application component is started by specifying **bundleName** of the application where the target application component is located and **abilityName** in the **Want** object. When there is an explicit object to process the request, explicit Want is a simple and effective way to start the target application component. + ```ts let wantInfo = { - deviceId: '', // An empty deviceId indicates the local device. - bundleName: 'com.example.myapplication', - abilityName: 'FuncAbility', + deviceId: '', // An empty deviceId indicates the local device. + bundleName: 'com.example.myapplication', + abilityName: 'FuncAbility', } ``` - -- **Implicit Want**: If **abilityName** is not specified when starting the ability, implicit Want is used. + +- **Implicit Want**: If **abilityName** is not specified in the **want** parameter when starting the an application component, implicit Want is used. + Implicit Want can be used when the object used to process the request is unclear and the current application wants to use a capability (defined by the [skills tag](../quick-start/module-configuration-file.md#skills)) provided by another application. The system matches all applications that declare to support the capability. For example, for a link open request, the system matches all applications that support the request and provides the available ones for users to select. - + ```ts let wantInfo = { - // Uncomment the line below if you want to implicitly query data only in the specific bundle. - // bundleName: 'com.example.myapplication', - action: 'ohos.want.action.search', - // entities can be omitted. - entities: [ 'entity.system.browsable' ], - uri: 'https://www.test.com:8080/query/student', - type: 'text/plain', + // Uncomment the line below if you want to implicitly query data only in the specific bundle. + // bundleName: 'com.example.myapplication', + action: 'ohos.want.action.search', + // entities can be omitted. + entities: [ 'entity.system.browsable' ], + uri: 'https://www.test.com:8080/query/student', + type: 'text/plain', }; ``` - + > **NOTE** - > - Depending on the ability matching result, the following cases may be possible when you attempt to use implicit Want to start the ability. - > - No ability is matched. The startup fails. - > - An ability that meets the conditions is matched. That ability is started. - > - Multiple abilities that meet the conditions are matched. A dialog box is displayed for users to select one of them. + > - Depending on the application component matching result, the following cases may be possible when you attempt to use implicit Want to start the application component. + > - No application component is matched. The startup fails. + > - An application component that meets the conditions is matched. That application component is started. + > - Multiple application components that meet the conditions are matched. A dialog box is displayed for users to select one of them. > > - If the **want** parameter passed does not contain **abilityName** or **bundleName**, the ServiceExtensionAbility components of all applications cannot be started through implicit Want. > diff --git a/en/application-dev/application-models/widget-development-fa.md b/en/application-dev/application-models/widget-development-fa.md index b766c3420f..3aa1a9fd29 100644 --- a/en/application-dev/application-models/widget-development-fa.md +++ b/en/application-dev/application-models/widget-development-fa.md @@ -20,7 +20,7 @@ Before you get started, it would be helpful if you have a basic understanding of Figure 1 shows the working principles of the widget framework. -**Figure 1** Widget framework working principles in the FA model +**Figure 1** Widget framework working principles in the FA model ![form-extension](figures/form-extension.png) The widget host consists of the following modules: @@ -122,48 +122,48 @@ To create a widget in the FA model, implement the widget lifecycle callbacks. Ge ```ts export default { - onCreate(want) { - console.info('FormAbility onCreate'); - // Called when the widget is created. The widget provider should return the widget data binding class. - let obj = { - "title": "titleOnCreate", - "detail": "detailOnCreate" - }; - let formData = formBindingData.createFormBindingData(obj); - return formData; - }, - onCastToNormal(formId) { - // Called when the widget host converts the temporary widget into a normal one. The widget provider should do something to respond to the conversion. - console.info('FormAbility onCastToNormal'); - }, - onUpdate(formId) { - // Override this method to support scheduled updates, periodic updates, or updates requested by the widget host. - console.info('FormAbility onUpdate'); - let obj = { - "title": "titleOnUpdate", - "detail": "detailOnUpdate" - }; - let formData = formBindingData.createFormBindingData(obj); - formProvider.updateForm(formId, formData).catch((error) => { - console.info('FormAbility updateForm, error:' + JSON.stringify(error)); - }); - }, - onVisibilityChange(newStatus) { - // Called when the widget host initiates an event about visibility changes. The widget provider should do something to respond to the notification. This callback takes effect only for system applications. - console.info('FormAbility onVisibilityChange'); - }, - onEvent(formId, message) { - // If the widget supports event triggering, override this method and implement the trigger. - console.info('FormAbility onEvent'); - }, - onDestroy(formId) { - // Delete widget data. - console.info('FormAbility onDestroy'); - }, - onAcquireFormState(want) { - console.info('FormAbility onAcquireFormState'); - return formInfo.FormState.READY; - }, + onCreate(want) { + console.info('FormAbility onCreate'); + // Called when the widget is created. The widget provider should return the widget data binding class. + let obj = { + "title": "titleOnCreate", + "detail": "detailOnCreate" + }; + let formData = formBindingData.createFormBindingData(obj); + return formData; + }, + onCastToNormal(formId) { + // Called when the widget host converts the temporary widget into a normal one. The widget provider should do something to respond to the conversion. + console.info('FormAbility onCastToNormal'); + }, + onUpdate(formId) { + // Override this method to support scheduled updates, periodic updates, or updates requested by the widget host. + console.info('FormAbility onUpdate'); + let obj = { + "title": "titleOnUpdate", + "detail": "detailOnUpdate" + }; + let formData = formBindingData.createFormBindingData(obj); + formProvider.updateForm(formId, formData).catch((error) => { + console.info('FormAbility updateForm, error:' + JSON.stringify(error)); + }); + }, + onVisibilityChange(newStatus) { + // Called when the widget host initiates an event about visibility changes. The widget provider should do something to respond to the notification. This callback takes effect only for system applications. + console.info('FormAbility onVisibilityChange'); + }, + onEvent(formId, message) { + // If the widget supports event triggering, override this method and implement the trigger. + console.info('FormAbility onEvent'); + }, + onDestroy(formId) { + // Delete widget data. + console.info('FormAbility onDestroy'); + }, + onAcquireFormState(want) { + console.info('FormAbility onAcquireFormState'); + return formInfo.FormState.READY; + }, } ``` @@ -188,15 +188,15 @@ The widget configuration file is named **config.json**. Find the **config.json** ```json - "js": [{ - "name": "widget", - "pages": ["pages/index/index"], - "window": { - "designWidth": 720, - "autoDesignWidth": true - }, - "type": "form" - }] + "js": [{ + "name": "widget", + "pages": ["pages/index/index"], + "window": { + "designWidth": 720, + "autoDesignWidth": true + }, + "type": "form" + }] ``` - The **abilities** module in the **config.json** file corresponds to **FormAbility** of the widget. The internal structure is described as follows: @@ -275,7 +275,7 @@ async function storeFormInfo(formId: string, formName: string, tempFlag: boolean } } -// ... +... onCreate(want) { console.info('FormAbility onCreate'); @@ -293,7 +293,7 @@ async function storeFormInfo(formId: string, formName: string, tempFlag: boolean let formData = formBindingData.createFormBindingData(obj); return formData; } -// ... +... ``` You should override **onDestroy** to implement widget data deletion. @@ -313,14 +313,14 @@ async function deleteFormInfo(formId: string) { } } -// ... +... onDestroy(formId) { console.info('FormAbility onDestroy'); // Delete the persistent widget instance data. // Implement this API based on project requirements. deleteFormInfo(formId); } -// ... +... ``` For details about how to implement persistent data storage, see [Application Data Persistence Overview](../database/app-data-persistence-overview.md). @@ -543,4 +543,3 @@ The following is an example: } } ``` - diff --git a/en/application-dev/application-models/windowextensionability.md b/en/application-dev/application-models/windowextensionability.md index 0f6e28b897..3c1d364cd5 100644 --- a/en/application-dev/application-models/windowextensionability.md +++ b/en/application-dev/application-models/windowextensionability.md @@ -11,7 +11,7 @@ the context is [WindowExtensionContext](../reference/apis/js-apis-inner-applicat > **NOTE** > -> **WindowExtensionAbility** is a system API. To embed a third-party application in another application and display it over the application, switch to the full SDK by following the instructions provided in [Guide to Switching to Full SDK](../../application-dev/quick-start/full-sdk-switch-guide.md). +> **WindowExtensionAbility** is a system API. To embed a third-party application in another application and display it over the application, switch to the full SDK by following the instructions provided in [Guide to Switching to Full SDK](../faqs/full-sdk-switch-guide.md). > @@ -43,7 +43,7 @@ To implement an embedded application, manually create a WindowExtensionAbility i onWindowReady(window) { window.loadContent('WindowExtAbility/pages/index1').then(() => { window.getProperties().then((pro) => { - console.log("WindowExtension " + JSON.stringify(pro)); + console.info("WindowExtension " + JSON.stringify(pro)); }) window.show(); }) @@ -110,4 +110,5 @@ System applications can load the created WindowExtensionAbility through the Abil .backgroundColor(0x64BB5c) } } - ``` \ No newline at end of file + ``` + -- GitLab