想定している流れは、コンセントからスマホが抜かれた時にGPSの機能を持ったServiceをonにして、コンセントに接続された時には、接続されてから24時間後にGPSのserviceをoffにしたいと考えています。
そこで、なんどもコンセントから抜き差しを行った場合に、24時間のタイマーを複数起動することになってしまい、最後に発行したRunnableだけ実行したいなと思っています。
そこで、24時間が立たない限りは、一つRunnableを追加するごとに、前回のHandlerを取得して、handler.removeCallbacks(showMessageTask);
で、実行を行わないようにしたいと考えています。
しかし、24時間後には、コンセントを抜き差ししたぶんだけのRunnableが呼び出されてしまいました。
すでに発行してしまったRunnableを取り消す方法を教えていただけないでしょうか?
下のコードの流れを説明しています。
java
1handler.postDelayed(showMessageTask, 30000); 2//このコードで指定している時間の30秒以内に、電源の抜き差し(掲示したコードを呼び出すトリガー)を、2回行った時点で、 3 4}else if(aaa>=2){ 5//の中に入って、このコードが呼び出されます。 6handler.postDelayed(showMessageTask, 30000); 7 8//30000ms後に 9public void run() { 10//が呼び出されるまでは、トリガーを引いたぶんだけ その都度その都度 11handler.removeCallbacks(showMessageTask); 12//このコードによって、過去に呼び出そうとした 13run() 14//が取り消されると考えていたのですが、2回以上トリガーを引いたぶんだけ、run()が呼び出されてしまいます。 15 16//最後に呼び出されたrunだけを指定した時間の30秒後に行うことはできるのでしょうか?
java
1 int aaa=powerStatuss.getRemoveHandlerCount(); 2 if (aaa==0) { 3 aaa++; 4 powerStatuss.setRemoveHandlerCount(aaa); 5 Toast.makeText(context, "aaa 古いHandlerはまだないから消さない"+powerStatus.getRemoveHandlerCount()+"になった", Toast.LENGTH_SHORT).show(); 6 7 }else if (aaa==1) { 8 aaa++; 9 powerStatuss.setRemoveHandlerCount(aaa); 10 //oldRemoveがtrueということは、handlerが複数動くことになるから古い方を消す。24時間経って実行されたら、falseをセットする 11 Toast.makeText(context, "aaa 古いHandlerはまだないから消さない"+powerStatuss.getRemoveHandlerCount()+"になった", Toast.LENGTH_SHORT).show(); 12 13 }else if(aaa>=2){ 14 //ここは古いhandlerを消す場所 15 aaa++; 16 powerStatuss.setRemoveHandlerCount(aaa); 17 Toast.makeText(context, "aaaa 古いHandlerを消して、最新のHandlerのみを残す"+powerStatuss.getRemoveHandlerCount()+"になった", Toast.LENGTH_SHORT).show(); 18 19 handler=powerStatus.getHandler(); 20//ここで、前回のhandlerを終了させたいです。 21 handler.removeCallbacks(showMessageTask); 22 } 23 24 25 26 handler = new Handler(); 27 powerStatus.setHandler(handler); 28 29 //この下で30秒後に、GPSのServiceを切断する 30 handler.postDelayed(showMessageTask, 30000); 31 32 showMessageTask= new Runnable() { 33 @Override 34 public void run() { 35 36 powerStatus.setRemoveHandlerCount(0); 37 Intent i_gps = new Intent(receiveContext, GpsService.class); 38 receiveContext.stopService(i_gps); 39 40 } 41 }; 42
回答2件
あなたの回答
tips
プレビュー