zoukankan      html  css  js  c++  java
  • Android Wear 2.0 AlarmManager 后台定时任务

    以前在Android 4.0时,alarmManager 没什么问题。后来android为了优化系统耗电情况,引入了doze模式,参见此页

    https://developer.android.com/training/monitoring-device-state/doze-standby

    简单地说,系统会长时间待机后,会自动进入doze模式,这种模式里,alarmManager啥的都不好用了,系统会自动从doze模式转出来一小段时间,把刚在在doze里被忽略的事件(比如说alarmManager)执行。这样一来,alarmManager根本无法定时调用了。

    其实,对于每个应用,这个模式是可以配置的,一般在 Settings > Battery > Battery Optimization,也可以用代码打开设置页面,让用户设置,下面是一段别人写的代码:

     Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);  
               intent.setData(Uri.parse("package:user.zhuku.com"));  
               startActivity(intent);  

    但是在android wear手表上,比如华为 watch2,是没有这个设置项的,也就是说,手表放置在桌子上,不使用,一段时间后,所有应用一定会停用。经过测试发现,手表进入doze模式后,的确如开发文档说的那样,定时唤醒系统,并且频率越来越低。

    试了好多方法,比如JobService,setAndAllowWhileIdle 在 华为手表上,都无法越过这个限制。

    好在手表有一个设定,就是带在手上后,系统就不会进入doze模式了,不知道是使用的什么方法判断的手表是否带在手上。

    测试基于 华为 watch 2 ,andoroid 8.0 ,android wear 2.x,

    手表长时间不带的话,会进入doze模式,后台任务都会停止,好在我们的应用是要求用户一直呆在手上,所以不用介意手表doze后的情况。
    手表进入doze后,再次移动手表,系统会立即唤醒,后台任务可以继续正常执行,满足我们的需求 :用户白天带上手表,系统执行跟踪;晚上摘下,系统doze后停止跟踪;第二天再次带上时,系统继续跟踪。

    由于手表带在手上时,手表存在一定的移动,所以系统不会doze,理论上可以使用任何后台技术实现需求。我们的demo中,使用的是系统alarm+后台service 的方案。 系统中有3个alarm,第一个负责添加 sersor listener, 第二个负责移除 sensor listener,第三个负责触发网络请求,发送数据。这3个alarm定期向service中的线程发送message,触发相应操作。

    为了减少耗电,目前是每分钟开启监控30秒,关闭监控30秒。为了减少数据库的数据量,目前是每3秒录入一次数据。

    demo是一款 在手表上独立运行的应用。充满电后,可满足一个白天12小时的使用(wifi条件下)(大约20小时以上?)(晚上会进入doze,耗电很少)。

    另外华为手表目前没有发现 doze的白名单设置。

    demo仅仅验证了方案的可行性,具体实现时需要优化。比如把service bind上,去掉handler的使用。再比如针对新的alarm机制调整alarm的注册和使用。再比如 对 front service 的notification界面 进行动态调整,让用户在通知栏看到更多的跟踪信息。

  • 相关阅读:
    Oracle Hint的用法
    利用flashback transaction query新特性进行事务撤销
    存储的一些基本概念(HBA,LUN)
    SAN和NAS
    SAN (Storage Attached Network),即存储区域网络
    深入浅出谈存储之NAS是什么
    对于NAS,IP SAN以及iSCSCI SAN存储的一些认识和理解
    Oracle的体系结构
    利用360免费wifi搭建局域网让他人访问Oracle数据库
    杭电ACM id:3783
  • 原文地址:https://www.cnblogs.com/breezemist/p/8995640.html
Copyright © 2011-2022 走看看