版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_theSun/article/details/83351540
网上流传着几种常用的定时器实现方式:
第一种:timer+timeTask
/**
*启动
*delay : 从定时器初始化成功 开始启动 的延迟时间。
*period:定时器的间隔时间。
*/
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.d("timer", "start......");
}
}, delay, period);
// 停止
timer.cancle();
timer = null;
java中最早接触的定时器,有一个缺点就是不易控制,有时停止不立即生效
第二种:Handler的postDelayed
Handler mHandler = new Handler();
Runnable task = new Runnable() {
@Override
public void run() {
//每隔1s循环执行run方法
mHandler.postDelayed(this, 1000);
}
};
//启动
mHandler.postDelayed(task, 1000);//延时1秒
//停止
mHandler.removeCallBack(task);
比timer好控制,功能实现简单
第三种:CountDownTimer
//参数1:计时总时间,参数2:每次扣除时间数
CountDownTimer cdTimer = new CountDownTimer(10000, 100){
@Override
public void onTick(long millisUntilFinished){
//定时时间到执行动作;
}
@Override
public void onFinish() {
}
};
cdTimer.start();
底层使用了handler没啥说的,常用于注册短信倒计时
第四种:线程池ScheduledExecutorService
/**
*scheduleAtFixedRate(Runnable command, long initialDelay, long period,TimeUnitunit) *创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 *initialDelay 后开始执行,然后在initialDelay+period 后执行,接着在 initialDelay + *2
* period 后执行,依此类推
*/
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
Runnable syncRunnable = new Runnable() {
@Override
public void run() {
Log.e(TAG, Thread.currentThread().getName());
}
};
executorService.scheduleAtFixedRate(syncRunnable, 3000, 3000,TimeUnit.MILLISECONDS);
此方法底层会抛异常,并且导致停止定时任务
第五种:AlarmManager+BroadcastReceiver
AlarmManager am = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(XXXXX);
PendingIntent sender = PendingIntent.getBroadcast(mcontext,requestCode, intent, 0);
//注:ELAPSED_REALTIME_WAKEUP:当系统进入休眠状态,这种类型的闹钟可以唤醒。
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
firstTime, 30*1000, sender);
//清单文件静态注册接受者
<receiver android:name="com.xxxx.Receiver"/>
1.占用系统资源,cpu占有率。
2.最准时的一个
3,定时的多样性,包括一次定时,循环定时
最终当定时器遇到低电耗模式:
如果用户设备未插接电源、处于静止状态一段时间且屏幕关闭,设备会进入低电耗模式。 在低电耗模式下,系统会尝试通过限制应用对网络和 CPU 密集型服务的访问来节省电量。 这还可以阻止应用访问网络并推迟其作业、同步和标准闹铃。
系统会定期退出低电耗模式一会儿,好让应用完成其已推迟的 Activity。在此维护时段内,系统会运行所有待定同步、作业和闹铃并允许应用访问网络。
图 1. 低电耗模式提供了定期维护时段,可供应用使用网络并处理待定 Activity。
在每个维护时段结束后,系统会再次进入低电耗模式,暂停网络访问并推迟作业、同步和闹铃。 随着时间的推移,系统安排维护时段的次数越来越少,这有助于在设备未连接至充电器的情况下长期处于不活动状态时降低电池消耗。
一旦用户通过移动设备、打开屏幕或连接到充电器唤醒设备,系统就会立即退出低电耗模式,并且所有应用都将返回到正常 Activity。
在低电耗模式下,您的应用会受到以下限制:
- 暂停访问网络。
- 系统将忽略 wake locks。
- 标准
AlarmManager
闹铃(包括setExact()
和setWindow()
)推迟到下一维护时段。 -
- 如果您需要设置在低电耗模式下触发的闹铃,请使用
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。 - 一般情况下,使用
setAlarmClock()
设置的闹铃将继续触发 — 但系统会在这些闹铃触发之前不久退出低电耗模式。
- 如果您需要设置在低电耗模式下触发的闹铃,请使用
- 系统不执行 Wi-Fi 扫描。
- 系统不允许运行同步适配器。
- 系统不允许运行
JobScheduler
。