以前在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界面 进行动态调整,让用户在通知栏看到更多的跟踪信息。

Android Wear 2.0 AlarmManager 后台定时任务的更多相关文章

  1. Android Wear开发

    Android Wear从2014年3月发布到现在已经从1.0发展到2.0(目前还没正式发布).其产品定位也发化了巨大变化,因为Android Wear 1.0通讯方式只有蓝牙,限定了系统,比较依赖手 ...

  2. Android Wear计时器开发

    记得在2013年12月的时候,有系列文章是介绍怎么开发一个智能手表的App,让用户可以在足球比赛中记录停表时间.随着Android Wear的问世,在可穿戴设备中开发一款这样的App确实是个很不错的想 ...

  3. 如何开发Android Wear应用程序

    Android Wear是连接安卓手机和可穿戴产品的一个平台.自从今年上半年发布以来,Android Wear获得了大量关注,既有来自消费者的关注,也有来自开发商的关注,后者希望自己的应用程序已经准备 ...

  4. Android从5.0到9.0版本的主要变更

    https://www.jianshu.com/p/10bdbf883c46?utm_source=desktop&utm_medium=timeline Android5.0 1.虚拟机 在 ...

  5. Android 蓝牙4.0 BLE

    Android ble (Bluetooth Low Energy) 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用. BLE是蓝牙4.0的核心Profil ...

  6. Android Wear预览版——尝鲜

    前两天Google推出了Android Wear的SDK,稍稍的瞧了一眼,发现这个预览版的功能还是比较简单的,只有一个通知转发的功能,不过就这么一个功能,带来的效果却是Very Good~~ 功能:发 ...

  7. (转)Android Service 双进程常驻后台(2)

    最近项目用到Service常驻后台,研究了一下发现手Q和微信都是使用了双进程来保证一键清理后自动复活,copy网上双进程Service的例子,再结合onTrimMemory(),基本实现一键清理后自动 ...

  8. Android Wear 开发入门

    大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下An ...

  9. Android Wear开发 - 数据通讯 - 第零节 : 打包Wear应用(手机和手表应用如何连接)

    之所以将打包这一特殊的内容作为数据通讯的第零节,是因为如果没有通过配置打包的一些信息,则没有办法将手机端应用和手表端应用连接起来,则无法继续进行接下来的数据通讯的开发. 以下依然只针对Eclipse平 ...

随机推荐

  1. vagrant三网详解(团队/个人开发必看) 转

    vagrant三网详解(团队/个人开发必看)   Vagrant 中一共有三种网络配置,下面我们将会详解三种网络配置各自优缺点. 一.端口映射(Forwarded port) 顾名思义是指把宿主计算机 ...

  2. Activiti6-FormService(学习笔记)重要

    设置流程定义文件: <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns=&qu ...

  3. jsonp原理,封装,应用(vue项目)

    jsonp原理 JSON是一种轻量级的数据传输格式. JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 ...

  4. codeforces16B

    Burglar and Matches CodeForces - 16B A burglar got into a matches warehouse and wants to steal as ma ...

  5. linux shell 命令集锦

    -h FILEFILE exists and is a symbolic link (same as -L)文件存在并且是一个字符链接(与-L选项相同) dirname $0  定位执行的命令脚本的相 ...

  6. Day 1 上午

    唉,上午就碰到一个开不了机的电脑,白白浪费了半个小时,真的难受QwQ POINT1 枚举 枚举也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素. 用题目中给定的检验条件判定哪些是无用的,哪些 ...

  7. 【XSY2851】蛋糕 数学

    题目大意 有一个边长为 \(1\) 的正 \(n\) 边形,你要把这个正 \(n\) 边形放到一个正 \(m\) 边形里面,且两个多边形的中心重合. 问你这个正 \(m\) 边形的边长最小是多少. \ ...

  8. Java 中数字和字符串拼接的问题

    注意细节 字符是char 类型,字符串是String 类型1.数字拼接char,得到的还是数字,相当于和它的ASCII编码相加(如果定义成String 会编译错误)2.数字拼接String,得到的是S ...

  9. 「ZJOI Day2」游记

    Day-1 晚上一直在出自己做的模拟赛的T1,真的快要死掉了. 分类讨论几十种情况. 窝还是找了Bluesky大佬一起来验题,她瞬间就A掉了这一道题目...自闭了.. 诶,我还是太弱了. 之前教练组织 ...

  10. 【洛谷P1129】矩阵游戏

    题目大意:给定一个 N*N 的矩阵,有些格子是 1,其他格子是 0.现在允许交换若干次行和若干次列,求是否可能使得矩阵的主对角线上所有的数字都是1. 题解:首先发现,交换行和交换列之间是相互独立的.主 ...