Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在暂停/终止后台服务_Java_Android_Android Service - Fatal编程技术网

Java 正在暂停/终止后台服务

Java 正在暂停/终止后台服务,java,android,android-service,Java,Android,Android Service,我正在实现一个应用程序,当用户摇晃手机时,它会监听并采取行动 因此,我实施了以下服务: public class ShakeMonitorService extends Service { ... ShakeDetector shakeDetector; @Override public int onStartCommand(Intent intent, int flags, int startId) { shakeDetector= new

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

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

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中,我按照所述监听加速计的传感器事件

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

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

我怎样才能避免这种情况


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

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


但是如果通知被取消,则这意味着服务被代码中的某些错误杀死,这些错误导致服务代码中出现异常或内存泄漏,并且如果您已经将服务标志设置为START_STICKY或START_REDELIVER,则系统将在一段时间后再次启动服务已以前台通知方式启动服务,这将为您的服务提供最高优先级。 您可以通过检查通知轻松检查服务是否仍在运行,因为通知将在服务运行时立即显示。但如果通知仍在显示,但您注意到服务执行评级低于预期(已暂停,然后将像循环赛一样再次运行)。然后 我认为这种行为是由android操作系统造成的,它需要尽可能节省电池,因此当设备插入充电器或设备解锁并打开或设备锁定时,服务的执行将有所不同


但是,如果通知被取消,则这意味着服务被代码中的某些错误杀死,这些错误导致服务代码中出现异常或内存泄漏,并且如果您已经将服务标志设置为START_Stick(启动粘性)或START_REDELIVER(启动重新提交),则经过大量研究,系统将在一段时间后再次启动服务我可以说这个问题是针对cusom ROM的,因为我只有MI phone和使用MIUI,我不知道其他定制ROM中是否存在这个问题,但我可以肯定地说,android股票中没有这个问题。 在MIUI中,你需要进入安全应用程序->电池和性能->应用程序电池节电器,并手动将你的应用程序设置为“无限制”!
有一个简单的方法可以做到有目的,检查答案

经过大量研究,我可以说这个问题是针对cusom ROM的,因为我只有MI phone和MIUI,我不知道它是否存在于其他定制ROM中,但我可以肯定地说,这在android股票中不是问题。 在MIUI中,你需要进入安全应用程序->电池和性能->应用程序电池节电器,并手动将你的应用程序设置为“无限制”!
有一个简单的方法可以做到有目的,检查答案

使用带有通知的前台服务,后台的应用程序可能会暂停/终止其进程。忘了提及我已经在foreground启动ShakeMonitorService服务本身会被终止(通知会被删除)还是只有detector会被挂起?是否有可能将设备缩小到特定品牌?一些OEM的实现比默认的更具侵略性,甚至会强制停止前台服务,除非它们在制造商的电池节电器应用程序中被明确列为白名单。我同意@Pawel的说法。我也有一个运行前台服务的应用程序,我确信小米(MIUI)和华为(EMUI)都有自己的电池优化,可以在不破坏服务的情况下干扰服务。用户可以在应用程序设置中手动禁用此功能。不幸的是,我还没有找到一种适合所有制造商的优雅方法来处理此问题。使用带有通知的前台服务,后台应用程序可能会暂停/终止其进程。忘记提及我已经在foreground中启动ShakeMonitorService服务本身是否会终止(通知会被删除)还是只有探测器被暂停?是否有可能将设备缩小到特定品牌?一些OEM的实现比默认的更具侵略性,甚至会强制停止前台服务,除非它们在制造商的电池节电器应用程序中被明确列为白名单。我同意@Pawel的说法。我也有一个运行前台服务的应用程序,我确信小米(MIUI)和华为(EMUI)都有自己的电池优化,可以在不破坏服务的情况下干扰服务。用户可以在应用程序设置中手动禁用此功能。不幸的是,我还没有找到一种优雅的方式来处理所有制造商的问题。