设备可以在前台服务之前进入睡眠状态吗?

时间:2018-08-16 00:24:12

标签: android android-service wakelock

我知道以前我们需要使用WakefulBroadcastReceiver来确保接收方onReceive和服务onHandleIntent之间的设备不会重新进入睡眠状态。

现在Google似乎已弃用WakefulBroadcastReceiver,因为从接收者那里启动服务不再是“正确”。

我正在做的一件事是从高优先级FCM通知中启动前台服务。在新的后台执行规则下,这是完全有效的。但是,由于不推荐使用WakefulBroadcastReceiver,是否意味着startForegroundService可以保证设备在onReceiveonHandleIntent的唤醒锁之间保持足够长的唤醒时间?还是我应该在接收器中手动持有唤醒锁,然后将其发送到服务中才能释放?

1 个答案:

答案 0 :(得分:0)

  

这是否意味着startForegroundService保证设备保持状态   在onReceive和onHandleIntent的唤醒锁之间唤醒足够长的时间?

否。

  

或者我应该只在接收器中手动持有唤醒锁并发送它   服务发布?

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

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);
    ...
}

记住使用后或在onDestroy()中释放唤醒锁,如下所示:

@Override
public void onDestroy() {
    super.onDestroy();      
    if (wakeLock.isHeld()) {
        wakeLock.release();
    }
}

Google建议避免使用唤醒锁,因为它可能会耗尽用户的电池电量。有几种适用于各种用例的API。根据{{​​3}},您可以考虑以下替代方案:

  
      
  • 如果您的应用正在执行长时间运行的HTTP下载,请考虑使用DownloadManager。
  •   
  • 如果您的应用正在同步来自外部服务器的数据,请考虑创建同步适配器。
  •   
  • 如果您的应用需要定期执行后台任务,请考虑使用JobScheduler或Firebase JobDispatcher。有关信息   有关在特定时间间隔触发任务的信息,请参见documentation
  •   
相关问题