android开发中,常用定时器实现方式有以下几种:

1、Handler与sleep

2、Handler与postDelayed

3、Handler与timer

注:Handler的主要作用就是用来处理接收到的信息;用Handler消息传递机制是为了多个线程并发更新UI的同时,保证线程安全;

一、Handler 与 sleep

public class HandlerAndSleep {// 1、定义一个Handler类,用于处理接受到的Message.Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);// do something eg.Log.d("HandlerAndSleep", "HandlerAndSleep");}};// 2、新建一个实现Runnable接口的线程类class MyThread implements Runnable {@Overridepublic void run() {while (true) {try {Thread.sleep(10000);Message message = new Message();message.what = 1;handler.sendMessage(message);} catch (Exception e) {e.printStackTrace();}}}}public HandlerAndSleep() {//3、在需要启动线程的地方加入下面语句,启动线程后,线程每10s发送一次消息new Thread(new MyThread()).start();}
}

结果打印如下:

2022-05-30 11:30:42.320 17864-17864/com.yh.study D/HandlerAndSleep: HandlerAndSleep
2022-05-30 11:30:52.324 17864-17864/com.yh.study D/HandlerAndSleep: HandlerAndSleep
2022-05-30 11:31:02.326 17864-17864/com.yh.study D/HandlerAndSleep: HandlerAndSleep
2022-05-30 11:31:12.335 17864-17864/com.yh.study D/HandlerAndSleep: HandlerAndSleep
2022-05-30 11:31:22.338 17864-17864/com.yh.study D/HandlerAndSleep: HandlerAndSleep
2022-05-30 11:31:32.339 17864-17864/com.yh.study D/HandlerAndSleep: HandlerAndSleep
2022-05-30 11:31:42.347 17864-17864/com.yh.study D/HandlerAndSleep: HandlerAndSleep

二、Handler 与 postDelayed

public class HandleAndPostDelayed {Handler handler = new Handler(){@Overridepublic boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {Log.d("HandleAndPostDelayed", "HandleAndPostDelayed");return super.sendMessageAtTime(msg, uptimeMillis);}};Runnable runnable = new Runnable() {@Overridepublic void run() {// do somethinghandler.postDelayed(this, 2000);}};HandleAndPostDelayed() {// 开启定时器handler.postDelayed(runnable, 2000);// 停止定时器
//        handler.removeCallbacks(runnable);}
}

结果打印如下:

2022-05-30 14:32:41.533 24351-24351/com.yh.study D/HandleAndPostDelayed: HandleAndPostDelayed
2022-05-30 14:32:43.534 24351-24351/com.yh.study D/HandleAndPostDelayed: HandleAndPostDelayed
2022-05-30 14:32:45.537 24351-24351/com.yh.study D/HandleAndPostDelayed: HandleAndPostDelayed
2022-05-30 14:32:47.539 24351-24351/com.yh.study D/HandleAndPostDelayed: HandleAndPostDelayed
2022-05-30 14:32:49.546 24351-24351/com.yh.study D/HandleAndPostDelayed: HandleAndPostDelayed
2022-05-30 14:32:51.550 24351-24351/com.yh.study D/HandleAndPostDelayed: HandleAndPostDelayed

三、Handler 与 timer

public class HandlerAndTimer {private final Timer timer = new Timer();private TimerTask task;Handler handler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {// do somethingLog.d("HandlerAndTimer", "HandlerAndTimer");super.handleMessage(msg);}};public HandlerAndTimer() {task = new TimerTask() {@Overridepublic void run() {Message message = new Message();message.what = 1;handler.sendMessage(message);}};//启动定时器 参数对应为 TimerTask 延迟时间 间隔时间timer.schedule(task, 2000, 2000);}
}

结果打印如下:

2022-05-30 14:43:40.922 25052-25052/com.yh.study D/HandlerAndTimer: HandlerAndTimer
2022-05-30 14:43:42.924 25052-25052/com.yh.study D/HandlerAndTimer: HandlerAndTimer
2022-05-30 14:43:44.925 25052-25052/com.yh.study D/HandlerAndTimer: HandlerAndTimer
2022-05-30 14:43:46.926 25052-25052/com.yh.study D/HandlerAndTimer: HandlerAndTimer
2022-05-30 14:43:48.927 25052-25052/com.yh.study D/HandlerAndTimer: HandlerAndTimer

在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService。

public class MainActivity extends AppCompatActivity {Handler handler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {tCount++;timerTV.setText(tCount+"");super.handleMessage(msg);}};Timer timer = new Timer();int tCount = 0;int sCount = 0;TextView timerTV;TextView serviceTV;String ALARM_RECEIVER_ACTION = "com.yh.study.AlarmReceiver";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);timerTV = findViewById(R.id.timer_tv);serviceTV = findViewById(R.id.service_tv);timer.schedule(new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(0);}}, 2*1000, 5*1000);AlarmReceiver alarmReceiver = new AlarmReceiver(new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {sCount++;serviceTV.setText(sCount+"");super.handleMessage(msg);}});IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(ALARM_RECEIVER_ACTION);registerReceiver(alarmReceiver, intentFilter);Intent intent = new Intent(ALARM_RECEIVER_ACTION);PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
//AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),pendingIntent);}
}
public class AlarmReceiver extends BroadcastReceiver {Handler handler;AlarmReceiver(Handler handler) {this.handler = handler;}@Overridepublic void onReceive(Context context, Intent intent) {Log.d("onReceive", "onReceive");handler.sendEmptyMessage(0);Intent serviceIntent = new Intent(context, MyService.class);context.startService(serviceIntent);}
}
public class MyService extends IntentService {public MyService() {super("MyService");}@Overrideprotected void onHandleIntent(@Nullable Intent intent) {AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);Intent alarmIntent = new Intent("com.yh.study.AlarmReceiver");PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5*1000,pendingIntent);}
}

