【发布时间】: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