Я создал онлайн-радио с часами для Android, в котором также есть встроенный музыкальный проигрыватель, работающий как служба переднего плана с уведомлением, и у него есть собственные пробуждающие блокировки, которые активируются при запуске службы и отключаются, когда пользователь нажимает кнопку «Стоп» и завершает службу.
Теперь я получаю предупреждение о зависании частичной блокировки для этого приложения в консоли разработчика Google. Получение этого предупреждения абсолютно правильно, потому что если кто-то продолжает слушать музыку в течение более длительного периода времени, то и вейклоки (wifi-manager и power-manager) будут удерживаться столько времени, сколько необходимо, чтобы музыка продолжала играть, когда экран выключен.
Приложение отлично работает и часами воспроизводится при выключенном экране и/или в режиме энергосбережения — именно так, как задумано.
Также: в Руководстве для разработчиков и рекомендациях говорится:
Если вы должны использовать частичные блокировки пробуждения, следуйте этим рекомендациям:
Убедитесь, что какая-то часть вашего приложения остается на переднем плане. Например, если вам нужно запустить службу, вместо этого запустите службу переднего плана. Это визуально указывает пользователю, что ваше приложение все еще работает.
Убедитесь, что логика получения и снятия блокировок слежения максимально проста. Когда ваша логика блокировки пробуждения привязана к сложным конечным машинам, тайм-аутам, пулам исполнителей и/или событиям обратного вызова, любая незаметная ошибка в этой логике может привести к тому, что блокировка пробуждения будет удерживаться дольше, чем ожидалось. Эти ошибки трудно диагностировать и устранять.
Думаю, я позаботился об этом.
Они говорят мне в консоли разработчика, где появляется предупреждение:
Имейте в виду, что для некоторых приложений требуются более длительные пробуждения для включения ключевых функций, таких как потоковая передача музыки.
В связи с этим я считаю, что все в порядке, но поскольку предупреждение о плохом поведении все еще отображается, я хотел бы получить совет.
Вопросы:
- Могу ли я сделать что-нибудь, чтобы не получать это предупреждение?
- Должен ли я опасаться наказания со стороны 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();
...