目录

  • 问题背景
  • handler失效的原因
  • 排查了解到Doze机制
  • 锁屏后计时解决方案

问题背景

需要记录用户播放音频的时长,我在一个service中开启handler,每隔一秒用户正在播放,将播放时长++;正常播放都没问题,即使锁屏大部分手机记录都准确,但在华为手机9.0系统中发现锁屏记录时间不准确,接下来就有了一大堆的排查。

handler失效的原因

采用每次都将系统时间和变量进行写入到手机内存中,通过查看时间和变量看问题出在哪里:记录的结果如下,数据正常就是每隔一秒变量正好加1

在记录不准确的手机中获取的数据如下图:变量是每次都加1,但是时间确实有时候出现跳动,两组数据之前有时候相差好几秒,问题就出在这里了,所以导致记录不准确。

根据排查发现handler本来设置的是每隔一秒执行一次,但有时会出现好几秒后才执行一次,在看到handler源码时发现它是通过SystemClock.uptimeMillis()+delayMillis从消息队列获取消息的,
delayMillis:就是间隔时间 如1秒
SystemClock.uptimeMillis():表示从开机到现在的毫秒数(手机睡眠的时间不包括在内)
如果手机短暂休眠,导致SystemClock.uptimeMillis()值没变,那么uptimeMillis值没变可能导致handler定时失效。


下面是往手机文件写内容的代码,不覆盖内容,续写内容。

