【问题标题】:Background service being paused / killed后台服务被暂停/终止
【发布时间】:2019-02-17 19:21:01
【问题描述】:

我正在实现一个应用程序,它会在用户摇晃手机时进行监听并采取行动。

所以我实现了以下服务:

public class ShakeMonitorService extends Service {

    ...
    ShakeDetector shakeDetector;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        shakeDetector= new ShakeDetector(this);
        shakeDetector.start();
        ....
        startForeground(MY_ID, myNotification);
        return Service.START_STICKY;
    }

    ...
}

并在MainActivity的onCreate中启动服务

ContextCompat.startForegroundService(this, 
          new Intent(this, ShakeMonitorService.class));

在shakeDetector 中,我按照here 的描述监听加速度计的传感器事件。

它可以在我的设备上正常工作,但一些用户报告说它可以工作,直到他们长时间锁定设备(即 3 小时)。从这一刻起,即使在使用设备(屏幕打开)时,应用程序也会停止检测摇晃手势,直到它们再次启动应用程序。

发生了什么事?我认为 Android 会终止或暂停应用程序并停止服务,直到它再次打开。

我怎样才能避免这种情况?

重要提示:我不想避免系统进入睡眠模式,但我想在系统退出睡眠模式时恢复执行。

【问题讨论】:

  • 使用带有通知的前台服务,后台应用程序可能会暂停/终止其进程。
  • 忘了说我已经在前台启动了 ShakeMonitorService
  • 服务本身是否被终止(通知被删除)或只有检测器被暂停?是否可以将设备范围缩小到特定品牌?一些 OEM 实现比默认更激进,甚至会强制停止前台服务,除非它们在制造商的省电应用中明确列入白名单。
  • 我赞同@Pawel 的说法。我还有一个运行前台服务的应用程序,我确信小米 (MIUI) 和华为 (EMUI) 都有自己的电池优化功能,它们会干扰服务而不杀死它。用户可以在应用设置中手动禁用此功能。不幸的是,我还没有为所有制造商找到一种优雅的方式来处理这个问题。

标签: java android android-service


【解决方案1】:

我了解到您已经将服务作为前台启动并发出通知,这将使您的服务具有最高优先级。 您可以通过检查通知轻松检查服务是否仍在运行,因为通知将在服务运行后立即显示。但如果通知仍在显示,但您注意到服务执行率低于您的预期(暂停,然后将像循环一样再次运行)。然后 我认为这种行为是由 android 作为操作系统引起的,它需要尽可能地节省电池,因此当设备插入充电器或设备解锁并打开或设备被锁定时,服务的执行会有所不同.

但是如果通知被解除,那么这意味着服务被代码中的一些错误杀死,这些错误会导致服务代码中的异常或内存泄漏,并且如果您已经将服务标志设置为 START_STICKY 或 START_REDELIVER_INTENT系统在一段时间后再次启动服务

【讨论】:

    【解决方案2】:

    经过大量研究,我可以说问题是特定于自定义 ROM,因为我只有 MI 手机并使用 MIUI,我不知道它是否存在于其他自定义 ROM 中,但我可以肯定地说它不是库存android的问题。 在 MIUI 中,您需要转到安全应用 -> 电池和性能 -> 应用节电并手动将您的应用设置为“无限制”! 还有一个简单的方法可以用 Intent 来做,检查this 答案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多