@ohos.ability.featureAbility (FeatureAbility)

The FeatureAbility module provides APIs that enable user interaction. You can use the APIs to start or terminate an ability, obtain a dataAbilityHelper object, obtain the window corresponding to the current ability, and connect to or disconnect from a ServiceAbility.

NOTE

The initial APIs of this module are supported since API version 6. Newly added APIs will be marked with a superscript to indicate their earliest API version. The APIs of this module can be used only in the FA model.

Constraints

The APIs of the FeatureAbility module can be called only by PageAbilities.

Modules to Import

import featureAbility from '@ohos.ability.featureAbility';

featureAbility.startAbility

startAbility(parameter: StartAbilityParameter, callback: AsyncCallback<number>): void

Starts an ability. This API uses an asynchronous callback to return the result.

Observe the following when using this API:

  • If an application running in the background needs to call this API to start an ability, it must have the ohos.permission.START_ABILITIES_FROM_BACKGROUND permission.
  • If visible of the target ability is false, the caller must have the ohos.permission.START_INVISIBLE_ABILITY permission.
  • For details about the startup rules for the components in the FA model, see Component Startup Rules (FA Model).

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
parameter StartAbilityParameter Yes Ability to start.
callback AsyncCallback<number> Yes Callback used to return the result.

Example

import featureAbility from '@ohos.ability.featureAbility';
import wantConstant from '@ohos.app.ability.wantConstant';
featureAbility.startAbility(
    {
        want:
        {
            action: '',
            entities: [''],
            type: '',
            flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
            deviceId: '',
            bundleName: 'com.example.myapplication',
            /* In the FA model, abilityName consists of package and ability names. */
            abilityName: 'com.example.myapplication.secondAbility',
            uri: ''
        },
    },
    (err, data) => {
        console.info('startAbility err: ' + JSON.stringify(err) + 'data: ' + JSON.stringify(data));
    }
);

featureAbility.startAbility

startAbility(parameter: StartAbilityParameter): Promise<number>

Starts an ability. This API uses a promise to return the result.

Observe the following when using this API:

  • If an application running in the background needs to call this API to start an ability, it must have the ohos.permission.START_ABILITIES_FROM_BACKGROUND permission.
  • If visible of the target ability is false, the caller must have the ohos.permission.START_INVISIBLE_ABILITY permission.
  • For details about the startup rules for the components in the FA model, see Component Startup Rules (FA Model).

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
parameter StartAbilityParameter Yes Ability to start.

Return value

Type Description
Promise<number> Promise used to return the result.

Example

import featureAbility from '@ohos.ability.featureAbility';
import wantConstant from '@ohos.app.ability.wantConstant';
featureAbility.startAbility(
    {
        want:
        {
            action: 'ohos.want.action.home',
            entities: ['entity.system.home'],
            type: 'MIMETYPE',
            flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
            deviceId: '',
            bundleName: 'com.example.myapplication',
            /* In the FA model, abilityName consists of package and ability names. */
            abilityName: 'com.example.myapplication.secondAbility',
            uri: ''
        },
    }
).then((data) => {
    console.info('startAbility data: ' + JSON.stringify(data));
});

featureAbility.acquireDataAbilityHelper7+

acquireDataAbilityHelper(uri: string): DataAbilityHelper

Obtains a dataAbilityHelper object.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
uri string Yes URI of the file to open.

Return value

Type Description
DataAbilityHelper A utility class used to help other abilities access the Data ability.

Example

import featureAbility from '@ohos.ability.featureAbility';
let dataAbilityHelper = featureAbility.acquireDataAbilityHelper(
    'dataability:///com.example.DataAbility'
);

featureAbility.startAbilityForResult7+

startAbilityForResult(parameter: StartAbilityParameter, callback: AsyncCallback<AbilityResult>): void

Starts an ability. This API uses an asynchronous callback to return the result when the ability is terminated. The following situations may be possible for a started ability:

  • Normally, you can call terminateSelfWithResult to terminate the ability. The result is returned to the caller.
  • If an exception occurs, for example, the ability is killed, an exception message, in which resultCode is -1, is returned to the caller.
  • If different applications call this API to start an ability that uses the sington mode and then call terminateSelfWithResult to terminate the ability, the normal result is returned to the last caller, and an exception message, in which resultCode is -1, is returned to others.

