作为 Android 开发者,当提到“保活”时,心中的滋味可谓是五味杂陈。互联网上也有各种“黑科技”来达到相应的目的。若是普通的应用,我是十分拒绝进行保活的,当用户不需要你了,还要偷偷地活着,做一些事情。最近参与开发的一款 App 是跟地图相关的,有着「录轨迹」的功能,当用户开启录制功能后,即使退出应用到后台,也是期望能够继续录制的,所以便研究了一番保活,并实践了一下,最后效果也还不错。
说下总体方案:1 像素 Activity 、音频播放、前台服务。
首先,监听锁屏相关的广播:
1 | public class ScreenReceiver { |
保活管理类:
1 | public class KeepAliveManager { |
很简单的一个单例类,调用 start 方法传入对应的业务启动保活,保活只会在锁屏时开启。当没有处于需要保活的业务场景时,则不会启动保活。
然后看到 ScreenManager:
1 | public class ScreenManager { |
主要功能就是启动、关闭一个 1 像素的 Activity。
看下 LockScreenActivity:
1 | /** |
同时,录制轨迹的服务使用 startForeground 方式。
1 | public class RecordService extends Service { |
结合以上代码,可以达到不错的保活效果了。可以看到,代码比较克制,只在特定需要保活的业务场景才开启保活,绝不会在后台不经用户同意做一些“恶心”的事情。另外,锁屏播放无声音乐会比较耗电,需要优化,可以在一段时间内播放一次。同时播放音乐可能会与有些音乐、视频 App 的播放冲突,从而达不到保活效果,这些都是可优化的方向。