fa-pageability.md 9.7 KB
Newer Older
W
wusongqing 已提交
1 2 3 4
# Page Ability Development

## Overview
### Concepts
5
The Page ability implements the ArkUI and provides the capability of interacting with users. When you create an ability in the integrated development environment (IDE), the IDE automatically creates template code. The capabilities related to the Page ability are exposed through the singleton **featureAbility**, and the lifecycle callbacks are exposed through the callbacks in **app.js/app.ets**.
W
wusongqing 已提交
6 7 8

### Page Ability Lifecycle

9
**Ability Lifecycle**
W
wusongqing 已提交
10

11
The ability lifecycle is a general term for all states of an ability, such as **INACTIVE**, **ACTIVE**, and **BACKGROUND**. The following figure shows the lifecycle state transition of the Page ability.
W
wusongqing 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

![PageAbility-Lifecycle](figures/page-ability-lifecycle.png)


Description of ability lifecycle states:

  - **UNINITIALIZED**: The ability is not initialized. This is a temporary state. An ability changes directly to the **INITIAL** state upon its creation.

  - **INITIAL**: This state refers to the initial or stopped state. The ability in this state is not running. The ability enters the **INACTIVE** state after it is started.

  - **INACTIVE**: The ability is visible but does not gain focus.

  - **ACTIVE**: The ability runs in the foreground and gains focus.

  - **BACKGROUND**: The ability returns to the background. After being re-activated, the ability enters the **ACTIVE** state. After being destroyed, the ability enters the **INITIAL** state.

28
**The following figure shows the relationship between lifecycle callbacks and lifecycle states of the Page ability.**
W
wusongqing 已提交
29 30 31

![fa-pageAbility-lifecycle](figures/fa-pageAbility-lifecycle.png)

32
You can override the lifecycle callbacks provided by the Page ability in the **app.js/app.ets** file. Currently, the **app.js** file provides only the **onCreate** and **onDestroy** callbacks, and the **app.ets** file provides the full lifecycle callbacks.
W
wusongqing 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

## Development Guidelines
### Available APIs

**Table 1** APIs provided by featureAbility

| API                                             | Description           |
| --------------------------------------------------- | --------------- |
| void startAbility(parameter: StartAbilityParameter) | Starts an ability.    |
| Context getContext():                               | Obtains the application context.|
| void terminateSelf()                                | Terminates the ability.    |
| bool hasWindowFocus()                               | Checks whether the ability gains focus.   |


### Starting a Local Page Ability

49
**Modules to Import**
W
wusongqing 已提交
50

51 52
```js
  import featureAbility from '@ohos.ability.featureAbility'
W
wusongqing 已提交
53
```
54 55

**Example**
W
wusongqing 已提交
56 57

```javascript
58 59
  import featureAbility from '@ohos.ability.featureAbility'
  featureAbility.startAbility({
W
wusongqing 已提交
60 61 62 63 64 65
  want:
  {
    action: "",
    entities: [""],
    type: "",
    options: {
66
      // Grant the permission to perform read operations on the URI.
W
wusongqing 已提交
67
      authReadUriPermission: true,
68
      // Grant the permission to perform write operations on the URI.
W
wusongqing 已提交
69
      authWriteUriPermission: true,
70
      // Support forwarding the intent result to the ability.
W
wusongqing 已提交
71
      abilityForwardResult: true,
72
      // Enable abiligy continuation.
W
wusongqing 已提交
73 74 75
      abilityContinuation: true,
      // Specify that a component does not belong to ohos.
      notOhosComponent: true,
76
      // Specify that an ability is started.
W
wusongqing 已提交
77
      abilityFormEnabled: true,
78
      // Grant the permission for possible persisting on the URI.
W
wusongqing 已提交
79
      authPersistableUriPermission: true,
80
      // Grant the permission for possible persisting on the prefix URI.
W
wusongqing 已提交
81
      authPrefixUriPermission: true,
82
      // Support distributed scheduling system startup on multiple devices.
W
wusongqing 已提交
83
      abilitySliceMultiDevice: true,
84
      // A service ability is started regardless of whether the host application has been started.
W
wusongqing 已提交
85 86 87
      startForegroundAbility: true,
      // Install the specified ability if it is not installed.
      installOnDemand: true,
88
      // Return the result to the ability slice.
W
wusongqing 已提交
89
      abilitySliceForwardResult: true,
90
      // Install the specified ability with background mode if it is not installed.
W
wusongqing 已提交
91 92 93 94 95 96 97
      installWithBackgroundMode: true
    },
    deviceId: "",
    bundleName: "com.example.startability",
    abilityName: "com.example.startability.MainAbility",
    uri: ""
  },
98 99
  },
  );
W
wusongqing 已提交
100
```
101

W
wusongqing 已提交
102
You can also include **parameters** in the **want** parameter and set its value in the key-value format.
103 104
**Example**