Observe the following when using this API:

  • If an application running in the background needs to call this API to start an ability, it must have the ohos.permission.START_ABILITIES_FROM_BACKGROUND permission.
  • If visible of the target ability is false, the caller must have the ohos.permission.START_INVISIBLE_ABILITY permission.
  • For details about the startup rules for the components in the FA model, see Component Startup Rules (FA Model).

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
parameter StartAbilityParameter Yes Ability to start.
callback AsyncCallback<AbilityResult> Yes Callback used to return the result.

Example

import featureAbility from '@ohos.ability.featureAbility';
import wantConstant from '@ohos.app.ability.wantConstant';
featureAbility.startAbilityForResult(
   {
        want:
        {
            action: 'ohos.want.action.home',
            entities: ['entity.system.home'],
            type: 'MIMETYPE',
            flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
            deviceId: '',
            bundleName: 'com.example.myapplication',
            /* In the FA model, abilityName consists of package and ability names. */
            abilityName: 'com.example.myapplication.secondAbility',
            uri:''
        },
    },
    (err, data) => {
        console.info('startAbilityForResult err: ' + JSON.stringify(err) + 'data: ' + JSON.stringify(data));
    }
);

featureAbility.startAbilityForResult7+

startAbilityForResult(parameter: StartAbilityParameter): Promise<AbilityResult>

Starts an ability. This API uses a promise to return the result when the ability is terminated. The following situations may be possible to an ability after it is started:

  • Normally, you can call terminateSelfWithResult to terminate the ability. The result is returned to the caller.
  • If an exception occurs, for example, the ability is killed, an exception message, in which resultCode is -1, is returned to the caller.
  • If different applications call this API to start an ability that uses the sington mode and then call terminateSelfWithResult to terminate the ability, the normal result is returned to the last caller, and an exception message, in which resultCode is -1, is returned to others.

Observe the following when using this API:

  • If an application running in the background needs to call this API to start an ability, it must have the ohos.permission.START_ABILITIES_FROM_BACKGROUND permission.
  • If visible of the target ability is false, the caller must have the ohos.permission.START_INVISIBLE_ABILITY permission.
  • For details about the startup rules for the components in the FA model, see Component Startup Rules (FA Model).

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
parameter StartAbilityParameter Yes Ability to start.

Return value

Type Description
Promise<AbilityResult> Promise used to return the result.

Example

import featureAbility from '@ohos.ability.featureAbility';
import wantConstant from '@ohos.app.ability.wantConstant';
featureAbility.startAbilityForResult(
    {
        want:
        {
            action: 'ohos.want.action.home',
            entities: ['entity.system.home'],
            type: 'MIMETYPE',
            flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
            deviceId: '',
            bundleName: 'com.example.myapplication',
            /* In the FA model, abilityName consists of package and ability names. */
            abilityName: 'com.example.myapplication.secondAbility',
            uri:'',
            parameters:
            {
                mykey0: 1111,
                mykey1: [1, 2, 3],
                mykey2: '[1, 2, 3]',
                mykey3: 'xxxxxxxxxxxxxxxxxxxxxx',
                mykey4: [1, 15],
                mykey5: [false, true, false],
                mykey6: ['aaaaaa', 'bbbbb', 'ccccccccccc'],
                mykey7: true,
            },
        },
    },
).then((data) => {
    console.info('startAbilityForResult data: ' + JSON.stringify(data));
});

featureAbility.terminateSelfWithResult7+

terminateSelfWithResult(parameter: AbilityResult, callback: AsyncCallback<void>): void

Terminates this ability. If the ability is started by calling startAbilityForResult, the result is returned to the caller in the form of a callback when terminateSelfWithResult is called. Otherwise, no result is returned to the caller when terminateSelfWithResult is called.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
parameter AbilityResult Yes Result returned after the ability is terminated.
callback AsyncCallback<void> Yes Callback used to return the result.

Example

import featureAbility from '@ohos.ability.featureAbility';
import wantConstant from '@ohos.app.ability.wantConstant';
featureAbility.terminateSelfWithResult(
    {
        resultCode: 1,
        want:
        {
            action: 'ohos.want.action.home',
            entities: ['entity.system.home'],
            type: 'MIMETYPE',
            flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
            deviceId: '',
            bundleName: 'com.example.myapplication',
            /* In the FA model, abilityName consists of package and ability names. */
            abilityName: 'com.example.myapplication.secondAbility',
            uri:'',
            parameters: {
                mykey0: 2222,
                mykey1: [1, 2, 3],
                mykey2: '[1, 2, 3]',
                mykey3: 'ssssssssssssssssssssssssss',
                mykey4: [1, 15],
                mykey5: [false, true, false],
                mykey6: ['qqqqq', 'wwwwww', 'aaaaaaaaaaaaaaaaa'],
                mykey7: true,
            }
        },
    },
    (err) => {
        console.error('err: ' + JSON.stringify(err));
    }
);

