繁体   English   中英

如何在Android上连续运行后台任务?

[英]How to have a continuous running background task on Android?

我正在与 Android 想要杀死屏幕上不活跃的所有内容作斗争。 我的问题简而言之:

  • 我有一个微控制器,它与运行 Android 的处理器进行通信;
  • 处理器必须保持微控制器上的看门狗处于活动状态,定期(每隔一秒)重置其寄存器之一; 一个应用程序,比如 App B,完成了这个任务;
  • 在处理器上,我可以确定另一个应用程序的持久存在,比如 App A(或者,如果 App A 死了,App B 也可能因为系统受损而死),它现在什么都不做,将来会完成其他职责。

哪个是实现 App B 的最佳方式?

我尝试了以下解决方案:应用程序 B 包含一个绑定服务,比如说服务 A,应用程序 A 可以绑定到该服务; 服务 A 启动一个线程,比如说线程 A,它会定期重置微控制器看门狗。 当应用程序 A 向服务 A 发送命令(例如 START_WATCHDOG)时,线程 A 启动。

在我的想法中,服务 A 一直存在到应用程序 A 存在(由于绑定),因此服务 A 所属的进程存在,线程 A 也是如此。

不幸的是,从测试中我看到有时(以零星的方式),经过一段时间(也是零星的时间),几乎没有在系统上运行的工作(除了应用程序 A、服务 A 和线程 A)系统会杀死服务 A进程,因此线程 A 停止并且看门狗结束。

当服务 A 死亡时,它会重新启动(因为它是一个绑定服务并且 App A 仍在运行)但是,现在,我不保存服务的当前状态(它仅包含 START_WATCHDOG 命令到达与否)和这就是看门狗失效的原因。

所以,我对我的解决方案有几个问题:

  • 可以吗,我只需要保存服务 A 的当前状态以便在重新启动时恢复它?
  • 我应该更好地发现服务 A 或更好地其进程被终止的原因吗?
  • 我的问题有更好的解决方案吗?

非常感谢所有愿意花时间帮助我的人。

我在一个应用程序中进行工作,以跟踪用户,以使他们记录他们的足迹,并发现如果android系统需要可用内存,则服务随时可能被杀死。 即使您的服务有唤醒锁或正在前台运行。

我发现的解决方案是使用警报 ,如果您安排警报 ,则无论您的应用程序是否仍在执行,都会触发该警报。 这样,即使系统由于缺乏资源而终止了该应用程序,我的应用程序仍可以获取设备位置。 这是我在这种情况下发现的唯一解决方案。 唤醒录音服务的警报。

当他们说如果您确实需要继续运行应用程序,无论用哪种方法,都应使用警报代替服务,这是我在某个Google I / O中想到的。

除此之外,如果您需要不断唤醒该应用,请使用exact警报作为某些设备中的inexact exact警报,如果应将它们触发的时间与当前时间太近,则可能会在5分钟后触发。

不确定您的服务运行的时间段,您可以尝试以下方法:

  • 使用前台服务。 但是,如果长时间需要 CPU,则可能需要在服务起点内获取唤醒锁。 另外,需要在手机状态栏上显示通知。
  • 使用WorkManager -jetpack 的新 api 部分简化警报管理器和作业调度程序的使用 - 定期安排您的任务。 但是,如果您的频率高于每 5-10 分钟 1 次,则您需要注意打盹模式。 如果手机打瞌睡,您的任务可能会延迟到维护期。 在这里应用的一个技巧可能是在您捕获打盹模式的激活并返回到停用时的 Workmanager 逻辑时启动前台服务(如果您不希望用户看到前台服务的通知)。 在前台服务中做任何你想做的事情。
  • 使用Firebase Cloud Messaging定期从您的服务器向您的用户推送通知,以便您有少量时间在后台工作。 当通知到来时, 操作系统会授予您运行任务的时间间隔

使用工作管理器很容易实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM