2012年2月10日金曜日

backを2回押してアプリ終了

マクドナルドアプリ等、backを1度押すとToastが表示され、Toast表示中にもう一度backを押すとアプリが終了するものを作成してみました。

-------------------------------------------

Toast finToast;
// backkeyで使うスレッド用////////////////////
Timer bTimer = null;
// 動いてるか動いてないかのチェック用
boolean bChk = false;
//バックを実行するかどうか
int bStar = 0;
//秒数かうんと
int bcount = 0;

        @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    finToast =Toast.makeText(this, "[戻る]をもう一度押すと終了", Toast.LENGTH_SHORT);
               // ここ自由

}

        @Override
protected void onResume() {
super.onResume();
bStar = 0;
}

protected void onPause() {
super.onPause();
backCountStop();
}

///////////////////Back///////////////////////////////////

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// なんのkeydownかを判断 今回はバックキー
if (keyCode == KeyEvent.KEYCODE_BACK) {
if(bStar == 0){
finToast.show();
bStar = 1;
backCountStart();
}else {
backCountStop();
finToast.cancel();
finish();
}

}
return false;
}

// //////////////////////タイマー/////////////
public void backCountStart() {
// 動いてたらそのまま
if (bChk) {
// 止まってたら起動
} else {

bTimer = new Timer(true);
bTimer.schedule(new TimerTask() {
@Override
public void run() {
if(bcount == 2){
bStar =0;
bcount = 0;
backCountStop();
}
bcount++;
}
}, 1000, 1000); // 初回起動の遅延と周期指定。単位はms
bChk = true;
}
}

public void backCountStop() {
// 動いてたら入る、止まってたらスルー
if (bChk) {
if (bTimer != null) {
bTimer.cancel();
bTimer = null;
}
bChk = false;
}
}

-------------------------------------------------
とりあえずこんな感じです。

後々デバッグで修正する可能性有りです

上記より良い方法があったら教えてください!

2 件のコメント:

  1. private volatile boolean mConfirmExit;

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN) {
    if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
    if(!mConfirmExit) {
    Toast.makeText(MainActivity.this, R.string.confirm_exit, Toast.LENGTH_SHORT).show();
    new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
    mConfirmExit = false;
    }
    }, getResources().getInteger(R.integer.confirm_exit_delay));
    mConfirmExit = true;
    } else {
    finish();
    }
    return true;
    }
    }

    return super.dispatchKeyEvent(event);
    }

    こんな感じでどうでしょ?

    返信削除
  2. コメントありがとうございます。
    自分のよりかなり短くなっていますね。
    後日詳しく拝見させていただきます。

    ご返事おくれてすいません。

    返信削除