我做了一个Flash Air游戏。玩游戏时,如果我按下 Android 设备上的 Home 按钮,我会进入手机菜单,但我仍然可以听游戏的音乐,这意味着游戏仍然可以正常运行。
我希望我的应用程序不在前台时暂停。我想过这个:
...
stage.addEventListener(flash.events.Event.DEACTIVATE, deactivated);
...
private function deactivated(e:flash.events.Event):void {
delayedCall = new DelayedCall(quitNow, 2 * 60);
stage.addEventListener(flash.events.Event.ACTIVATE, reactivated);
}
private function quitNow():void {
NativeApplication.nativeApplication.exit();
}
private function reactivated(e:flash.events.Event):void {
stage.removeEventListener(flash.events.Event.ACTIVATE, reactivated);
if (delayedCall) {
delayedCall.dismiss();
delayedCall = null;
}
}
...
其中 DelayedCall 是一个自定义的“调用此函数之前等待”类:
package fanlib.utils {
import flash.utils.Timer;
import flash.events.TimerEvent;
public class DelayedCall {
private var data:*;
private var callback:Function;
private var timer:Timer;
public function DelayedCall(callb:Function, seconds:Number, dat:* = undefined, count:int = 1) {
callback = callb;
data = dat;
timer = new Timer(seconds * 1000, count);
timer.addEventListener(TimerEvent.TIMER, timeEvent);
timer.start();
}
public function dismiss():void {
timer.stop();
complete();
}
private function timeEvent(e:TimerEvent):void {
if (data) callback(data); else callback();
if (timer.currentCount == timer.repeatCount) complete();
}
private function complete():void {
timer = null;
data = undefined;
}
}
}
上述方法适用于 Air Desktop 版本。当窗口失焦时,应用程序会在 2*60 秒后退出。
在 Android 上,这种行为非常奇特:
- 延迟呼叫永远不会调用 quitNow()
- 如果我删除“stage.addEventListener(flash.events.Event.ACTIVATE, reactivated);”,那么如果我在 2*60 秒后返回它,应用程序将关闭,但如果我没有得到它不会关闭回到它!
这似乎是当应用程序不在前台时,Actionscript 代码确实会暂停,但音乐仍然在播放。
任何想法或更好的替代方法,直接证明的方法?我不打算深入研究 Air 和 Android 的内部工作原理......