public void saveStudyToFile(String string) {String filePath = LOCAL_PATH + "clockFile";File file = new File(filePath);try {// 首先判断文件夹是否存在if (!file.exists()) {if (!file.mkdirs()) {   // 文件夹不存在则创建文件Toast.makeText(MyApplication.getInstance(), "文件夹创建失败", Toast.LENGTH_SHORT).show();}} else {File fileWrite = new File(filePath + File.separator + "studyLog.txt");// 实例化对象:文件输出流=====要想覆盖之前的内容,去掉ture即可FileOutputStream fileOutputStream = new FileOutputStream(fileWrite, true);// 写入文件fileOutputStream.write(string.getBytes());// 清空输出流缓存fileOutputStream.flush();// 关闭输出流fileOutputStream.close();}} catch (Exception e) {e.printStackTrace();}}

排查了解到Doze机制

在排查是了解到Android 6.0系统引入Doze机制保护电池,延长电池寿命。
Doze模式可以简单理解为低能耗状态,一些无关运行能停止都停止了。

Doze机制特征是:
1、在息屏30分钟内、手机没有移动并且没有正在充电状态,会进入Doze模式;
2、进入Doze模式后手机会停止网络请求操作,WakeLocks会被忽略失效,AlarmManager会被推迟,系统不再进行WiFi扫描等等;
3、进入Doze模式后,手机会每隔一段时间进入30s的活动区,这段时间手机检测是否有需要处理的操作;
4、进入Doze模式后,Doze模式没有被唤醒,它会逐渐进入深度深眠;

这里借用网上的一张图更好的理解Doze模式:

锁屏后计时解决方案

虽然了解了那么多,但是发现并没解决锁屏后计时不准的问题,那看看我的解决方法吧。

1、使用Timer替换handler(Timer在应用存活期有效,休眠时无法唤醒)
2、设置手机锁屏开屏监听,采用 System.currentTimeMillis()获取锁屏的时间。

下面是监听锁屏的服务代码,至于注册和开启服务自己完善就没问题了。

/*** 监听锁屏的服务*/
public class LockService extends Service {private BroadcastReceiver receiver;private long screenOffTime;private static float screenOffStudyTime;@Overridepublic void onCreate() {super.onCreate();receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction() == Intent.ACTION_SCREEN_OFF) {LogUtil.e("收到锁屏广播");screenOffTime = System.currentTimeMillis();screenOffStudyTime = AlbumClockDBUtils.durationNum;} else if (intent.getAction() == Intent.ACTION_SCREEN_ON) {LogUtil.e("屏幕亮起广播");//锁屏这段时间时长 秒long soffTime = (System.currentTimeMillis() - screenOffTime) / 1000;//最新学习时长int screenOffTime = (int) (soffTime + screenOffStudyTime);}}};IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_SCREEN_ON);registerReceiver(receiver, filter);timer = new Timer(true);timer.schedule(timerTask, 0, 1000); //延时1000ms后执行,立即执行}private Timer timer;TimerTask timerTask = new TimerTask() {public void run() {//每隔一秒会执行一次}};
}

Android 锁屏后handler计时失效相关推荐

  1. android 锁屏后定时器,iOS锁屏或者后台计时器定时解决方法

    我们知道,当程序进入后台时,计时器就会暂时停止,当重新进入程序时,计时器又会重新开始,有时候,我们需要在程序进入后台时,计时器依然能够计时,所以,就想到了一种解决方案,利用进入后台和前台的时间差来让计 ...

  2. Android 锁屏后Service服务保活(支持9.0)

    最近遇到个问题: 后台Service启动正常启动后,锁屏状态下大概80秒左右Service就被暂停了(并没有被杀死),唤醒屏幕后就继续执行. 解决方法: Service启动时创建一条通知,与其绑定,这 ...

  3. Android 基于高德地图的锁屏后定位和轨迹自动纠偏(离线版)

    目录 一.后台如何持续获取定位 1.后台以及锁屏后持续定位异常的原因以及应对方案探索 2.后台持续获取定位失败的应对方案 二.对坐标点进行加工处理 (1).为什么要加工处理 (2).如何加工处理 本文 ...

  4. win10背景色改成豆沙绿 锁屏后失效修改方式

    今天将公司电脑从windows8升级到windows10之后,将电脑锁屏后,再解锁则设置的背景色豆沙绿失效,从网上搜了很多方式得以解决,记录下来供大家参考. 普通的一键护眼只是修改[HKEY_CURR ...

  5. Android仿网易云音乐中锁屏后在开锁界面插屏功能

    这个功能实现起来应该有多种方式,可以使用WindowManager创建window的方法. 在本文中我们使用开启一个Activity来充当锁屏界面. 实现步骤有以下两步: 一.后台开启一个Servic ...

  6. 【Android】锁屏后应用保活、拉活、双进程守护

    最近在使用高德地图实时获取定位时遇到了个问题,锁屏后一段时间(5~10分钟左右)后程序会被系统杀死,为了保活,特研究了下进程保活机制. 0.基本操作和概念 针对root过的手机,可以通过下列命令查看内 ...

  7. android app应用后台休眠,安卓手机锁屏后程序自动关闭,怎么设置手机app允许锁屏后台运行...

    原标题:安卓手机锁屏后程序自动关闭,怎么设置手机app允许锁屏后台运行 安卓手机锁屏后,很多程序就会自动关闭,实际上,这是安卓手机的一种保护机制.为了使系统能够流畅稳定的运行以及更加省电,它都会在手机 ...

  8. android 锁屏 广告,华为手机锁屏后总是出现广告该怎么办?-安卓手机屏幕解锁后总是有个广告...

    大家在使用<>开锁>过程中可能会有<>安卓手机打开锁屏总有新闻广告>的问题,今天就由极速到家为大家从以下几个方面:<>华为手机锁屏后总是出现广告该怎么办 ...

  9. Android锁屏实现与总结

    Android锁屏实现与总结 Android锁屏实现与总结(网易云阅读) 一.自定义锁屏基本原理 二.重要步骤 1.广播注册 2.Activity设置 3.按键的屏蔽 4.滑屏解锁 5.Event b ...

最新文章

  1. LeetCode简单题之K 进制表示下的各位数字总和
  2. Web开发常规调试方法与常见问题分析
  3. 【hibernate系列】采用p6spy+SQLProfiler完整显示hibernate的S...
  4. ECCV 2020 DETR:《End-to-End Object Detection with Transformers》论文笔记
  5. php 重载等号,重载运算符
  6. web站点放入html页面,HTML
  7. kotlin 查找id_Kotlin程序查找平行四边形的区域
  8. windows 播放MP3音乐
  9. 基本操作:Go创建GraphQL API
  10. QQ春节游园会被拆开11.2亿个福袋 近一半都被00后给拆了
  11. Android 蓝牙扫描
  12. 大米云主机首批优秀体验师新鲜出炉——综合篇
  13. 微信小程序-map地图标签的初级使用, 拥有图标,气泡,地图本身无法缩放移动需要点击跳转第三方地图平台
  14. 自然语言处理 | (30) 文本相似度计算与文本匹配问题
  15. linux443端口无法建立连接,无法通过端口443连接到ssh
  16. rundll32 命令大全
  17. 多幸运用计算机演奏的乐谱,多幸运简谱-韩安旭演唱-孙世彦制谱
  18. 【文件管理】-如何规范文件及文件夹命名
  19. 读名老中医之路笔记(三)
  20. EXCEL VBA 实现翻译(简单对照)

热门文章

  1. 吃一堑长一智!java基础刷题网站
  2. 百度翻译接口测试(3)-最终篇
  3. 种子网站(大型单机游戏,古老电影必备)
  4. 地磅无人值守称重系统如何实现
  5. 计算机视觉 特征检测与匹配 轮廓检测
  6. 【Ubuntu】Ubuntu下搜狗输入法打不出中文
  7. 男性着装常识(男人珍藏篇)
  8. 数据分析三剑客:Numpy、Pandas、Matplotlib(你想看的这里都有,超详细版本)
  9. 【软件工程基础】我对书中几种软件过程模型的特点以及优缺点的理解和总结
  10. 理财(二):国债逆回购与通货膨胀