工程中我们常用AlarmManager来设置定时闹钟,让app在特定的时间执行特定的行为。在实际测试中发现,AlarmManager经常出现失效的情况,查看log发现,因为测试手机配置比较低,系统频繁回收app,导致app设置的AlarmManager失效。
为了让AlarmManager不失效,我们需要app在后台长期运行,当然这对用户来说,是一件不乐意的事。网络上有很多如何让应用长期在后台的方法,尝试了一些,最后发现使用前台服务,是一个很好的方法。使用前台服务,在通知栏会显示通知,需要一些特殊的方法隐藏这个通知。
隐藏通知栏的方法见:
Android的startForeground前台Service如何去掉通知显示
博主通过log查看service的生命周期是否正常,这里补充adb 命令:
adb shell dumpsys activity services 查看service信息
下面是查看结果
:
* ServiceRecord{35812363 u0 x.xx.xxx/.service.BatteryProcessS
ervice}
intent={cmp=x.xx.xxx/.service.BatteryProcessService}
packageName=x.xx.xxx
processName=x.xx.xxx
baseDir=/data/app/x.xx.xxx-2/base.apk
dataDir=/data/data/x.xx.xxx
app=ProcessRecord{27706d00 8266:x.xx.xxx/u0a9}
isForeground=true foregroundId=8266 foregroundNoti=Notification(pri=-2 conte
ntView=x.xx.xxx/0x10900b2 vibrate=null sound=null defaults=0x0
flags=0x72 color=0x00000000 vis=PRIVATE)
createTime=-1m41s701ms startingBgTimeout=--
lastActivity=-1m41s701ms restartTime=-1m41s701ms createdFromFg=true
startRequested=true delayedStop=false stopIfKilled=false callStart=true last
StartId=1
其中 isForeground=true ,说明我们需要的services确实是在前台的。前台服务被回收的概率比较低,因此应用就可以长期在后台运行,当然这种行为对用户体验来说不好,慎用!