这些天我一直在努力寻找在Android中运行永不停止服务的方法。这只是追求同一目标的指南。希望能帮助到你!
问题
由于Android 8.0(API级别26)中引入了Android电池优化,后台服务现在有一些重要的限制。基本上,一旦应用程序处于后台运行一段时间,它们就会被杀死,这使得它们对于运行永不停止运行的服务毫无价值。
根据Android的建议,我们应该使用JobScheduler唤醒锁,在作业运行时让手机保持清醒状态它似乎运行得很好,并且会为我们处理唤醒锁。
不幸的是,这是行不通的。最重要的是,JobScheduler打盹模式(你需要将数据发送到你的服务器)的限制列表将根据Android自行决定运行工作,一旦手机进入打盹模式,这些工作的运行频率将不断增加。甚至最糟糕的是,如果你想要访问网络 (你需要将数据发送到你的服务器)你将无法做到。查看打盹模式所施加的限制列表。
如果您不介意无法访问网络并且您不关心不控制周期性,JobScheduler也可以正常工作。在我们的例子中,我们希望我们的服务以非常特定的频率运行,永远不会停止,所以我们需要其他东西。
关于前台服务
如果你一直在寻找解决这个问题的互联网,你很可能最终从Android的文档到达了这个页面。
在那里,我们介绍了Android提供的不同类型的服务。看一下描述:
前台服务执行一些用户可以注意到的操作。例如,音频应用程序将使用前台服务播放音频轨。前台服务必须显示通知。即使用户不与应用程序交互,前台服务也会继续运行。
这似乎正是我们正在寻找的……确实如此!
我的代码
创建一个真正是一个简单的过程,所以我将访问并解释构建永不停止的前台服务所需的所有步骤。
像往常一样,我已经创建了一个包含所有代码的存储库,以防您想要查看它并跳过帖子的其余部分。
添加一些依赖项
我在这个例子中使用Kotlin协同程序Fuel,因此我们将利用协同程序和Fuel库来处理HTTP请求。
为了添加这些依赖项,我们必须将它们添加到我们的文件中:
我们的service
需要显示通知,以便用户知道应用程序仍在运行。如果你考虑一下,这是有道理的。
请注意,我们必须覆盖一些处理服务生命周期关键方面的Service回调方法(callback methods)。
我们使用部分唤醒锁打盹模式的也非常重要,因此我们的服务永远不会受到打盹模式的影响。请记住,这会对我们手机的电池寿命产生影响,因此我们必须评估我们的用例是否可以通过Android提供的任何其他替代方案来处理,以便在后台运行流程。
代码中有一些实用函数调用(,)和一些自定义枚举(),但不要太担心。如果您想了解它们的来源,请查看示例存储库。
是时候处理Android Manifest了
我们需要一些额外的权限,和。请确保您不要忘记包含它们,因为它不会起作用。
一旦我们将它们放到位,我们将需要声明服务。
启动这项服务
根据Android版本,我们必须使用特定方法启动服务。
如果Android版本低于API 26,我们必须使用startServicestartForegroundService。在任何其他情况下,是我们使用startForegroundService。
在这里你可以看到我们的,只有一个屏幕,有两个按钮来启动和停止服务。这就是您开始我们永不停止的服务所需的一切。
请记住,您可以查看此GitHub存储库中的完整代码。
效果:在Android启动时启动服务
好的,我们现在有永不停止的服务,每分钟都按照我们的意愿发起网络请求,然后用户重新启动手机……我们的服务不会重新开始……:(失望)
别担心,我们也可以为此找到解决方案。我们将创建一个名为BroadCastReceiver。
然后,我们将再次修改我们并添加一个新的权限()和我们新的BroadCastReceiver。
请注意,除非服务已在运行,否则不会重新启动该服务。这就是我们编程的方式,并不是说它必须是这样的。
如果您想测试这个,只要启动一个包含谷歌服务的模拟器,并确保在root模式下运行adb。
Enjoy!
大家都在看
欢迎前往安卓巴士博客区投稿,技术成长于分享
期待巴友留言,共同探讨学习
领取专属 10元无门槛券
私享最新 技术干货