HSP tips

とりあえずここも暫定ページです。

[HSP3Dish] [Android] 戻るキーを判定する方法


※HSP 3.5β2 の時点での情報を元にしています。後のバージョンでは状況が違ってくる可能性があります。


HSP3Dish で開発していて、戻るキーを検出したいと思ったことはありませんか? onexit が使えればいいのですが、Android版では無視されます。 つまり、戻るキーでアプリを終了されると強制終了同然の状態です。


そこで、ちょっと改造します。
まず HspActivity.java または HspActivityAdMob.java に以下を追加します。
import android.view.KeyEvent;
更に、いちばん下のほうに以下を追加します。(末尾の } の1つ手前)
	// 戻るキーを判定
	@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		if (event.getAction() == KeyEvent.ACTION_DOWN) {
			switch (event.getKeyCode()) {
			case KeyEvent.KEYCODE_BACK:		// バックキー
				nativepoke( 0, -0x100 );	// stat に終了コードを送る
				return true;
			}
		}
		return super.dispatchKeyEvent(event);
	}
アクションの判定を省略し、以下のように書いても良さそうです。(2015.11.23 追記)
	// 戻るキーを判定(アクション省略)
	@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		switch (event.getKeyCode()) {
		case KeyEvent.KEYCODE_BACK:		// バックキー
			nativepoke( 0, -0x100 );	// stat に終了コードを送る
			return true;
		}
		return super.dispatchKeyEvent(event);
	}
これで、戻るキーを押すと await 直後の stat に -0x100 が返るようになります。
HSPのコードは以下のようにします。
// 戻るキーのテスト
// by 窓月らら

#include "hsp3dish.as"

	setcls 1,$000000	// redraw 0 でクリアする, 黒

*main
	redraw 0
	color 0,255,255
	pos 8,8: mes "バックキーのテストです。"
	redraw 1
	c++
	await 17-(c\3=0)
	if stat=-0x100 { gosub *exit }	// 判定
	goto *main

*exit
	dialog "アプリを終了しますか?",2
	if stat!6 { return }	// Yes以外なら戻る
	end			// アプリ終了
end の前にデータ保存などの終了処理を書きます。 暫定的ですが、これで戻るキーで終了されても困らないアプリが作れますね♪


HSP3Dish をはじめてからずっと問題だと思っていたのですが、公式に対応されないので…。 キー検出方法は分かっていたものの、どうHSP側から取得するかがよく分からず、別の不具合を直す過程で nativepoke が使えることに気づいて利用してみました。


(2015.11.26 追記)
TM75A の場合は特に AdMob を表示したり処理落ち気味の場合に戻るキーの反応が良くないことがあります。 これはこの端末特有の問題なのですが、もしかしたら他の端末でも同様のことが起こるかもしれません。 これらの端末への対策として、以下のように書き加えます。
	await 17-(c\3=0)	// 60fps
	p=0			// アプリ終了を判定するフラグ
	if stat=-0x100 { p=1 }	// 終了コードを判定
	// 遅延がある端末(TM75A等)への対策、ここでも終了コードを判定
	repeat 50: wait 0: if stat=-0x100 { p=1: break }: loop
	if p=1 { gosub *exit }	// アプリ終了
上記のようにすることで、TM75A でも問題ないレスポンスが得られます。
Android はこのように微妙に挙動が違う機種が多いため、できるだけ複数台の端末でテストする必要があります。



なお、HSP 3.5β2 ではダイアログにバグがあります(下記参照)。
[HSP3Dish] dialog命令の動作(たぶん不具合)について
http://hsp.tv/play/pforum.php?mode=all&num=72850



戻る

© 1998-2015 Miecat. All rights reserved.