关于计时器的一些问题

由于公司业务的需要,需要每隔一分钟上传一次定位的信息。刚开始想的很简单,开启一个服务,然后每隔一分钟上传一次。但是在进行的时候就出现问题了。首先是服务的保活,不能因为内存紧张等被杀死,于是采用了前台服务,基本可以搞定。(公司的是定制的华为手机,其他的手机没有测试);
然后就是每隔一分钟进行定位上传,那么问题来了。
既然是一分钟,我们当然会使用计时器

timer

这个我测了一下,非常的不准确,间隔有点时间长,有的时间短

AlarmManager

很多人都会推荐使用这个进行计时,但是再用的时候问题依然很大。首先,他的setrepeat方法根本就没有起到作用。于是搜索了一下,说的是在4.4之后,该方法不在严格的执行。用知乎上一个用户的回答:

从API 19开始,alarm的机制都是非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用。有一些新的API会支持严格准确的传递,见 setWindow(int, long, long, PendingIntent)和setExact(int, long, PendingIntent)。targetSdkVersion在API 19之前应用仍将继续使用以前的行为,所有的闹钟在要求准确传递的情况下都会准确传递。setRepeating 方法在 API 19开始将会失去原来的效果

作者:菜菜籽
链接:https://www.zhihu.com/question/38860182/answer/79902466
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

于是我测了一下,用setwindow方法,当我关闭手机屏幕的时候,定位是每隔五分钟执行一次,而点亮屏幕,则开始一分钟执行一次,也就是说setwindow方法也是不可取的。原因可能是android的对齐唤醒机制,当然也可能是华为的系统进行深度的定制。

让系统不休眠

为了使altermanager一直正常运行,就必须保证系统不是休眠状态,于是我们可以个一定的时间内使屏幕亮屏。这样似乎解决了问题。但是长时间这样会大量的消耗电量,并且被人看到一直亮屏也是不好的。于是我就想着点亮屏幕之后再把屏幕变暗,似乎用 goToSleep这个方法。但是会报Neither user 10081 nor current process has android.permission.DEVICE_POWER.错误,网上有人说是需要我们的应用变成系统应用。  还有一种方法,就是一键锁屏,但是这个功能的实现必须激活设备管理器

还有一种说法是使用## WakefulBroadcastReceiver ##
但是我测试的时候, 依然没有太大的效果

Thread

到后来的时候,也没有找到一个太好的方法。因为我们是在每一分钟采集一个gps坐标,于是在接口中设置一分钟更新一次然后上传坐标。
还有就是弄一个死循环,当上传一次坐标之后,thread.sleep(60000)’;

参照音乐播放器

在系统版本比较高的手机中,往往是在休眠之后直接被杀死,管你是前台进程还是什么。但是发现,那些音乐播放器却是可以长时间进行存在而不被杀死。于是我网上找了一个人写的音乐播放器,测试了一下。华为mate9点击清理(不是滑动的那种),其他app全部被杀死,而音乐播放器没事。于是我就得出一个不成熟的结论,如果正在播放媒体文件,app是不会这样杀死的。 随之,我把音乐播放器暂停,单击清理,于是app果然被杀死。那么如果我们只是为了短暂的保持服务不被杀死,而耗电量也没有太大的需求,我们是不是可以让服务播放一个没有声音的音乐文件呢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值