用于持续、频繁更新通知的最先进方法 ("notification widget")
State-of-the-art method for ongoing, frequently updating notifications ("notification widget")
我正在努力为经常更新(例如每 3 分钟)的通知找到当前最先进的方法。似乎在较新的 Android 版本中内置了如此多的能效调整(幸运的是!),以至于我之前成功使用的方法(使用 BroadcastReceiver
和 AlarmManager.setRepeating
)似乎并不可靠在我的新 phone (运行 Android 8) 上继续工作。在某些时候,通知将不再更新(例如,在屏幕关闭几分钟后)。
现在我偶然发现了许多不同的方法来解决这个问题,我在它们之间有点迷茫,例如:
- 使用
AlarmManager.setAndAllowWhileIdle
链而不是 setRepeating
- 使用
WakefulBroadcastReceiver
s(虽然已经再次弃用)
- 使用
IntentService
而不是 BroadcastReceiver
- 使用
JobIntentService
而不是 IntentService
- 使用
JobScheduler
而不是 AlarmManager
有没有人找到可靠的方法来频繁更新状态栏通知?对我来说,准确每 X 秒更新一次并不重要,它应该每隔几分钟发生一次,而不是在设备深度睡眠一段时间后随机中断。
我真的不明白为什么这个问题被否决了,因为在我看来,如果你偶然发现所有这些不同的方法,那么混淆是有正当理由的,如果有人分享了他或她的方法,那真的会节省我一些时间和我一起体验。
我知道这个问题很难回答,因为所有不同的制造商和手机,都包括不同类型的省电调整。但无论如何,这是我一段时间后想出的。在我的案例中,问题是在 Android 8+ 中,Google 强烈限制了为 BroadcastReceiver
s、IntentServices
等工作的授予可能性,以支持使用JobScheduler
。这使得必须使用 JobIntentService
,为 Android 8+ 提供所需的功能,并为 Android 版本 < 8.
提供向后兼容性
tl;博士:
- 有一个
JobIntentService
,你可以在onHandleWork
里面做什么
- 有一个
BroadcastReceiver
,在 onReceive()
中,您只需调用 JobIntentService
的 enqueueWork()
方法。
- 使用
JobIntentService#onHandleWork()
中的 AlarmManager
来安排(例如使用 setInexactRepeating()
)并取消 BroadcastReceiver
的 PendingIntent
广播。
我正在努力为经常更新(例如每 3 分钟)的通知找到当前最先进的方法。似乎在较新的 Android 版本中内置了如此多的能效调整(幸运的是!),以至于我之前成功使用的方法(使用 BroadcastReceiver
和 AlarmManager.setRepeating
)似乎并不可靠在我的新 phone (运行 Android 8) 上继续工作。在某些时候,通知将不再更新(例如,在屏幕关闭几分钟后)。
现在我偶然发现了许多不同的方法来解决这个问题,我在它们之间有点迷茫,例如:
- 使用
AlarmManager.setAndAllowWhileIdle
链而不是setRepeating
- 使用
WakefulBroadcastReceiver
s(虽然已经再次弃用) - 使用
IntentService
而不是BroadcastReceiver
- 使用
JobIntentService
而不是IntentService
- 使用
JobScheduler
而不是AlarmManager
有没有人找到可靠的方法来频繁更新状态栏通知?对我来说,准确每 X 秒更新一次并不重要,它应该每隔几分钟发生一次,而不是在设备深度睡眠一段时间后随机中断。
我真的不明白为什么这个问题被否决了,因为在我看来,如果你偶然发现所有这些不同的方法,那么混淆是有正当理由的,如果有人分享了他或她的方法,那真的会节省我一些时间和我一起体验。
我知道这个问题很难回答,因为所有不同的制造商和手机,都包括不同类型的省电调整。但无论如何,这是我一段时间后想出的。在我的案例中,问题是在 Android 8+ 中,Google 强烈限制了为 BroadcastReceiver
s、IntentServices
等工作的授予可能性,以支持使用JobScheduler
。这使得必须使用 JobIntentService
,为 Android 8+ 提供所需的功能,并为 Android 版本 < 8.
tl;博士:
- 有一个
JobIntentService
,你可以在onHandleWork
里面做什么
- 有一个
BroadcastReceiver
,在onReceive()
中,您只需调用JobIntentService
的enqueueWork()
方法。 - 使用
JobIntentService#onHandleWork()
中的AlarmManager
来安排(例如使用setInexactRepeating()
)并取消BroadcastReceiver
的PendingIntent
广播。