2015-06-18

Notification 上の Button が多重反応してしまう時の対処法

備忘録。

Notification に RemoteViews で乗っけた Button をタップしたところ、2回タップしたような状況が発生。
より具体的には、音楽プレイヤを通知領域からコントロールしたかったので、ボタンを並べて、機能するようにしたんだけど、1曲飛ばしたつもりが2曲飛んでしまったりして、思った通りに動いてくれないような状況。


原因は、BroadcastReceiver でタップ通知しているためのよう。
# もし、他の方法があれば是非とも教えて欲しいところですが。



方針としては、「1回目の通知が来たら、フラグを立ててから処理し、1回目の直後に発生した2回目以降の通知では何も処理させずに終わらせ、一定時間経ったらフラグを戻す」というような感じ。
参照させていただいた方法と、処理の位置が違うのと、Timer の状態で判定しているところが boolean での判定になっているくらいでほとんど変わらないという話も。

private static boolean cancelerState = false;
private static Handler cancelerHandler = new Handler();

public class NotificationReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    if (cancelerState) {  // 処理が行われたばかりであれば、キャンセルする
      return;
    }
    cancelerState = true;  // キャンセラー有効化

    // 処理の記述
    String action = Intent.getAction();
    if (action.equals("ACTION_1")) {
      // action 1
      ...
    } else if (action.equals("ACTION_2")) {
      // action 2
      ...
    } else if (...
      ...
      ...
    }

    // タイマーを走らせる
    Timer cancelerTimer = new Timer();
    cancelerTimer.schedule(new TimerTask() {
      @Override
      public void run() {
        cancelerHandler.post(new Runnable() {
          public void run() {
            cancelerState = false;  // 戻す
          }
        });
      }
    }, 500);  // 500 ms 待って実行 (適当)

  }

  /**
   * コンストラクタ
   */ 
  public NotificationReceiver() {
  }
}
# ページに貼るためにちょこちょこ弄っているので、このままじゃ動かないかもです。あしからず。

とりあえず、こんな感じの処理にして解決。

# 参考

0 件のコメント :

コメントを投稿