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