featureAbility.terminateSelfWithResult7+

terminateSelfWithResult(parameter: AbilityResult): Promise<void>

Terminates this ability. If the ability is started by calling startAbilityForResult, the result is returned to the caller in the form of a promise when terminateSelfWithResult is called. Otherwise, no result is returned to the caller when terminateSelfWithResult is called.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
parameter AbilityResult Yes Result returned after the ability is terminated.

Return value

Type Description
Promise<void> Promise used to return the result.

Example

import featureAbility from '@ohos.ability.featureAbility';
import wantConstant from '@ohos.app.ability.wantConstant';
featureAbility.terminateSelfWithResult(
    {
        resultCode: 1,
        want:
        {
            action: 'ohos.want.action.home',
            entities: ['entity.system.home'],
            type: 'MIMETYPE',
            flags: wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
            deviceId: '',
            bundleName: 'com.example.myapplication',
            /* In the FA model, abilityName consists of package and ability names. */
            abilityName: 'com.example.myapplication.secondAbility',
            uri:'',
            parameters: {
                mykey0: 2222,
                mykey1: [1, 2, 3],
                mykey2: '[1, 2, 3]',
                mykey3: 'ssssssssssssssssssssssssss',
                mykey4: [1, 15],
                mykey5: [false, true, false],
                mykey6: ['qqqqq', 'wwwwww', 'aaaaaaaaaaaaaaaaa'],
                mykey7: true,
            }
        },
    }
).then((data) => {
    console.info('==========================>terminateSelfWithResult=======================>');
});

featureAbility.hasWindowFocus7+

hasWindowFocus(callback: AsyncCallback<boolean>): void

Checks whether the main window of this ability has the focus. This API uses an asynchronous callback to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
callback AsyncCallback<boolean> Yes Callback used to return the result.
If the main window has the focus, true is returned. Otherwise, false is returned.

Example

import featureAbility from '@ohos.ability.featureAbility';
featureAbility.hasWindowFocus((err, data) => {
    console.info('hasWindowFocus err: ' + JSON.stringify(err) + 'data: ' + JSON.stringify(data));
});

featureAbility.hasWindowFocus7+

hasWindowFocus(): Promise<boolean>

Checks whether the main window of this ability has the focus. This API uses a promise to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Return value

Type Description
Promise<boolean> Promise used to return the result. If the main window has the focus, true is returned. Otherwise, false is returned.

Example

import featureAbility from '@ohos.ability.featureAbility';
featureAbility.hasWindowFocus().then((data) => {
    console.info('hasWindowFocus data: ' + JSON.stringify(data));
});

featureAbility.getWant

getWant(callback: AsyncCallback<Want>): void

Obtains the Want corresponding to the ability to start. This API uses an asynchronous callback to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
callback AsyncCallback<Want> Yes Callback used to return the Want.

Example

import featureAbility from '@ohos.ability.featureAbility';
featureAbility.getWant((err, data) => {
    console.info('getWant err: ' + JSON.stringify(err) + 'data: ' + JSON.stringify(data));
});

featureAbility.getWant

getWant(): Promise<Want>

Obtains the Want corresponding to the ability to start. This API uses a promise to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Return value

Type Description
Promise<Want> Promise used to return the Want.

Example

import featureAbility from '@ohos.ability.featureAbility';
featureAbility.getWant().then((data) => {
    console.info('getWant data: ' + JSON.stringify(data));
});

featureAbility.getContext

getContext(): Context

Obtains the application context.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Return value

Type Description
Context Application context.

Example

import featureAbility from '@ohos.ability.featureAbility';
let context = featureAbility.getContext();
context.getBundleName((err, data) => {
    console.info('getBundleName err: ' + JSON.stringify(err) + 'data: ' + JSON.stringify(data));
});

featureAbility.terminateSelf7+

terminateSelf(callback: AsyncCallback<void>): void

Terminates this ability. This API uses an asynchronous callback to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
callback AsyncCallback<void> Yes Callback used to return the result.

Example

import featureAbility from '@ohos.ability.featureAbility';
featureAbility.terminateSelf(
    (err) => {
        console.error('err: ' + JSON.stringify(err));
    }
)

featureAbility.terminateSelf7+

terminateSelf(): Promise<void>

Terminates this ability. This API uses a promise to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Return value

Type Description
Promise<void> Promise used to return the result.

Example

