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

时间:2019-08-21 10:39:58

标签: android service process lifecycle watchdog

我正在与Android对抗,要求杀死屏幕上未激活的所有内容。用几句话我的问题:

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

哪种是实施App B的最佳方法?

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

在我看来,服务A一直存在直到应用程序A存活(由于绑定),所以服务A所属的进程也存在,线程A也是如此。

不幸的是,从测试中我发现,有时(以零星的方式)在一段时间(也是零星的时间)之后,系统上几乎没有任何工作(除了App A,Service A和Thread A)杀死服务A进程,因此线程A停止并且看门狗过去了。

服务A死后,它将重新启动(因为它是绑定服务,并且应用A仍在运行),但是,到目前为止,我不保存服务的当前状态(仅由START_WATCHDOG命令到达或不是),这就是看门狗过去的原因。

因此,我对解决方案有几个疑问:

  • 可以吗?我只需要保存服务A的当前状态,以便在重新启动时将其还原?
  • 我是否应该更好地发现服务A或更好的过程被杀死的原因?
  • 我的问题有更好的解决方案吗?

非常感谢大家花一些时间来帮助我。

2 个答案:

答案 0 :(得分:0)

不确定服务的运行时间,可以尝试以下操作:

  • 使用foreground service.但是,如果长时间需要CPU,则可能需要在服务起点内获取唤醒锁。另外,需要在电话状态栏上显示通知。
  • 使用WorkManager-jetpack的新api部分,简化了警报管理器和作业调度程序的使用-定期调度任务。但是,如果您的频率每5-10分钟大于1,则需要注意打ze模式。如果手机打do睡,您的任务可能会延迟到维护期间。在此处应用的一个技巧可能是,当您捕获of睡模式的激活并在停用时返回到Workmanager逻辑时启动前台服务(如果您不希望用户看到前台服务的通知)。在前台服务中执行所需的操作。
  • 使用Firebase Cloud Messaging定期将通知从服务器发送给用户,以使您有少量时间在后台工作。收到通知时,OS grants you an interval运行任务。

答案 1 :(得分:0)

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