erget源码剖析(3):生命周期

概述

下面我们来剖析一下erget中的生命周期。

src/egret/player/SystemTicker.ts:

   export namespace lifecycle {

        export type LifecyclePlugin = (context: LifecycleContext) => void;

        /**
         * @private
         */
        export let stage: egret.Stage;

        /**
         * @private
         */
        export let contexts: LifecycleContext[] = [];
        let isActivate = true;

        export class LifecycleContext {

            pause() {
                if (isActivate) {
                    isActivate = false;
                    stage.dispatchEvent(new Event(Event.DEACTIVATE));
                    if (onPause) {
                        onPause();
                    }
                }
            }

            resume() {
                if (!isActivate) {
                    isActivate = true;
                    stage.dispatchEvent(new Event(Event.ACTIVATE));
                    if (onResume) {
                        onResume();
                    }
                }
            }

            onUpdate?: () => void;
        }

        export let onResume: () => void;

        export let onPause: () => void;

        export function addLifecycleListener(plugin: LifecyclePlugin) {
            let context = new LifecycleContext();
            contexts.push(context);
            plugin(context);
        }
    }

LifecycleContext定义了监听生命周期的类,pause(),resume(),update()这个三个成员要领离别实行停息、继承和革新。LifecyclePlugin定义了一个监听应用程序状况变化的函数范例,它有一个范例为LifecycleContext的context参数。addLifecycleListener()要领建立了LifecycleContext的一个实例,把这个实例作为参数调用了传入的plugin()要领。
如许看彷佛有点乱,我们梳理一下。

剖析

type LifecyclePlugin

export type LifecyclePlugin = (context: LifecycleContext) => void;

由于差别平台监听应用程序状况变化的完成差别(Native平台要应用到原生接口,Web运用一些Javascript的API),它们的共同点是要用到LifecycleContext的一个实例,在对应的监听完成代码里去变更这个实例的pause(),resume(),update()这三个要领去停息、继承和革新应用程序,所以定义了LifecyclePlugin这个函数范例。

function addLifecycleListener

        export function addLifecycleListener(plugin: LifecyclePlugin) {
            let context = new LifecycleContext();
            contexts.push(context);
            plugin(context);
        }

addLifecycleListener()要领作为桥梁,接收到详细的LifecyclePlugin范例的函数,建立LifecycleContext的一个实例作为参数调用它。

class LifecycleContext

let isActivate = true;

        export class LifecycleContext {

            pause() {
                if (isActivate) {
                    isActivate = false;
                    stage.dispatchEvent(new Event(Event.DEACTIVATE));
                    if (onPause) {
                        onPause();
                    }
                }
            }

            resume() {
                if (!isActivate) {
                    isActivate = true;
                    stage.dispatchEvent(new Event(Event.ACTIVATE));
                    if (onResume) {
                        onResume();
                    }
                }
            }

            onUpdate?: () => void;
        }

        export let onResume: () => void;

        export let onPause: () => void;

isActivate作为一个布尔值范例的成员属性用来标记当前是不是停息,这个if言语的作用是防备反复触发停息事宜,假如触发,重要做了两件事变,一个是向全局事宜体系触发了一个Event.DEACTIVATE范例的事宜(关于全局事宜体系在后面的章节中详细剖析)。一个是调用了onPause()要领。我们在egret-core/tools/templates/game/src/Main.ts中找到这几行

 private onAddToStage(event: egret.Event) {

        egret.lifecycle.addLifecycleListener((context) => {
            // custom lifecycle plugin

            context.onUpdate = () => {
                console.log('hello,world')
            }
        })

        egret.lifecycle.onPause = () => {
            egret.ticker.pause();
        }

        egret.lifecycle.onResume = () => {
            egret.ticker.resume();
        }


        //设置加载进度界面
        //......

        //初始化Resource资本加载库
        //......
    }

    /**
     * 心跳计时器单例
     */
    export let ticker: sys.SystemTicker = new sys.SystemTicker();

这里耽误定义了onPause()要领,这个要领只要一行,实行了egret.ticker.pause()要领。resume()要领相似pause()要领。

运用例子

Web平台

Native平台

egret-core/src/egret/native/NativeHideHandler.ts:

namespace egret.native {
    /**
     * @private
     */
    export let NativeLifeCycleHandler: egret.lifecycle.LifecyclePlugin = (context) => {
        egret_native.pauseApp = () => {
            context.pause();
            egret_native.Audio.pauseBackgroundMusic();
            egret_native.Audio.pauseAllEffects();
        };

        egret_native.resumeApp = () => {
            context.resume();
            egret_native.Audio.resumeBackgroundMusic();
            egret_native.Audio.resumeAllEffects();
        };
    }
}

这个Native平台监听函数定义了原生平台的两个要领egret_native.pauseApp()和egret_native.resumeApp()。pauseApp()函数做了两件事变:停息应用程序,停息背景音乐和音效的播放。resumeApp()相似。

egret-core/src/egret/native/NativePlayer.ts:

namespace egret.native {
    /**
     * @private
     */
    export class NativePlayer extends egret.HashObject implements egret.sys.Screen {
        //...

        private init(option: PlayerOption): void {
            //...
            lifecycle.addLifecycleListener(NativeLifeCycleHandler);
            //...
        }
        //...
    }
}

这里应用addLifecycleListener()要领绑定了NativeLifeCycleHandler()这个函数。

    原文作者:昵称五个字
    原文地址: https://segmentfault.com/a/1190000013012565
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