Androidタイミングタスク
12700 ワード
Androidでは、あるセグメントのコードをタイミングよくループしたり、ある時点であるセグメントのコードを実行したりする必要がある場合があります.この需要は、Timerオブジェクトを最初に思い浮かべる必要があります.間違いありませんが、私たちはもっと良い選択があります.
一、Timer実現タイミングタスク
二、Handlerはタイミング任務を実現する 1.一定時間おきに1つの操作を実行し、ループ実行:
2.一定時間おきに1回の操作を行い、実行後、実行しない:
三、AlarmManagerは正確なタイミング操作を実現する
私たちがTimerやhandlerを使うと、delay時間はそんなに正確ではないことがわかります.厳格な時間通りのタイミング操作が必要な場合は、AlarmManagerを使用します.AlarmManagerオブジェクトはIntentと組み合わせて使用し、Activityをタイミングよく開いたり、BroadCastを送信したり、Servicesを開いたりすることができます.
次のコードでは、2つのタイミングの使用方法について詳しく説明します.指定時間後にある動作 を実行する.ある動作 を周期的に実行する.
キャンセルタイマー(目覚まし時計)
一、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はタイミング任務を実現する
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);//
}
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