由于公司业务的需要,需要每隔一分钟上传一次定位的信息。刚开始想的很简单,开启一个服务,然后每隔一分钟上传一次。但是在进行的时候就出现问题了。首先是服务的保活,不能因为内存紧张等被杀死,于是采用了前台服务,基本可以搞定。(公司的是定制的华为手机,其他的手机没有测试);
然后就是每隔一分钟进行定位上传,那么问题来了。
既然是一分钟,我们当然会使用计时器
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果然被杀死。那么如果我们只是为了短暂的保持服务不被杀死,而耗电量也没有太大的需求,我们是不是可以让服务播放一个没有声音的音乐文件呢。