Loading...
Loading...
用于使用 Ability Kit 开发 OpenHarmony 应用时 - UIAbility 生命周期、使用 Want 进行组件通信、Context API、ExtensionAbility、BundleManager,或处理错误如 16000001(ability 未找到)、16000011(context 不存在)等
npx skill4agent add mengfei0053/skills openharmony-ability-kitdocs-OpenHarmony-v6.0-Release/zh-cn/application-dev/reference/apis-ability-kit/digraph ability_decision {
"需要?" [shape=diamond];
"创建 UI 应用" [shape=box];
"后台任务" [shape=box];
"跨应用通信" [shape=box];
"查询应用信息" [shape=box];
"使用 UIAbility" [shape=ellipse];
"使用 ExtensionAbility" [shape=ellipse];
"使用 Want + Context" [shape=ellipse];
"使用 BundleManager" [shape=ellipse];
"需要?" -> "创建 UI 应用" [label="UI"];
"需要?" -> "后台任务" [label="后台"];
"需要?" -> "跨应用通信" [label="通信"];
"需要?" -> "查询应用信息" [label="信息"];
"创建 UI 应用" -> "使用 UIAbility";
"后台任务" -> "使用 ExtensionAbility";
"跨应用通信" -> "使用 Want + Context";
"查询应用信息" -> "使用 BundleManager";
}| 模块 | API 版本 | 用途 | 导入语句 |
|---|---|---|---|
| UIAbility | 9+ | UI 应用组件 | |
| AbilityStage | 9+ | 模块级管理器 | |
| Want | 9+ | 组件通信 | |
| common (Context) | 9+ | Context API | |
| bundleManager | 9+ | 包查询 | |
| wantAgent | 9+ | Want 封装 | |
| appManager | 9+ | 应用生命周期管理 | |
| AbilityConstant | 9+ | Ability 常量 | |
| Configuration | 9+ | 系统配置 | |
Create -> WindowStageCreate -> Foreground <-> Background -> WindowStageDestroy -> Destroy| 回调 | 调用时机 | 使用场景 |
|---|---|---|
| Ability 创建时 | 初始化非 UI 资源 |
| 窗口就绪时 | 加载 UI 内容,设置窗口属性 |
| 进入前台时 | 恢复操作,刷新数据 |
| 进入后台时 | 保存状态,释放资源 |
| 窗口销毁时 | 清理窗口资源 |
| Ability 销毁时 | 最终清理 |
| 重新激活(单例模式) | 处理新的意图 |
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', 'Ability onCreate');
// 初始化非 UI 资源
}
onWindowStageCreate(windowStage: window.WindowStage): void {
hilog.info(0x0000, 'testTag', 'Ability onWindowStageCreate');
// 加载主页面
windowStage.loadContent('pages/Index', (err, data) => {
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load content: %{public}s', JSON.stringify(err));
return;
}
hilog.info(0x0000, 'testTag', 'Succeeded in loading content');
});
}
onForeground(): void {
hilog.info(0x0000, 'testTag', 'Ability onForeground');
}
onBackground(): void {
hilog.info(0x0000, 'testTag', 'Ability onBackground');
}
onDestroy(): void {
hilog.info(0x0000, 'testTag', 'Ability onDestroy');
}
}| 类型 | 值 | 说明 | 使用场景 |
|---|---|---|---|
| 0 | 单实例 | 主入口、设置页 |
| 1 | 多实例 | 文档编辑器 |
| 2 | 开发者控制 | 自定义实例管理 |
module.json5{
"abilities": [{
"name": "EntryAbility",
"launchType": "singleton"
}]
}| 回调 | 调用时机 | 使用场景 |
|---|---|---|
| 模块首次加载时 | 资源预加载、线程创建 |
| 最后一个 ability 退出时 (API 12+) | 模块清理 |
| 指定启动模式 | 返回唯一 ability 键 |
| 系统配置变化时 | 处理语言/主题变化 |
| 内存压力时 | 释放非必要资源 |
import { AbilityStage, Want, Configuration, AbilityConstant } from '@kit.AbilityKit';
export default class MyAbilityStage extends AbilityStage {
onCreate(): void {
console.log('MyAbilityStage onCreate');
// 模块初始化
}
onAcceptWant(want: Want): string {
// 对于指定启动模式,返回唯一键
if (want.abilityName === 'DocumentAbility') {
return want.parameters?.docId as string || 'default';
}
return '';
}
onConfigurationUpdate(config: Configuration): void {
console.log(`Config updated: ${JSON.stringify(config)}`);
}
onMemoryLevel(level: AbilityConstant.MemoryLevel): void {
console.log(`Memory level: ${level}`);
// 内存低时释放缓存
}
}| 字段 | 类型 | 说明 |
|---|---|---|
| string | 目标包名 |
| string | 目标 ability 名称 |
| string | 目标模块名(可选) |
| string | 要执行的操作 |
| string[] | 实体类别 |
| string | 数据 URI |
| string | MIME 类型 |
| Record<string, Object> | 自定义参数 |
| number | Want 标志 |
let want: Want = {
bundleName: 'com.example.myapp',
abilityName: 'SecondAbility',
parameters: {
key1: 'value1',
key2: 123
}
};
this.context.startAbility(want);// API 11+ 要求第三方应用使用隐式启动
// 使用 openLink 代替:
this.context.openLink('https://example.com/path');let want: Want = {
action: 'ohos.want.action.viewData',
entities: ['entity.system.browsable'],
uri: 'https://example.com'
};
this.context.startAbility(want);let want: Want = {
bundleName: 'com.example.myapp',
abilityName: 'SelectAbility'
};
this.context.startAbilityForResult(want).then((result) => {
console.log(`Result code: ${result.resultCode}`);
console.log(`Result data: ${JSON.stringify(result.want?.parameters)}`);
});// 在目标 ability 中
let resultWant: Want = {
parameters: {
selectedItem: 'item1'
}
};
this.context.terminateSelfWithResult({
resultCode: 0,
want: resultWant
});| 标志 | 值 | 说明 |
|---|---|---|
| 0x00000001 | 授予读取 URI 权限 |
| 0x00000002 | 授予写入 URI 权限 |
| 0x00000800 | 按需安装 |
| Context | 作用域 | 关键 API |
|---|---|---|
| 应用级 | |
| UIAbility | |
| AbilityStage | 模块级资源访问 |
| ExtensionAbility | Extension 特定操作 |
import { UIAbility, common } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
onCreate(): void {
// UIAbilityContext
let uiAbilityContext: common.UIAbilityContext = this.context;
// ApplicationContext
let appContext: common.ApplicationContext = this.context.getApplicationContext();
}
}import { common } from '@kit.AbilityKit';
@Entry
@Component
struct Index {
build() {
Button('Start')
.onClick(() => {
let context = getContext(this) as common.UIAbilityContext;
context.startAbility({ /* want */ });
})
}
}| API | 说明 |
|---|---|
| 启动另一个 ability |
| 启动并获取结果 |
| 关闭当前 ability |
| 带结果关闭 |
| 连接到服务 |
| 断开服务连接 |
| 请求权限 |
| 设置最近任务标签 |
| 设置最近任务图标 |
| API | 说明 |
|---|---|
| 监听 ability 生命周期 |
| 监听环境变化 |
| 监听应用状态 |
| 获取进程信息 |
| 强制退出所有进程 |
| 设置深色/浅色模式 |
| 设置应用语言 |
| 重启应用 (API 12+) |
import { UIAbility, AbilityLifecycleCallback } from '@kit.AbilityKit';
export default class EntryAbility extends UIAbility {
private lifecycleId: number = -1;
onCreate(): void {
let callback: AbilityLifecycleCallback = {
onAbilityCreate(ability) {
console.log(`Ability created: ${ability.context.abilityInfo.name}`);
},
onAbilityForeground(ability) {
console.log(`Ability foreground: ${ability.context.abilityInfo.name}`);
},
onAbilityBackground(ability) {
console.log(`Ability background: ${ability.context.abilityInfo.name}`);
},
onAbilityDestroy(ability) {
console.log(`Ability destroyed: ${ability.context.abilityInfo.name}`);
},
onWindowStageCreate(ability, windowStage) {},
onWindowStageActive(ability, windowStage) {},
onWindowStageInactive(ability, windowStage) {},
onWindowStageDestroy(ability, windowStage) {},
onAbilityContinue(ability) {}
};
let appContext = this.context.getApplicationContext();
this.lifecycleId = appContext.on('abilityLifecycle', callback);
}
onDestroy(): void {
let appContext = this.context.getApplicationContext();
appContext.off('abilityLifecycle', this.lifecycleId);
}
}| 类型 | 值 | 说明 | 使用场景 |
|---|---|---|---|
| 0 | FormExtensionAbility | 卡片开发 |
| 1 | WorkSchedulerExtensionAbility | 后台任务 |
| 2 | InputMethodExtensionAbility | 输入法 |
| 4 | AccessibilityExtensionAbility | 辅助功能服务 |
| 9 | BackupExtensionAbility | 数据备份/恢复 |
| 11 | EnterpriseAdminExtensionAbility | 企业设备管理 |
| 16 | ShareExtensionAbility | 分享功能 |
| 18 | DriverExtensionAbility | 设备驱动 |
| 19 | ActionExtensionAbility | 自定义操作 |
| 21 | EmbeddedUIExtensionAbility | 跨进程 UI 嵌入 |
| 标志 | 值 | 说明 |
|---|---|---|
| 0x00000000 | 仅默认信息 |
| 0x00000001 | 包含 applicationInfo |
| 0x00000002 | 包含 hapModuleInfo |
| 0x00000004 | 包含 ability 信息(需 HAP_MODULE) |
| 0x00000008 | 包含 extension 信息(需 HAP_MODULE) |
| 0x00000010 | 包含权限 |
| 0x00000020 | 包含元数据 |
| 0x00000080 | 包含签名信息 |
import { bundleManager } from '@kit.AbilityKit';
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION |
bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_HAP_MODULE |
bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_ABILITY;
try {
let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags);
console.log(`Bundle name: ${bundleInfo.name}`);
console.log(`Version: ${bundleInfo.versionName}`);
// 遍历 abilities
bundleInfo.hapModulesInfo?.forEach((hapInfo) => {
hapInfo.abilitiesInfo?.forEach((abilityInfo) => {
console.log(`Ability: ${abilityInfo.name}`);
});
});
} catch (err) {
console.error(`Failed: ${err.message}`);
}import { bundleManager } from '@kit.AbilityKit';
let moduleName = 'entry';
let abilityName = 'EntryAbility';
let metadataName = 'ability_metadata';
try {
let profiles = bundleManager.getProfileByAbilitySync(moduleName, abilityName, metadataName);
console.log(`Profile: ${JSON.stringify(profiles)}`);
} catch (err) {
console.error(`Failed: ${err.message}`);
}import { UIAbility, Caller, Callee } from '@kit.AbilityKit';
import { rpc } from '@kit.IPCKit';
const MSG_SEND_METHOD: string = 'CallSendMsg';
class MyParcelable implements rpc.Parcelable {
num: number = 0;
str: string = '';
marshalling(messageSequence: rpc.MessageSequence): boolean {
messageSequence.writeInt(this.num);
messageSequence.writeString(this.str);
return true;
}
unmarshalling(messageSequence: rpc.MessageSequence): boolean {
this.num = messageSequence.readInt();
this.str = messageSequence.readString();
return true;
}
}
function sendMsgCallback(data: rpc.MessageSequence): rpc.Parcelable {
let receivedData = new MyParcelable();
data.readParcelable(receivedData);
console.log(`Received: ${receivedData.str}`);
// 返回结果
let reply = new MyParcelable();
reply.num = receivedData.num + 1;
reply.str = 'reply';
return reply;
}
export default class CalleeAbility extends UIAbility {
onCreate(): void {
this.callee.on(MSG_SEND_METHOD, sendMsgCallback);
}
onDestroy(): void {
this.callee.off(MSG_SEND_METHOD);
}
}import { UIAbility, Caller, Want } from '@kit.AbilityKit';
export default class CallerAbility extends UIAbility {
private caller: Caller | undefined;
async callRemoteAbility(): Promise<void> {
let want: Want = {
bundleName: 'com.example.myapp',
abilityName: 'CalleeAbility'
};
try {
this.caller = await this.context.startAbilityByCall(want);
let data = new MyParcelable();
data.num = 1;
data.str = 'hello';
let reply = await this.caller.call('CallSendMsg', data);
let result = new MyParcelable();
reply.readParcelable(result);
console.log(`Reply: ${result.str}`);
} catch (err) {
console.error(`Call failed: ${err.message}`);
}
}
releaseCall(): void {
if (this.caller) {
this.caller.release();
this.caller = undefined;
}
}
}| 错误码 | 消息 | 原因 | 解决方案 |
|---|---|---|---|
| 16000001 | 指定的 ability 不存在 | Ability 未找到 | 检查 bundleName、moduleName、abilityName;确认应用已安装 |
| 16000002 | Ability 类型不正确 | API 的 ability 类型错误 | 匹配 API 与 ability 类型 |
| 16000004 | 无法启动不可见组件 | 目标 exported=false | 设置 exported=true 或请求 START_INVISIBLE_ABILITY 权限 |
| 16000005 | 进程权限失败 | 权限不足 | 检查所需权限 |
| 16000011 | Context 不存在 | Context 不可用 | 验证 context 有效性 |
| 16000015 | 服务超时 | 请求超时 | 稍后重试 |
| 16000018 | 禁止第三方重定向 | API 11+ 禁止显式启动 | 使用隐式启动或 openLink() |
| 16000019 | 未找到匹配的 ability | 隐式启动无匹配 | 检查 action/entities/uri 配置 |
| 16000050 | 内部错误 | 系统错误 | 检查日志,重试 |
| 16000053 | Ability 未置顶 | restartApp 需要焦点 | 确保应用获得焦点 |
| 16000063 | 重启目标无效 | 非同一应用或非 UIAbility | 检查重启目标 |
| 16000064 | 重启过于频繁 | 重启间隔 < 3 秒 | 至少等待 3 秒 |
| 错误码 | 消息 | 原因 | 解决方案 |
|---|---|---|---|
| 17700001 | Bundle 未找到 | 应用未安装 | 验证安装 |
| 17700002 | Module 未找到 | Module 未安装 | 检查 moduleName |
| 17700003 | Ability 未找到 | Ability 不存在 | 检查 abilityName |
| 17700024 | HAP 中无配置文件 | 缺少配置文件 | 将配置添加到 metadata |
| 17700026 | 指定的 bundle 被禁用 | Bundle 被禁用 | 启用该 bundle |
| 17700029 | Ability 被禁用 | Ability 被禁用 | 启用该 ability |
// 对于 UI 操作 - 使用 UIAbilityContext
let uiContext = this.context; // 在 UIAbility 中
// 对于应用级操作 - 使用 ApplicationContext
let appContext = this.context.getApplicationContext();onForeground(): void {
// 恢复:刷新数据、重新启动动画
}
onBackground(): void {
// 暂停:保存状态、释放重量级资源
// 不要依赖此方法进行关键保存
}// 不要这样做: 显式启动第三方应用
let want = { bundleName: 'com.other.app', abilityName: 'Main' };
// 应该这样做: 使用 openLink 或隐式启动
this.context.openLink('https://example.com');
// 或者
let want = { action: 'ohos.want.action.viewData', uri: 'https://...' };onDestroy(): void {
// 取消注册回调
appContext.off('abilityLifecycle', this.lifecycleId);
// 释放连接
if (this.caller) {
this.caller.release();
}
}try {
await this.context.startAbility(want);
} catch (err) {
if (err.code === 16000001) {
console.error('Ability not found');
} else if (err.code === 16000004) {
console.error('Target is not exported');
} else {
console.error(`Error: ${err.code} - ${err.message}`);
}
}| 主题 | 文件路径 |
|---|---|
| UIAbility | |
| AbilityStage | |
| Want | |
| UIAbilityContext | |
| ApplicationContext | |
| bundleManager | |
| Ability 错误码 | |
| Bundle 错误码 | |