import featureAbility from '@ohos.ability.featureAbility';
featureAbility.terminateSelf().then((data) => {
    console.info('==========================>terminateSelf=======================>');
});

featureAbility.connectAbility7+

connectAbility(request: Want, options:ConnectOptions): number

Connects this ability to a ServiceAbility.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
request Want Yes ServiceAbility to connect.
options ConnectOptions Yes Connection options.

Return value

Type Description
number ID of the connected ServiceAbility. The ID starts from 0 and is incremented by 1 each time a connection is set up.

Example

import rpc from '@ohos.rpc';
import featureAbility from '@ohos.ability.featureAbility';
function onConnectCallback(element, remote){
    console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy));
}
function onDisconnectCallback(element){
    console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId)
}
function onFailedCallback(code){
    console.log('featureAbilityTest ConnectAbility onFailed errCode : ' + code)
}
let connectId = featureAbility.connectAbility(
    {
        deviceId: '',
        bundleName: 'com.ix.ServiceAbility',
        abilityName: 'com.ix.ServiceAbility.ServiceAbilityA',
    },
    {
        onConnect: onConnectCallback,
        onDisconnect: onDisconnectCallback,
        onFailed: onFailedCallback,
    },
);

featureAbility.disconnectAbility7+

disconnectAbility(connection: number, callback:AsyncCallback<void>): void

Disconnects this ability from a specific ServiceAbility. This API uses an asynchronous callback to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
connection number Yes ID of the ServiceAbility to disconnect.
callback AsyncCallback<void> Yes Callback used to return the result.

Example

import rpc from '@ohos.rpc';
import featureAbility from '@ohos.ability.featureAbility';
function onConnectCallback(element, remote){
    console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy));
}
function onDisconnectCallback(element){
    console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId);
}
function onFailedCallback(code){
    console.log('featureAbilityTest ConnectAbility onFailed errCode : ' + code);
}
let connectId = featureAbility.connectAbility(
    {
        bundleName: 'com.ix.ServiceAbility',
        abilityName: 'com.ix.ServiceAbility.ServiceAbilityA',
    },
    {
        onConnect: onConnectCallback,
        onDisconnect: onDisconnectCallback,
        onFailed: onFailedCallback,
    },
);

featureAbility.disconnectAbility(connectId, (err) => {
    console.error('featureAbilityTest disconnectAbility err====>'
    + ('json err=') + JSON.stringify(err));
});

featureAbility.disconnectAbility7+

disconnectAbility(connection: number): Promise<void>

Disconnects this ability from a specific ServiceAbility. This API uses a promise to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
connection number Yes ID of the ServiceAbility to disconnect.

Return value

Type Description
Promise<void> Promise used to return the result.

Example

import rpc from '@ohos.rpc';
import featureAbility from '@ohos.ability.featureAbility';
function onConnectCallback(element, remote){
    console.log('ConnectAbility onConnect remote is proxy:' + (remote instanceof rpc.RemoteProxy));
}
function onDisconnectCallback(element){
    console.log('ConnectAbility onDisconnect element.deviceId : ' + element.deviceId);
}
function onFailedCallback(code){
    console.log('featureAbilityTest ConnectAbility onFailed errCode : ' + code);
}
let connectId = featureAbility.connectAbility(
    {
        bundleName: 'com.ix.ServiceAbility',
        abilityName: 'com.ix.ServiceAbility.ServiceAbilityA',
    },
    {
        onConnect: onConnectCallback,
        onDisconnect: onDisconnectCallback,
        onFailed: onFailedCallback,
    },
);

featureAbility.disconnectAbility(connectId).then((data) => {
    console.log('data : '  + data);
}).catch((error)=>{
    console.error('featureAbilityTest result errCode : ' + error.code);
});

featureAbility.getWindow7+

getWindow(callback: AsyncCallback<window.Window>): void

Obtains the window corresponding to this ability. This API uses an asynchronous callback to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Parameters

Name Type Mandatory Description
callback AsyncCallback<window.Window> Yes Callback used to return the window.

Example

featureAbility.getWindow((err, data) => {
    console.info('getWindow err: ' + JSON.stringify(err) + 'data: ' + typeof(data));
});

featureAbility.getWindow7+

getWindow(): Promise<window.Window>;

Obtains the window corresponding to this ability. This API uses a promise to return the result.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Return value

Type Description
Promise<window.Window> Promise used to return the window.

Example

featureAbility.getWindow().then((data) => {
    console.info('getWindow data: ' + typeof(data));
});

AbilityWindowConfiguration

