我正在实现一个可以在用户摇动手机时监听并采取措施的应用程序。
因此,我实现了以下服务:
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会杀死或暂停该应用程序并停止该服务,直到再次打开它为止。
如何避免这种情况?
重要说明:我不想避免系统进入睡眠模式,但是我想在系统退出睡眠模式时恢复执行。
答案 0 :(得分:0)
我了解您已经将服务作为具有通知的前台启动,这将使您的服务具有最高优先级。 您可以通过检查通知来轻松检查服务是否仍在运行,因为该通知将在服务运行后立即显示。但是如果通知仍在显示,但您注意到服务执行评级低于预期(已暂停,然后将像轮循一样再次运行)。然后 我认为此行为是由android作为操作系统导致的,它需要尽可能节省电池,因此当设备插入充电器或设备解锁并开启或设备锁定时,服务的执行情况将有所不同。
但是如果通知被取消,则意味着该服务被代码中的某些错误杀死,这些错误导致服务代码中的异常或内存泄漏,并且如果您已经将服务标志设置为START_STICKY或START_REDELIVER_INTENT系统过一会儿再次启动服务
答案 1 :(得分:0)
经过大量研究我可以说这个问题是特定于自定义 ROM 的,因为我只有小米手机并且使用 MIUI,我不知道它是否存在于其他自定义 ROM 中,但我可以肯定地说这不是一个库存android的问题。 在 MIUI 中,您需要转到安全应用 -> 电池和性能 -> 应用省电模式,然后手动将您的应用设置为“无限制”! 使用 Intent 有一个简单的方法,请检查 this 答案!