以下结论来源其他博主(小子在验证过程中,连接usb情况正常,拔掉usb后与结论不符,可能是小子哪里写的有问题)

在Timer中,当连接USB线进行调试时,会发现一切工作正常,每5秒更新一次界面,即使是按下电源键,仍然会5秒触发一次。 当拔掉USB线,按下电源键关闭屏幕后,过一段时间再打开,发现定时器明显没有继续计数,停留在了关闭电源键时的数字。
在AlarmService中,拔掉USB线,按下电源键,过一点时间再次打开屏幕,发现定时器一直在计数。

测试机型小米8,上timer,下AlarmService

Android之定时器相关推荐

  1. Android倒计时定时器CountDownTimer的用法

    前一篇讲了关于Timer定时器的用法,详细请看 Android关于定时器Timer的定义及用法 这一篇简单介绍一下关于倒计时定时器的用法,这涉及到一个CountDownTimer类,写了一个简单的案例 ...

  2. android 实现毫秒定时器,Android实现定时器的五种方法实例详解

    一.Timer Timer是Android直接启动定时器的类,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用. 跟handler自身实现的定时器相比, ...

  3. android 简易定时器

    定时器 1.在android 应用开发当中,很多时候都要用到定时器,而要实现定时器更多的时候要用到两个类:Timer,和TimerTask 2.API对Timer的解释是: 简单的翻译一下:Timer ...

  4. android+定时器+动画,Android 实现定时器的四种方式总结及实现实例_Android_脚本之家...

    Android中实现定时器的四种方式 第一种方式利用Timer和TimerTask 1.继承关系 java.util.Timer 基本方法 schedule 例如: timer.schedule(ta ...

  5. 【转】Android中定时器的3种实现方法

    原文网址:http://www.android-study.com/pingtaikaifa/508.html 在Android开发中,定时器一般有以下3种实现方法: 一.采用Handler与线程的s ...

  6. Android之定时器实现的几种方式和removeCallbacks失效问题详解

    转载:http://blog.csdn.net/xiaanming/article/details/9011193 实现定时器有很多种方式,在这里我简单的介绍几种方式 实现定时器有很多种方式,在这里我 ...

  7. android 全局定时器,高通Android LED驱动移植-GPIO,内核定时器

    有些设备需要有灯的闪烁来表达一些含义,比如电池电量.利用GPIO实现灯的灭.亮.慢闪.快闪需要配合内核定时器来实现. 首先我们找到高通内核自带的LED相关的文件, /kernel/driver​s/l ...

  8. Android中定时器的3种实现方法

    原文:http://blog.csdn.net/wulianghuan/article/details/8507221 在Android开发中,定时器一般有以下3种实现方法: 一.采用Handler与 ...

  9. Android中定时器实现的方式对比

    在android中经常需要定时循环执行某一段代码,大家首先想到的是Timer,在一般的场合下,Timer和TimerTask可以完全胜任,但是在有些情况下,Timer就不能很好的完成定时循环任务,如与 ...

  10. android hal 定时器,汽车监控定时器  |  Android 开源项目  |  Android Open Source Project...

    使用汽车监控定时器帮助调试 VHAL.汽车监控定时器可监控进程的运行状况并终止运行状况不佳的进程.如需通过汽车监控定时器监控某个进程,必须向汽车监控定时器注册该进程.当汽车监控定时器终止运行状况不佳的 ...

最新文章

  1. 在程序中支持多语言环境,支持asp.net和winform。
  2. 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google
  3. mnist 数据集的识别源码解析
  4. Scala分支控制 if-else之单分支的使用
  5. 【Java数据结构】自己实现一个HahMap(实现其put, toString, get方法)
  6. .NET的Snk使用方法
  7. 成员变量 局部变量 类变量
  8. 网络爬虫-获取网页中的数据加伪装头,伪装成浏览器多次访问,避免单次访问导致ip被封
  9. Zookeeper 在Linux系统的安装
  10. pyqt5 给按钮设置css样式和界面背景设置
  11. UVA722 LA5359 Lakes【DFS】
  12. 如何有逻辑的,简单清晰的回应问题
  13. 基于Velocity的Web开发指南
  14. 手工安装hr表+oracle,[20200825]手工安装HR schema.txt
  15. 2017全国计算机二级office题库,2017全国计算机二级office选择题题库
  16. matlab实现螺旋谱分解,MATLAB实现EMD分解及希尔伯特谱分析
  17. 个人邮箱地址格式,如何能够正确的书写?
  18. uni-app对接支付
  19. 超实用硬盘数据恢复工具介绍!永久免费
  20. # 公有云?私有云?混合云?多云?行业云?傻傻分不清楚(上篇)

热门文章

  1. Android资源总结(开发工具/环境搭建/教程/论坛/博客/反编译工具)
  2. 原谅我————这是,我很喜欢的一个故事
  3. VC++ FTP文件下传(断点续传)
  4. witchit找不到服务器,《witchit》需要什么配置 最低配置要求一览
  5. 换工作,需要注意社保系统退工的事宜
  6. WebP 探寻之路,推荐一个GitHub项目
  7. Shell编程四剑客之AWK(基础篇)
  8. linux 后台运行 nohup
  9. GoFrame敏捷后台开发框架
  10. 如何判断自己的PC能否安装64位操作系统