后台服务被暂停/终止

时间:2019-02-17 19:21:01

标签: java android android-service

我正在实现一个可以在用户摇动手机时监听并采取措施的应用程序。

因此,我实现了以下服务:

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));

在震动检测器中,我按照here所述监听加速度计的传感器事件。

它可以在我的设备上正常运行,但是一些用户报告说,该功能可以正常工作,直到他们长时间锁定自己的设备(即3小时)。从此刻起,即使在使用设备(屏幕显示)时,该应用程序也会停止检测到摇动手势,直到再次启动该应用程序为止。

这是怎么回事?我以为Android会杀死或暂停该应用程序并停止该服务,直到再次打开它为止。

如何避免这种情况?

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

2 个答案:

答案 0 :(得分:0)

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

但是如果通知被取消,则意味着该服务被代码中的某些错误杀死,这些错误导致服务代码中的异常或内存泄漏,并且如果您已经将服务标志设置为START_STICKY或START_REDELIVER_INTENT系统过一会儿再次启动服务

答案 1 :(得分:0)

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