本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、Ability启动的核心流程
1. 应用层调用启动API
- 开发者通过
startAbility
方法发起请求,传递目标Ability的Want
对象(包含bundleName
、abilityName
等标识)。
const want: Want = {
bundleName: 'com.example.app',
abilityName: 'TargetAbility'
};
context.startAbility(want, (err) => { /* 错误处理 */ });
2. NAPI桥接与Native层处理
- JS/TS层的调用通过NAPI机制桥接到Native层,触发
Ability::StartAbility
函数,进而调用父类AbilityContext
的启动逻辑 。
// Native层源码示例
ErrCode Ability::StartAbility(const Want &want) {
return AbilityContext::StartAbility(want, -1);
}
3. IPC通信与系统服务介入
- 请求通过
AbilityManagerClient
发送到系统服务进程的AbilityManagerService
(AMS),由AMS协调资源并管理Ability生命周期 。- 关键步骤:
- AMS通过
MissionListManager
创建或复用目标Ability的AbilityRecord
。 - 若目标Ability未运行,AMS通过
AppSpawn
孵化新进程 。
- AMS通过
- 关键步骤:
4. 目标Ability的初始化与生命周期
- 系统创建目标Ability实例,依次触发其生命周期回调:
onCreate() → onWindowStageCreate() → onForeground() → onShow()
最终完成页面渲染。
二、启动模式的影响
鸿蒙支持多种启动模式,决定Ability实例的复用行为:
- Standard模式(默认):每次启动创建新实例。
- Singleton模式:全局单例,重复启动复用同一实例 。
- Specified模式:通过
onAcceptWant
自定义复用逻辑(如根据参数决定是否复用)。
// module.json5配置
"launchType": "standard"
三、跨进程启动的IPC细节
- 通信机制:客户端与服务端通过IDL定义的接口(如
IAppMgr
)进行跨进程调用 。 - 关键类:
AbilityThread
:Ability在应用进程的入口,管理生命周期。AbilityImpl
:处理不同类型Ability(如Page/Service Ability)的逻辑差异 。
四、源码路径
- 时序图:启动流程贯穿应用进程、AMS、AppSpawn等组件 。
- 源码路径:
- Ability管理服务:
foundation/ability/ability_runtime/services/abilitymgr
。 - Native层实现:
foundation/ability/ability_runtime/frameworks/native
。
- Ability管理服务:
五、启动方式
- 显式启动:通过
bundleName
和abilityName
精确指定目标 。 - 隐式启动:通过
action
和entity
匹配(如打开网页) 。