Solución al problema de que la aplicación de Android no puede conectarse a Internet y reproducir audio cuando está en estado de suspensión
Uso de wakelocks
Al diseñar una aplicación que reproduce contenido multimedia en segundo plano, el dispositivo puede entrar en estado de suspensión mientras se ejecuta . Debido a que Android intenta conservar energía cuando el dispositivo está inactivo, el sistema intenta desactivar todas las funciones innecesarias del teléfono, incluida la CPU y el hardware Wi-Fi. Sin embargo, si su servicio reproduce o transmite música, debe evitar que su sistema interfiera con la reproducción.
Para garantizar que su servicio continúe ejecutándose en estas condiciones, debe utilizar wake locks. Un bloqueo de activación le indica al sistema que su aplicación está utilizando alguna funcionalidad que debería estar disponible incluso cuando el teléfono está inactivo.
NOTA: Siempre debes utilizar los wakelocks con precaución y activarlos solo cuando sea necesario, ya que pueden reducir significativamente la duración de la batería de tu dispositivo.
Para asegurarse de que la CPU no consuma energía mientras el reproductor multimedia se está reproduciendo, alterne entre "Reproducir" y "Activar".
Para garantizar que la CPU no se quede sin energía mientras reproduce MediaPlayer, llame al método setWakeMode() durante la inicialización. Una vez hecho esto, MediaPlayer permanecerá bloqueado en el estado especificado durante la reproducción y se liberará cuando la reproducción se pausa o se detiene:
mediaPlayer = new MediaPlayer(); // ... La inicialización adicional va aquí. .
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
Sin embargo, el bloqueo de activación obtenido en este ejemplo solo garantiza que la CPU permanezca activa. Si utiliza Wi-Fi y transmite contenido multimedia a través de la red, es posible que también necesite mantener un WifiLock, que debe adquirirse y liberarse manualmente. Entonces, cuando comiences a preparar un reproductor multimedia usando una URL remota, debes crear y obtener un bloqueo de WLAN. Por ejemplo:
WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE)).createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock ");
wifiLock.acquire();
p>Este bloqueo debe liberarse cuando pausas o detienes el contenido multimedia, o cuando ya no necesitas la red:
wifiLock.release();