Android中的定时器Timer、AlarmManager、CountDownTimer的使用

1、Timer和TimerTask的使用

java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。

(1)创建一个Timer

java.util.Timer timer = new java.util.Timer(true);   
// true 说明这个timer以daemon方式运行(优先级低,   
// 程序结束timer也自动结束),注意,javax.swing   
// 包中也有一个Timer类,如果import中用到swing包,   
// 要注意名字的冲突。 

(2)创建一个TimerTask

TimerTask task = new TimerTask() {   
public void run() {   
... //每次需要执行的代码放到这里面。   
}   
}; 

(3)Timer调度执行TimerTask

//以下是几种调度task的方法:   

timer.schedule(task, time);   
// time为Date类型:在指定时间执行一次。   

timer.schedule(task, firstTime, period);   
// firstTime为Date类型,period为long   
// 从firstTime时刻开始,每隔period毫秒执行一次。   

timer.schedule(task, delay)   
// delay 为long类型:从现在起过delay毫秒执行一次   

timer.schedule(task, delay, period)   
// delay为long,period为long:从现在起过delay毫秒以后,每隔period   
// 毫秒执行一次。

2、AlarmManager(全局定时器/闹钟)

AlarmManager的作用是:在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent。

AlarmManager提供的方法:

void set(int type, long triggerAtTime, PendingIntent operation) 
设置一个闹钟 

void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) 
设置一个会重复的闹钟

void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) 
设置一个重复闹钟的不精确版本,它相对而言更节能(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。

(1)type类型
ELAPSED_REALTIME
在指定的延时过后,发送广播,但不唤醒设备。

ELAPSED_REALTIME_WAKEUP
在指定的演示后,发送广播,并唤醒设备

RTC
在指定的时刻,发送广播,但不唤醒设备

RTC_WAKEUP
在指定的时刻,发送广播,并唤醒设备

(2)内置的几个interval为:
INTERVAL_FIFTEEN_MINUTES
INTERVAL_HALF_HOUR
INTERVAL_HOUR
INTERVAL_HALF_DAY
INTERVAL_DAY
如果你将其设为DAY,那么可能这一天中的所有闹钟都会被合并掉。

void cancel(PendingIntent operation) 
取消一个设置的闹钟 

void setTimeZone(String timeZone) 
设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限 

在指定时长后执行某项操作

//操作:发送一个广播,广播接收后Toast提示定时操作完成
 Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("short");
PendingIntent sender=
    PendingIntent.getBroadcast(Main.this, 0, intent, 0);

//设定一个五秒后的时间
Calendar calendar=Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 5);

AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
//或者以下面方式简化
//alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5*1000, sender);

Toast.makeText(Main.this, "五秒后alarm开启", Toast.LENGTH_LONG).show();

周期性的执行某项操作

Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("repeating");
PendingIntent sender=PendingIntent
    .getBroadcast(Main.this, 0, intent, 0);

//开始时间
long firstime=SystemClock.elapsedRealtime();

AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
  //5秒一个周期,不停的发送广播
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP
        , firstime, 5*1000, sender);

3、CountDownTimer(倒计时计数器)

定时执行在一段时间后停止的倒计时,在倒计时执行过程中会在固定间隔时间得到通知。

构造函数

public CountDownTimer (long millisInFuture, long countDownInterval)

参数

millisInFuture 从开始调用start()到倒计时完成并onFinish()方法被调用的毫秒数。(倒计时时间,单位毫秒)
countDownInterval 接收onTick(long)回调的间隔时间。(单位毫秒)

公共方法
public final void cancel ()
取消倒计时(取消后,再次启动会重新开始倒计时)

public abstract void onFinish ()
倒计时完成时被调用

public abstract void onTick (long millisUntilFinished)
固定间隔被调用
参数 millisUntilFinished 倒计时剩余时间。

public synchronized final CountDownTimer start ()
启动倒计时

new CountdownTimer(30000, 1000) {  
     public void onTick(long millisUntilFinished) {  
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);  
     }  
     public void onFinish() {  
         mTextField.setText("done!");  
     }  
 }.start(); 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值