我已经为 Android 构建了一个在线时钟收音机,它还具有一个集成的音乐播放器,可以作为带有通知的前台服务,并且它有自己的唤醒锁 - 在服务启动时获取并在用户按下“停止”并完成服务时释放.
现在我收到关于在 Google Developer Console 中为这个应用程序挂起部分唤醒锁的警告。收到此警告是绝对正确的,因为如果有人继续听音乐的时间更长,那么唤醒锁(wifi-manager 和 power-manager)也会根据需要保持在屏幕上时保持音乐播放的时间。已关闭。
该应用程序可以完美运行,并且可以在屏幕关闭和/或处于省电模式时播放数小时 - 完全符合预期。
另外: 在开发人员指南和最佳实践中,他们指出:
如果您必须使用部分唤醒锁,请遵循以下建议:
确保您的应用程序的某些部分保留在前台。例如,如果您需要运行服务,请改为启动前台服务。这直观地向用户表明您的应用程序仍在运行。
确保获取和释放唤醒锁的逻辑尽可能简单。当您的唤醒锁逻辑与复杂的状态机、超时、执行程序池和/或回调事件相关联时,该逻辑中的任何细微错误都可能导致唤醒锁的持有时间比预期的要长。这些错误很难诊断和调试。
我想我已经解决了这个问题。
他们在开发控制台中告诉我警告出现的位置:
请记住,对于某些应用程序,需要更长的唤醒锁才能启用音乐流等关键功能。
因此,我相信一切都很好,但是由于仍然显示“不良行为”的警告,我想得到建议。
问题是:
- 我可以做些什么来避免收到此警告吗?
- 我是否必须担心 Google 会因为我的应用程序显示“不良行为”而受到 Google 的“惩罚”,尽管它运行正常?
流媒体服务(部分)代码:
@Override
public void onCreate() {
...
// WAKE LOCK && WIFI LOCK
powerManager = (PowerManager) getApplicationContext().getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();
wMgr = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiLock = wMgr.createWifiLock(WifiManager.WIFI_MODE_FULL, "MyWifiLock");
wifiLock.acquire();
...
// notification gets built
...
startForeground(ntfctnId, buildNotification(standardNoti));
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// player here...
...
@Override
public void onDestroy() {
...
// RELEASE WAKE LOCK && WIFI LOCK
wakeLock.release();
wifiLock.release();
...