在配置App Linking时,应用作为被拉起应用,冷启动情况下应用闪退,报错显示UIAbility未正常启动,涉及在EntryAbility的onCreate方法中有处理App Linking参数和跳转相关页面的操作。
问题代码的EntryAbility中参数配置如下:
// 冷启动
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
this.getRouterUri(want);
console.info('Ability onCreate');
}
private getRouterUri(want: Want) {
let uri: string | undefined = want?.uri;
if (uri) {
// 根据解析的uri跳转至相应页面,例如需要跳转页面为"pages/Access"
let status: router.RouterState = router.getState();
if (status && status.name !== 'Access' && uri) {
// 根据uri参数做业务处理
router.replaceUrl({
url: 'pages/Page1',
params: {
uri: uri
}
})
}
}
} error:Error message:Internal error. UI execution context not found. Error code:100001 Stacktrace: at onCreate (entry/src/main/ets/entryability/EntryAbility.ets:13:38)
分析当前问题出在冷启动时在onCreate方法中进行页面跳转(router操作)的处理方式上,导致UIAbility启动异常。需要重新审视这种在生命周期早期进行页面跳转的合理性,并考虑合适的处理参数和加载页面的时机。
import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
const DOMAIN = 0x0000;
export default class EntryAbility extends UIAbility {
funcAbilityWant: Want | undefined = undefined;
uiContext: UIContext | undefined = undefined;
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 接收调用方UIAbility传过来的参数
this.funcAbilityWant = want;
try {
this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
} catch (err) {
hilog.error(DOMAIN, 'testTag', 'Failed to set colorMode. Cause: %{public}s', JSON.stringify(err));
}
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
hilog.info(DOMAIN, 'testTag', '%{public}s', JSON.stringify(launchParam));
}
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
console.info('Ability onWindowStageCreate');
// Main window is created, set main page for this ability
let url = 'pages/Index';
if (this.funcAbilityWant?.parameters?.router && this.funcAbilityWant.parameters.router === 'funcA') {
url = 'pages/Page_ColdStartUp'; // 根据实际业务设置
}
windowStage.loadContent(url, (err, data) => {
if (err.code) {
hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
return;
}
hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
hilog.info(DOMAIN, 'testTag', 'data: %{public}s', JSON.stringify(data));
});
}
// 示例省略其他生命周期函数
}; 这个问题是在Ability/AbilityStage生命周期:该阶段主要是AbilityStage/Ability的启动生命周期,执行相应的生命周期回调。