当前位置: 首页 > Web前端 > HTML5

erget源码分析(三):生命周期

时间:2023-04-05 22:39:10 HTML5

概述下面我们来分析一下erget中的生命周期。src/egret/player/SystemTicker.ts:exportnamespacelifecycle{exporttypeLifecyclePlugin=(context:LifecycleContext)=>void;/***@private*/exportletstage:egret.Stage;/***@private*/exportletcontexts:LifecycleContext[]=[];让isActivate=true;导出类LifecycleContext{pause(){if(isActivate){isActivate=false;stage.dispatchEvent(新事件(Event.DEACTIVATE));如果(onPause){onPause();}}}resume(){如果(!isActivate){isActivate=true;stage.dispatchEvent(新事件(Event.ACTIVATE));如果(onResume){onResume();}}}在更新?:()=>无效;}exportletonResume:()=>void;导出让onPause:()=>void;exportfunctionaddLifecycleListener(plugin:LifecyclePlugin){letcontext=newLifecycleContext();(语境);插件(上下文);}}LifecycleContext定义了监听生命周期的类,pause()、resume()、update()三个成员方法分别执行暂停、恢复、刷新。LifecyclePlugin定义了一个监听应用程序状态变化的函数类型,它有一个LifecycleContext类型的context参数。addLifecycleListener()方法创建一个LifecycleContext实例,并以这个实例为参数调用传入的plugin()方法。好像有点乱,整理一下吧。分析类型LifecyclePluginexporttypeLifecyclePlugin=(context:LifecycleContext)=>void;因为不同的平台对应用状态变化的监控实现不同(Native平台应该是应用native接口,Web使用一些JavascriptAPI),它们的共同点是使用Go到LifecycleContext的一个实例,调动三个方法该实例的pause()、resume()、update()在对应的监控实现代码中对应用进行暂停、恢复、刷新,因此定义了LifecyclePlugin的函数类型。函数addLifecycleListener导出函数addLifecycleListener(plugin:LifecyclePlugin){letcontext=newLifecycleContext();contexts.push(上下文);插件(上下文);}addLifecycleListener()方法作为接收特定LifecyclePlugin类型函数和创建LifecycleContext实例的桥梁。类LifecycleContextletisActivate=true;导出类LifecycleContext{pause(){if(isActivate){isActivate=false;阶段。dispatchEvent(newEvent(Event.DEACTIVATE));如果(onPause){onPause();}}}resume(){if(!isActivate){isActivate=true;stage.dispatchEvent(新事件(Event.ACTIVATE));如果(onResume){onResume();}}}onUpdate?:()=>void;}exportletonResume:()=>void;exportletonPause:()=>void;isActivate作为一个布尔成员属性来标记当前是否存在暂停。这个if语言的作用是防止重复触发pause事件。如果触发了,主要做了两件事,一是向全局事件系统触发一个Event.DEACTIVATE类型的事件(全局事件系统会在后面的章节中详细分析)。一种是调用onPause()方法。我们在egret-core/tools/templates/game/src/Main.ts中找到了这些行=()=>{console.log('hello,world')}})egret.lifecycle.onPause=()=>{egret.ticker.pause();}egret.lifecycle.onResume=()=>{egret.ticker.resume();}//设置加载进度界面//...//初始化Resource资源加载库//...}/***心跳定时器单例*/exportletticker:sys.SystemTicker=newsys.SystemTicker();这里delay定义了onPause()方法,这个方法只有一行,执行egret.ticker.pause()方法。resume()方法类似于pause()方法。示例Web平台Native平台egret-core/src/egret/native/NativeHideHandler.ts:namespaceegret.native{/***@private*/exportletNativeLifeCycleHandler:egret.lifecycle.LifecyclePlugin=(context)=>{egret_native.pauseApp=()=>{context.pause();egret_native.Audio.pauseBackgroundMusic();egret_native.Audio.pauseAllEffects();};egret_native.resumeApp=()=>{context.resume();.resumeBackgroundMusic();egret_native.Audio.resumeAllEffects();};}}这个Native平台监听函数定义了两个native平台方法egret_native.pauseApp()和egret_native.resumeApp()。pauseApp()函数做了两件事:暂停应用程序,暂停播放背景音乐和音效。resumeApp()类似。egret-core/src/egret/native/NativePlayer.ts:namespaceegret.native{/***@private*/exportclassNativePlayerextendsegret.HashObjectimplementsegret.sys.Screen{//...privateinit(option:PlayerOption):void{//...lifecycle.addLifecycleListener(NativeLifeCycleHandler);//...}//...}}在这里,函数NativeLifeCycleHandler()与addLifecycleListener()方法绑定。