Defines the window configuration corresponding to this ability. The configuration is obtained through featureAbility.AbilityWindowConfiguration.

Example

featureAbility.AbilityWindowConfiguration.WINDOW_MODE_UNDEFINED

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Name Value Description
WINDOW_MODE_UNDEFINED7+ 0 The PageAbility is in an undefined window display mode.
WINDOW_MODE_FULLSCREEN7+ 1 The PageAbility is in full screen mode.
WINDOW_MODE_SPLIT_PRIMARY7+ 100 The left screen in horizontal direction or the upper screen in vertical direction is the primary window.
WINDOW_MODE_SPLIT_SECONDARY7+ 101 The right screen in horizontal direction or the lower screen in vertical direction is the secondary window.
WINDOW_MODE_FLOATING7+ 102 The PageAbility is displayed in floating window mode.

AbilityStartSetting

Defines the window attribute corresponding to this ability. The abilityStartSetting attribute is an object defined in the format of [key: string]: any, where key is an enumerated value of AbilityStartSetting and value is an enumerated value of AbilityWindowConfiguration.

The value is obtained through featureAbility.AbilityStartSetting.

Example

featureAbility.AbilityStartSetting.BOUNDS_KEY

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Name Value Description
BOUNDS_KEY7+ 'abilityBounds' Ability window size.
WINDOW_MODE_KEY7+ 'windowMode' Ability window display mode.
DISPLAY_ID_KEY7+ 'displayId' Display device ID.

ErrorCode

Enumerates the error codes.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Name Value Description
NO_ERROR7+ 0 No error occurs.
INVALID_PARAMETER7+ -1 Invalid parameter.
ABILITY_NOT_FOUND7+ -2 The ability is not found.
PERMISSION_DENY7+ -3 Permission denied.

DataAbilityOperationType

Enumerates the operation types of a DataAbility. The DataAbility can use an enumerated value to specify the operation type when operating data in batches.

System capability: SystemCapability.Ability.AbilityRuntime.FAModel

Name Value Description
TYPE_INSERT7+ 1 Insert operation.
TYPE_UPDATE7+ 2 Update operation.
TYPE_DELETE7+ 3 Deletion operation.
TYPE_ASSERT7+ 4 Assert operation.

flags

Enumerates the flags that specify how the Want will be handled.

System capability: SystemCapability.Ability.AbilityBase

Name Value Description
FLAG_AUTH_READ_URI_PERMISSION 0x00000001 Grants the permission to read the URI.
FLAG_AUTH_WRITE_URI_PERMISSION 0x00000002 Grants the permission to write data to the URI.
FLAG_ABILITY_FORWARD_RESULT 0x00000004 Returns the result to the ability.
FLAG_ABILITY_CONTINUATION 0x00000008 Continues the ability on a remote device.
FLAG_NOT_OHOS_COMPONENT 0x00000010 Indicates that a component does not belong to OHOS.
FLAG_ABILITY_FORM_ENABLED 0x00000020 Indicates whether the FormAbility is enabled.
FLAG_AUTH_PERSISTABLE_URI_PERMISSION 0x00000040 Grants the permission to make the URI persistent.
System API: This is a system API and cannot be called by third-party applications.
FLAG_AUTH_PREFIX_URI_PERMISSION 0x00000080 Grants the permission to verify URIs by prefix matching.
System API: This is a system API and cannot be called by third-party applications.
FLAG_ABILITYSLICE_MULTI_DEVICE 0x00000100 Indicates the support for cross-device startup in the distributed scheduler.
FLAG_START_FOREGROUND_ABILITY 0x00000200 Indicates that the ability is started in the foreground regardless of whether the host application is started.
System API: This is a system API and cannot be called by third-party applications.
FLAG_ABILITY_CONTINUATION_REVERSIBLE 0x00000400 Indicates that the migration is reversible.
FLAG_INSTALL_ON_DEMAND 0x00000800 Indicates that the specific ability will be installed if it has not been installed.
FLAG_INSTALL_WITH_BACKGROUND_MODE 0x80000000 Indicates that the specific ability will be installed in the background if it has not been installed.
FLAG_ABILITY_CLEAR_MISSION 0x00008000 Clears other operation missions. This flag can be set for the Want object under parameter in the startAbility API passed to the FeatureAbility module and must be used together with flag_ABILITY_NEW_MISSION.
FLAG_ABILITY_NEW_MISSION 0x10000000 Creates a mission on an existing mission stack.
FLAG_ABILITY_MISSION_TOP 0x20000000 Reuses an ability instance if it is on the top of an existing mission stack; creates an ability instance otherwise.