Android 设备能否在前台服务之前休眠?

Android 设备能否在前台服务之前休眠?,android,android-service,wakelock,Android,Android Service,Wakelock,我知道之前我们需要使用WakefulBroadcastReceiver来确保在receiveronReceive和serviceonHandleIntent之间设备不会再次进入睡眠状态 现在谷歌似乎不赞成使用WakefulBroadcastReceiver,因为从一个接收者开始一项服务是不“正确”的 我正在做的一件事是从高优先级FCM通知启动前台服务。这在新的后台执行规则下完全有效。但由于WakefulBroadcastReceiver已被弃用,这是否意味着startForegroundServ

我知道之前我们需要使用WakefulBroadcastReceiver来确保在receiver
onReceive
和service
onHandleIntent
之间设备不会再次进入睡眠状态

现在谷歌似乎不赞成使用WakefulBroadcastReceiver,因为从一个接收者开始一项服务是不“正确”的

我正在做的一件事是从高优先级FCM通知启动前台服务。这在新的后台执行规则下完全有效。但由于
WakefulBroadcastReceiver
已被弃用,这是否意味着
startForegroundService
保证设备在
onReceive
OnHandleContent
的唤醒锁定之间保持足够长的唤醒时间?或者我应该在接收器中手动持有wakelock并将其发送到服务以释放它吗

这是否意味着startForegroundService可以保证设备不会损坏 在onReceive和onHandleIntent的wakelock之间保持足够长的清醒时间

没有

或者我应该在接收器中手动持有wakelock并发送它吗 要发布的服务

您可以在服务的
onCreate()
中请求部分wakelock,如下所示:

private PowerManager.WakeLock wakeLock;
@Override
public void onCreate() {
    super.onCreate();
    final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, PARTIAL_WAKE_LOCK_TAG);
    ...
}
@Override
public void onDestroy() {
    super.onDestroy();      
    if (wakeLock.isHeld()) {
        wakeLock.release();
    }
}
请记住在使用后或在onDestroy()中释放wakelock,如下所示:

private PowerManager.WakeLock wakeLock;
@Override
public void onCreate() {
    super.onCreate();
    final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, PARTIAL_WAKE_LOCK_TAG);
    ...
}
@Override
public void onDestroy() {
    super.onDestroy();      
    if (wakeLock.isHeld()) {
        wakeLock.release();
    }
}
谷歌建议避免使用wakelock,因为它会耗尽用户的电池电量。有几种API可用于各种用例。基于此,您可以考虑以下备选方案:

  • 如果应用程序正在执行长期运行的HTTP下载,请考虑使用DeWaldMeals/
  • <> LI>如果应用程序正在同步外部服务器的数据,请考虑创建一个同步适配器。
  • 如果您的应用程序需要定期执行后台任务,请考虑使用JoePayStor或Firebase JobDispatcher。供参考 在特定时间间隔触发任务时,请参见

因此,可以保证接收器的wakelock将与服务的
onCreate
方法重叠,以便设备不会进入睡眠状态?@rcell AFAIK,在接收器中请求wakelock不是强制性的。在ForegroundService内部使用它就足够了。