From 9e3f93daf93ace43dd5403106a7b56ab6da1e096 Mon Sep 17 00:00:00 2001 From: JackLee <809262979@qq.com> Date: Sat, 25 Apr 2026 19:26:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=20=E5=AF=B9=E5=AD=97=E4=BD=93=E5=92=8C=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=E9=87=8A=E6=94=BE=E4=B8=8D=E5=86=8D=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=9A=84=E6=97=A5=E5=BF=97=20=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B8=AD=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=AD=90=E7=AA=97=E5=8F=A3,=E9=87=87=E7=94=A8?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E6=8B=89=E8=B5=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/ets/entryability/EntryAbility.ets | 73 +++++++++---------- .../{subwinability => entryability}/README.md | 0 .../{pages/extractdir => init}/ExtractDir.ets | 0 entry/src/main/ets/init/InitFonts.ets | 6 +- entry/src/main/ets/init/InitHub.ets | 5 -- .../src/main/ets/pages/eventhub/EventBase.ets | 68 +++-------------- .../eventhub/EventSubAbility.ets} | 17 ++--- entry/src/main/ets/pages/subpages/MsgTips.ets | 8 +- .../SubAbility.ets} | 27 ++++--- entry/src/main/module.json5 | 6 +- 10 files changed, 77 insertions(+), 133 deletions(-) rename entry/src/main/ets/{subwinability => entryability}/README.md (100%) rename entry/src/main/ets/{pages/extractdir => init}/ExtractDir.ets (100%) rename entry/src/main/ets/{init/InitSubAbility.ets => pages/eventhub/EventSubAbility.ets} (77%) rename entry/src/main/ets/{subwinability/SubWinAbility.ets => subability/SubAbility.ets} (78%) diff --git a/entry/src/main/ets/entryability/EntryAbility.ets b/entry/src/main/ets/entryability/EntryAbility.ets index 7cce59ce..01b1cc68 100644 --- a/entry/src/main/ets/entryability/EntryAbility.ets +++ b/entry/src/main/ets/entryability/EntryAbility.ets @@ -10,11 +10,6 @@ const DOMAIN = 0x0000; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { - 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'); } @@ -26,46 +21,46 @@ export default class EntryAbility extends UIAbility { if(!InitHub(windowStage.getMainWindowSync(),windowStage,this.context)){ console.log("InitHub Failed!") this.context.getApplicationContext().killAllProcesses(); - } - //Get Main Window - windowStage.getMainWindow((err, data) => { - if (err.code) { - console.error(`Failed to obtain the main window. Code: ${err.code}, message: ${err.message}`); - return; - } - mdwInfo.win = data; - mdwInfo.winId =data.getWindowProperties().id; - //moveWindowTo - data?.moveWindowTo(50, 50) - //resize mainWindow Size - data?.resize(mdwInfo.winWidth, mdwInfo.winHeight, (err) => { + }else{ + //Get Main Window + windowStage.getMainWindow((err, data) => { if (err.code) { - console.error(`Failed to resize the window. Code: ${err.code}, message: ${err.message}`); + console.error(`Failed to obtain the main window. Code: ${err.code}, message: ${err.message}`); return; } - console.info(`Succeeded in resizing the window to ${mdwInfo.winWidth}x${mdwInfo.winHeight}.`); - }); + mdwInfo.win = data; + mdwInfo.winId =data.getWindowProperties().id; + //moveWindowTo + data?.moveWindowTo(50, 50) + //resize mainWindow Size + data?.resize(mdwInfo.winWidth, mdwInfo.winHeight, (err) => { + if (err.code) { + console.error(`Failed to resize the window. Code: ${err.code}, message: ${err.message}`); + return; + } + console.info(`Succeeded in resizing the window to ${mdwInfo.winWidth}x${mdwInfo.winHeight}.`); + }); - // windowSizeChangeListener to Change mainWindowWidth&&mainWindowHeight in AppStorage - data?.on('windowSizeChange', (ChangeData) => { - // if Size Change save to AppStorage - mdwInfo.winWidth = ChangeData.width; - mdwInfo.winHeight = ChangeData.height; - console.info('Succeeded in enabling the listener for window size changes. Data:' + ChangeData.width, - ChangeData.height); + // windowSizeChangeListener to Change mainWindowWidth&&mainWindowHeight in AppStorage + data?.on('windowSizeChange', (ChangeData) => { + // if Size Change save to AppStorage + mdwInfo.winWidth = ChangeData.width; + mdwInfo.winHeight = ChangeData.height; + console.info('Succeeded in enabling the listener for window size changes. Data:' + ChangeData.width, + ChangeData.height); + }); }); - }); - //Load page - windowStage.loadContent('pages/Index', (err) => { - if (err.code) { - hilog.error(DOMAIN, 'Tag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err)); - return; - } - IBestInit(windowStage, this.context); - hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.'); - }); + //Load page + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(DOMAIN, 'Tag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err)); + return; + } + IBestInit(windowStage, this.context); + hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.'); + }); + } } - onWindowStageDestroy(): void { AppStorageV2.remove(DisplayWindowInfo); if (mdwInfo.win) { diff --git a/entry/src/main/ets/subwinability/README.md b/entry/src/main/ets/entryability/README.md similarity index 100% rename from entry/src/main/ets/subwinability/README.md rename to entry/src/main/ets/entryability/README.md diff --git a/entry/src/main/ets/pages/extractdir/ExtractDir.ets b/entry/src/main/ets/init/ExtractDir.ets similarity index 100% rename from entry/src/main/ets/pages/extractdir/ExtractDir.ets rename to entry/src/main/ets/init/ExtractDir.ets diff --git a/entry/src/main/ets/init/InitFonts.ets b/entry/src/main/ets/init/InitFonts.ets index 113ea20e..3c6fa5b4 100644 --- a/entry/src/main/ets/init/InitFonts.ets +++ b/entry/src/main/ets/init/InitFonts.ets @@ -4,7 +4,7 @@ import { CheckExistDir, ExtractDir, HilogSadboxFontDirFile -} from "../pages/extractdir/ExtractDir"; +} from "./ExtractDir"; import UIAbility from "@ohos.app.ability.UIAbility"; export function InitFonts(uac:common.UIAbilityContext):boolean{ @@ -25,8 +25,10 @@ export function InitFonts(uac:common.UIAbilityContext):boolean{ uac.startAbility(wantInfo).then(() => { uac.terminateSelf(); }) + }else{ + return false; } - return false; + return true; }else{ HilogSadboxFontDirFile(uac,'fonts'); HilogSadboxFontDirFile(uac,'example'); diff --git a/entry/src/main/ets/init/InitHub.ets b/entry/src/main/ets/init/InitHub.ets index 4b417619..34c2b6af 100644 --- a/entry/src/main/ets/init/InitHub.ets +++ b/entry/src/main/ets/init/InitHub.ets @@ -1,7 +1,6 @@ import { window } from "@kit.ArkUI"; import { InitFonts } from "./InitFonts"; import { InitEnv } from "./InitEnv"; -import { InitSubAbility } from "./InitSubAbility"; import { InitGlobalDWI } from "./InitGlobalDWI"; import { common } from "@kit.AbilityKit"; @@ -18,10 +17,6 @@ export function InitHub(win:window.Window,ws:window.WindowStage,uac:common.UIAbi console.log("InitGlobalDWI Failed!") return false; } - // if(!InitSubAbility(uac)){ - // console.log("InitSubAbility Failed!") - // return false; - // } return true; } diff --git a/entry/src/main/ets/pages/eventhub/EventBase.ets b/entry/src/main/ets/pages/eventhub/EventBase.ets index 197223e0..b662a075 100644 --- a/entry/src/main/ets/pages/eventhub/EventBase.ets +++ b/entry/src/main/ets/pages/eventhub/EventBase.ets @@ -5,6 +5,7 @@ import { window } from '@kit.ArkUI'; import { common, StartOptions,Want } from "@kit.AbilityKit"; import { picker } from '@kit.CoreFileKit'; import NativeOpenCAX from 'libopencax.so'; +import {EventSubAbility} from './EventSubAbility' import { TitleButton, @@ -40,6 +41,7 @@ export class UIMode{ //窗体保存容器 export let subWins:Map=new Map; +export let subStage:Array=[]; export let uiMode:UIMode=new UIMode(true); //随机ID export function RndId(): string { @@ -138,54 +140,6 @@ export function EventPage(event:TitleButton){ } -async function EventCreateWin(): Promise{ - let want: Want = { - bundleName: 'com.example.opencax', - abilityName: 'SubWinAbility' - }; - try { - let ctx = mdwInfo.win?.getUIContext().getHostContext() as common.UIAbilityContext; - - if (!ctx) { - console.error("Failed to get UIAbilityContext"); - return false; - } - // 监听来自 SubWinAbility 的初始化完成事件 - const initializationPromise = new Promise((resolve) => { - - let appCtx =mdwInfo.win?.getUIContext().getHostContext()?.getApplicationContext(); - - appCtx?.eventHub.on('SubWinInitialized', (data: Object) => { - console.info("Received SubWinInitialized event:", data); - // 可以根据 data 中的信息判断是否成功 - if (data && data !== undefined) { - resolve(data as boolean); - } else { - resolve(false); - } - appCtx?.eventHub.off('SubWinInitialized'); - }); - }); - //启动参 - let options: StartOptions = { - withAnimation:false, - hideStartWindow:true - }; - // 发起启动 Ability 的请求 - console.info("Attempting to start SubWinAbility..."); - await ctx.startAbility(want,options); - console.info("StartAbility request sent."); - // --- 等待初始化完成事件 --- - console.info("Waiting for SubWinInitialized event..."); - const initResult = await initializationPromise; - console.info("SubWin initialization result:", initResult); - return initResult; - } catch (error) { - console.error("Failed to start ability:", error); - return false; - } -} - //事件类型:子窗体 export function EventWin(event:TitleButton){ let winInfo: SubWinInfo=new SubWinInfo; @@ -200,14 +154,16 @@ export function EventWin(event:TitleButton){ }else if(event?.btnEvent.command=='Page_Options'){ winInfo=new SubWinInfo(event.btnName,event.btnEvent.page,mdwInfo.winWidth*0.6,mdwInfo.winHeight*0.8); } - EventCreateWin().then((result) => { - //执行订阅命令,加载Sub Window参数 - if(result){ - let context =mdwInfo.win?.getUIContext().getHostContext()?.getApplicationContext(); - context?.eventHub.emit('InitSubWindow',winInfo); - } - }); - + if(subStage.indexOf(event.btnName)===-1){ + let ctx = mdwInfo.win?.getUIContext().getHostContext() as common.UIAbilityContext; + EventSubAbility(ctx).then((result) => { + if(result){ + let context =mdwInfo.win?.getUIContext().getHostContext()?.getApplicationContext(); + context?.eventHub.emit('InitSubWindow',winInfo); + } + }); + subStage.push(event.btnName); + } } diff --git a/entry/src/main/ets/init/InitSubAbility.ets b/entry/src/main/ets/pages/eventhub/EventSubAbility.ets similarity index 77% rename from entry/src/main/ets/init/InitSubAbility.ets rename to entry/src/main/ets/pages/eventhub/EventSubAbility.ets index 934d2955..be39f392 100644 --- a/entry/src/main/ets/init/InitSubAbility.ets +++ b/entry/src/main/ets/pages/eventhub/EventSubAbility.ets @@ -1,9 +1,10 @@ -import { window } from '@kit.ArkUI'; -import { common, StartOptions, UIAbility,Want } from "@kit.AbilityKit"; -export function InitSubAbility(uac:common.UIAbilityContext): boolean{ +import { common, StartOptions,Want } from "@kit.AbilityKit"; +import { util } from '@kit.ArkTS'; + +export async function EventSubAbility(uac:common.UIAbilityContext): Promise{ let want: Want = { bundleName: 'com.example.opencax', - abilityName: 'SubWinAbility' + abilityName: 'SubAbility', }; try { if (!uac) { @@ -12,9 +13,7 @@ export function InitSubAbility(uac:common.UIAbilityContext): boolean{ } // 监听来自 SubWinAbility 的初始化完成事件 const initializationPromise = new Promise((resolve) => { - let appCtx =uac.getApplicationContext(); - appCtx?.eventHub.on('SubWinInitialized', (data: Object) => { console.info("Received SubWinInitialized event:", data); // 可以根据 data 中的信息判断是否成功 @@ -30,16 +29,14 @@ export function InitSubAbility(uac:common.UIAbilityContext): boolean{ let options: StartOptions = { withAnimation:false, hideStartWindow:true - }; - let initResult:boolean=true; // 发起启动 Ability 的请求 console.info("Attempting to start SubWinAbility..."); - uac.startAbility(want,options).then((result) => {}) + await uac.startAbility(want,options); console.info("StartAbility request sent."); // --- 等待初始化完成事件 --- console.info("Waiting for SubWinInitialized event..."); - initializationPromise.then((_initResult) => {initResult=_initResult}) + const initResult = await initializationPromise; console.info("SubWin initialization result:", initResult); return initResult; } catch (error) { diff --git a/entry/src/main/ets/pages/subpages/MsgTips.ets b/entry/src/main/ets/pages/subpages/MsgTips.ets index 61419bea..1f822c7f 100644 --- a/entry/src/main/ets/pages/subpages/MsgTips.ets +++ b/entry/src/main/ets/pages/subpages/MsgTips.ets @@ -20,10 +20,10 @@ export class PromptAction { PromptAction.options = options; } - static async openDialog() { + static openDialog() { if (PromptAction.contentNode !== null) { try{ - await PromptAction.ctx.getPromptAction().openCustomDialog(PromptAction.contentNode, PromptAction.options); + PromptAction.ctx.getPromptAction().openCustomDialog(PromptAction.contentNode, PromptAction.options); }catch(error){ let message = (error as BusinessError).message; let code = (error as BusinessError).code; @@ -32,10 +32,10 @@ export class PromptAction { } } - static async closeDialog() { + static closeDialog() { if (PromptAction.contentNode !== null) { try{ - await PromptAction.ctx.getPromptAction().closeCustomDialog(PromptAction.contentNode); + PromptAction.ctx.getPromptAction().closeCustomDialog(PromptAction.contentNode); }catch(error){ let message = (error as BusinessError).message; let code = (error as BusinessError).code; diff --git a/entry/src/main/ets/subwinability/SubWinAbility.ets b/entry/src/main/ets/subability/SubAbility.ets similarity index 78% rename from entry/src/main/ets/subwinability/SubWinAbility.ets rename to entry/src/main/ets/subability/SubAbility.ets index 50ab92fc..dd83565c 100644 --- a/entry/src/main/ets/subwinability/SubWinAbility.ets +++ b/entry/src/main/ets/subability/SubAbility.ets @@ -4,7 +4,7 @@ import { window, display, AppStorageV2, ColorMetrics } from '@kit.ArkUI'; import {SubWinInfo} from '../pages/eventhub/EventBase' const DOMAIN = 0x0000; -export default class SubWinAbility extends UIAbility { +export default class SubAbility extends UIAbility { private subWin?:window.Window=undefined; private subWinStage?: window.WindowStage=undefined; //注册订阅事件 @@ -20,6 +20,7 @@ export default class SubWinAbility extends UIAbility { } //执行窗口参数 InitWindowParam(winInfo:SubWinInfo){ + ///window.shiftAppWindowFocus //Load page this.subWinStage?.loadContent(winInfo.page, (err) => { if (err.code) { @@ -46,25 +47,23 @@ export default class SubWinAbility extends UIAbility { }); } onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { - try { - //订阅事件 - this.onWinEventHub(); - 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'); + this.onWinEventHub(); } + onAcceptWant(want: Want): string { + return 'SubAbility'; + } onDestroy(): void { hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy'); } - async onWindowStageCreate(windowStage: window.WindowStage): Promise { - this.subWinStage=windowStage; - this.subWin = await windowStage.getMainWindow(); - let ctx =this.context.getApplicationContext() - ctx.eventHub.emit('SubWinInitialized',true); + onWindowStageCreate(windowStage: window.WindowStage): void { + if(this.subWinStage==undefined&&this.subWin==undefined){ + this.subWinStage=windowStage; + this.subWin = windowStage.getMainWindowSync(); + let ctx =this.context.getApplicationContext() + ctx.eventHub.emit('SubWinInitialized',true); + } } onWindowStageDestroy(): void { diff --git a/entry/src/main/module.json5 b/entry/src/main/module.json5 index 63d7eb4c..10e26c2e 100644 --- a/entry/src/main/module.json5 +++ b/entry/src/main/module.json5 @@ -44,15 +44,15 @@ ] }, { - "name": "SubWinAbility", - "srcEntry": "./ets/subwinability/SubWinAbility.ets", + "name": "SubAbility", + "srcEntry": "./ets/subability/SubAbility.ets", "description": "$string:EntryAbility_desc", "icon": "$media:base_opencax_logo", "label": "$string:EntryAbility_label", "startWindowIcon": "$media:base_sub_background", "startWindowBackground": "$color:start_window_background", "exported": true, - "launchType":"multiton", + "launchType":"specified", "skills": [ { "entities": [