W
wusongqing 已提交
105
```javascript
106 107
  import featureAbility from '@ohos.ability.featureAbility'
  featureAbility.startAbility({
W
wusongqing 已提交
108 109 110 111 112 113 114 115
    want:
    {
        bundleName: "com.example.startability",
        uri: "",
        parameters: {
            abilityName: "com.example.startability.MainAbility"
        }
    },
116 117
  },
  );
W
wusongqing 已提交
118
```
119 120
### Starting a Remote Page Ability (Applying only to System Applications)
>Note: The **getTrustedDeviceListSync** API of the **DeviceManager** class is open only to system applications. Therefore, remote Page ability startup applies only to system applications.
W
wusongqing 已提交
121

122
**Modules to Import**
W
wusongqing 已提交
123 124

```
125 126
  import featureAbility from '@ohos.ability.featureAbility'
  import deviceManager from '@ohos.distributedHardware.deviceManager';
W
wusongqing 已提交
127 128
```

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
**Example**
```ts
  function onStartRemoteAbility() {
  console.info('onStartRemoteAbility begin');
  let params;
  let wantValue = {
    bundleName: 'ohos.samples.etsDemo',
    abilityName: 'ohos.samples.etsDemo.RemoteAbility',
    deviceId: getRemoteDeviceId(),
    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');
  }
```
W
wusongqing 已提交
149

150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
Obtain **deviceId** from **DeviceManager**. The sample code is as follows:
```ts
  import deviceManager from '@ohos.distributedHardware.deviceManager';
  let dmClass;
  function getRemoteDeviceId() {
    if (typeof dmClass === 'object' && dmClass != null) {
        let list = dmClass.getTrustedDeviceListSync();
        if (typeof (list) == 'undefined' || typeof (list.length) == 'undefined') {
            console.log("MainAbility onButtonClick getRemoteDeviceId err: list is null");
            return;
        }
        console.log("MainAbility onButtonClick getRemoteDeviceId success:" + list[0].deviceId);
        return list[0].deviceId;
    } else {
        console.log("MainAbility onButtonClick getRemoteDeviceId err: dmClass is null");
    }
  }
W
wusongqing 已提交
167
```
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205

In the cross-device scenario, the application must also apply for the data synchronization permission from end users. The sample code is as follows:
```ts
  import abilityAccessCtrl from "@ohos.abilityAccessCtrl";
  import bundle from '@ohos.bundle';
  async function RequestPermission() {
  console.info('RequestPermission begin');
  let array: Array<string> = ["ohos.permission.DISTRIBUTED_DATASYNC"];
  let bundleFlag = 0;
  let tokenID = undefined;
  let userID = 100;
  let  appInfo = await bundle.getApplicationInfo('ohos.samples.etsDemo', bundleFlag, userID);
  tokenID = appInfo.accessTokenId;
  let atManager = abilityAccessCtrl.createAtManager();
  let requestPermissions: Array<string> = [];
  for (let i = 0;i < array.length; i++) {
    let result = await atManager.verifyAccessToken(tokenID, array[i]);
    console.info("verifyAccessToken result:" + JSON.stringify(result));
    if (result == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
    } else {
      requestPermissions.push(array[i]);
    }
  }
  console.info("requestPermissions:" + JSON.stringify(requestPermissions));
  if (requestPermissions.length == 0 || requestPermissions == []) {
    return;
  }
  let context = featureAbility.getContext();
  context.requestPermissionsFromUser(requestPermissions, 1, (data)=>{
    console.info("data:" + JSON.stringify(data));
    console.info("data requestCode:" + data.requestCode);
    console.info("data permissions:" + data.permissions);
    console.info("data authResults:" + data.authResults);
  });
  console.info('RequestPermission end');
  }
```

W
wusongqing 已提交
206
### Lifecycle APIs
207
**Table 2** Lifecycle callbacks
W
wusongqing 已提交
208 209 210

| API      | Description                                                        |
| ------------ | ------------------------------------------------------------ |
211 212 213 214 215 216 217 218 219 220
| onShow()     | Called when the ability is switched from the background to the foreground. In this case, the ability is visible to users.|
| onHide()     | Called when the ability is switched from the foreground to the background. In this case, the ability is invisible.|
| onDestroy()  | Called when the ability is destroyed. In this callback, you can make preparations for app exit, such as recycling resources and clearing the cache.|
| onCreate()   | Called when the ability is created for the first time. You can initialize the application in this callback.|
| onInactive() | Called when the ability loses focus. An ability loses focus before entering the background state.|
| onActive()   | Called when the ability is switched to the foreground and gains focus.     |

**Example**
You need to override the lifecycle callbacks in **app.js/app.ets**. The IDE template generates **onCreate()** and **onDestroy()** by default. You need to override the other callbacks.

W
wusongqing 已提交
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
```javascript
export default {
  onCreate() {
    console.info('Application onCreate')
  },
  onDestroy() {
    console.info('Application onDestroy')
  },
  onShow(){
    console.info('Application onShow')
  },
  onHide(){
    console.info('Application onHide')
  },
  onInactive(){
    console.info('Application onInactive')
  },
  onActive(){
    console.info('Application onActive')
  },
}
```
### Development Example
The following sample is provided to help you better understand how to develop a Page ability:

246
[DMS](https://gitee.com/openharmony/app_samples/tree/master/ability/DMS)
W
wusongqing 已提交
247 248

This sample describes how to start a local ability and remote ability.