FlashAirゲームを作りました。再生中にAndroidデバイスのホームボタンを押すと、携帯電話のメニューが表示されますが、ゲームの音楽を聴くことができます。つまり、ゲームは引き続き完全に機能します。
フォアグラウンドにないときにアプリを一時停止したいのですが。私はこれについて考えました:
..。
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はカスタムの「wait-before-calling-this-function」クラスです。
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;
}
}
}
上記の方法は、AirDesktopバージョンで問題なく機能します。ウィンドウの焦点が合わなくなると、アプリは2*60秒後に終了します。
Androidでは、動作は非常に独特です。
- quitNow()がdelayedCallによって呼び出されることはありません
- 「stage.addEventListener(flash.events.Event.ACTIVATE、reactivate);」を削除すると、2 * 60秒後にアプリに戻るとアプリは閉じますが、取得しないとアプリは閉じません。それに戻る!!!
これは、アプリがフォアグラウンドにない場合にActionscriptコードが一時停止するように見えますが、音楽はとにかく再生されます。
何かアイデア以上の、代替の、簡単な証明された方法はありますか?AirとAndroidの内部動作を掘り下げるつもりはありません...