通知点开冷启动参数是空的,因为 onNewWant 只在实例活着时才走
本地通知携带 WantAgent,用户点通知,应用冷启动,详情页打开了,但商品 ID 是 undefined。热启动测试一切正常,杀进程再点,参数就丢。你去看 WantAgent 的构造,参数明明塞进去了。
冷启动走的是 onCreate(want) → onWindowStageCreate → onForeground,根本不经过 onNewWant。onNewWant 只在 UIAbility 实例已经存在、系统把新的 Want 投递过来时才触发。如果你只在 onNewWant 里解析参数并跳转,冷启动这条路径从头到尾没人接住那个 Want。
两条入口必须汇到同一个处理函数
onCreate 和 onNewWant 各调一次同一个 handleWant(want),不要在其中一个里写完整跳转逻辑、另一个里只写一半。onCreate 执行时 windowStage 还没创建,页面也可能没加载,所以 handleWant 不能直接 pushPath,它应该先把解析出来的路由意图存进一个门禁对象,等页面容器就绪后再消费。
typescript
export default class EntryAbility extends UIAbility {
onCreate(want: Want): void {
this.handleWant(want)
}
onNewWant(want: Want): void {
this.handleWant(want)
}
private handleWant(want: Want): void {
const intent = parseRouteIntent(want)
if (intent) {
DeepLinkGate.accept(intent)
}
}
}
DeepLinkGate 只缓存最新意图,用 traceId 拦截重复投递。页面侧在 Navigation 绑定完成、窗口宽度确定之后调一次 takeWhenReady(),取完立刻清空 pending,避免重组布局时同一意图被消费两次。
WantAgent 的 action 不对,后台根本拉不起来
代理提醒、通知点击这类延迟触发场景,WantAgent 的 action 要设为 ohos.want.action.home。不设或者设错,系统可能按后台启动限制直接拦截,表现是“点了没反应,日志也没有”。另外,WantAgent 的生命周期独立于 Ability,它不是可靠消息队列;调用方进程退出后,延迟触发可能根本不会发生。长周期、必须送达的跳转,应该走推送或服务端驱动,不要把业务可靠性押在 WantAgent 上。
更多推荐
所有评论(0)