Androidタイミングタスク

12700 ワード

Androidでは、あるセグメントのコードをタイミングよくループしたり、ある時点であるセグメントのコードを実行したりする必要がある場合があります.この需要は、Timerオブジェクトを最初に思い浮かべる必要があります.間違いありませんが、私たちはもっと良い選択があります.
一、Timer実現タイミングタスク
Timer timer;

void onCreate(){

  ......

TimerTask task = new TimerTask(){    

public void run(){    

 //               

}    

};    

timer = new Timer();  

timer.schedule(task, 1000);//     ,delay 1s   task  

}

void onDestroy(){

......

timer.cancel();//     

}

二、Handlerはタイミング任務を実現する
  • 1.一定時間おきに1つの操作を実行し、ループ実行:
  • void onCreate(){    
    
         ......
    
         Handler handler = new Handler();  
    
         Runnable runnable = new Runnable(){  
    
             @Override  
    
             public void run() {  
    
                 // TODO Auto-generated method stub  
    
                 //             
    
         
    
                 handler.postDelayed(this, 50);// 50ms   this, runable  
    
             }   
    
         };   
    
         handler.postDelayed(runnable, 50);//      ,50ms   runnable    
    
    }
    
    void onDestroy(){ 
    
        ......
    
        handler.removeCallbacks(this);//          
    
    }
    
    
    
     

     
  • 2.一定時間おきに1回の操作を行い、実行後、実行しない:
  • void onCreate(){ 
    
    ......
    
    Handler handler = new Handler();              
    
            Runnable runnable = new Runnable(){    
    
            @Override  
    
            public void run() {  
    
                            // TODO Auto-generated method stub               
    
                            //             
    
                  doSomeThing();
    
                            handler.removeCallbacks(this); //                                      
    
                   }                    
    
            };  
    
            handler.postDelayed(runnable, 50);//      ,50ms   runnable  
    
    }
    
    
    
     

     
    三、AlarmManagerは正確なタイミング操作を実現する
    私たちがTimerやhandlerを使うと、delay時間はそんなに正確ではないことがわかります.厳格な時間通りのタイミング操作が必要な場合は、AlarmManagerを使用します.AlarmManagerオブジェクトはIntentと組み合わせて使用し、Activityをタイミングよく開いたり、BroadCastを送信したり、Servicesを開いたりすることができます.
    次のコードでは、2つのタイミングの使用方法について詳しく説明します.
  • 指定時間後にある動作
  • を実行する.
     1 //       <<      >>      .
    
     2 
    
     3 public static AlarmManagerUtil{
    
     4         public static AlarmManager getAlarmManager(Context ctx){
    
     5         return (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
    
     6     }
    
     7  
    
     8     /**
    
     9      *              (       )
    
    10      *   : Receiver   manifest.xml   
    
    11          * 
    
    12      * @param ctx
    
    13      */
    
    14     public static void sendUpdateBroadcast(Context ctx){
    
    15         Log.i("score", "send to start update broadcase,delay time :"+60000);
    
    16  
    
    17         larmManager am = getAlarmManager(ctx);
    
    18             // 60       ,  UpdateReceiver   ,                    
    
    19         Intent i = new Intent(ctx, UpdateReceiver.class); 
    
    20         PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, i, 0);
    
    21         am.set(AlarmManager.RTC, System.currentTimeMillis()+60000, pendingIntent)
    
    22 }
    
    23  
    
    24      /**
    
    25      *       (       )
    
    26      * 
    
    27      * @param ctx
    
    28      */       
    
    29     public static void cancelUpdateBroadcast(Context ctx){
    
    30         AlarmManager am = getAlarmManager(ctx);
    
    31         Intent i = new Intent(ctx, UpdateReceiver.class);
    
    32         PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, i, 0);
    
    33         am.cancel(pendingIntent);
    
    34     }
    
    35 }
    
    36  
    
    37 //            
    
    38 public static class UpdateReceiver extends BroadcastReceiver{
    
    39         public void onReceive(Context context, Intent intent) {
    
    40              Toast.makeText(context, "      ", Toast.LENGTH_LONG).show();
    
    41  
    
    42              //        (  ) 60                  .
    
    43              //       JavaScript   setTimeout(xxx,60000)
    
    44              AlarmManagerUtil.sendUpdateBroadcast(context);
    
    45         }
    
    46     }
  • ある動作
  • を周期的に実行する.
    publicstaticvoid sendUpdateBroadcastRepeat(Context ctx){
    
        Intent intent =new Intent(ctx, UpdateReceiver.class);
    
        PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, intent, 0);
    
     
    
        //    
    
        long firstime=SystemClock.elapsedRealtime();
    
     
    
        AlarmManager am = (AlarmManager) ctx.getSystemService(ALARM_SERVICE);
    
      //60     ,       
    
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime, 60*1000, pendingIntent);
    
    }

     
    キャンセルタイマー(目覚まし時計)
    /**
    
         *       (       )
    
         * 
    
         * @param ctx
    
         */publicstaticvoid cancelUpdateBroadcast(Context ctx){
    
            AlarmManager am = getAlarmManager(ctx);
    
                //      UpdateReceiver.class        ,        
    
            Intent i = new Intent(ctx, UpdateReceiver.class);  
    
            PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, i, 0);
    
            am.cancel(pendingIntent);
    
        }
    
    }

     
      http://blog.csdn.net/dxpqxb/article/details/8659292