我知道以前我们需要使用WakefulBroadcastReceiver
来确保接收方onReceive
和服务onHandleIntent
之间的设备不会重新进入睡眠状态。
现在Google似乎已弃用WakefulBroadcastReceiver
,因为从接收者那里启动服务不再是“正确”。
我正在做的一件事是从高优先级FCM通知中启动前台服务。在新的后台执行规则下,这是完全有效的。但是,由于不推荐使用WakefulBroadcastReceiver
,是否意味着startForegroundService
可以保证设备在onReceive
和onHandleIntent
的唤醒锁之间保持足够长的唤醒时间?还是我应该在接收器中手动持有唤醒锁,然后将其发送到服务中才能释放?
答案 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