Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Wake se bloquea servicio androide recurrente

Tengo esta aplicación que necesita para ejecutar un servicio (fondo) que emite sonidos periódicos. El teléfono debe sonar todo el día durante 5 segundos cada minuto (utiliza un manejador en el servicio). He implementado este servicio que hace esto perfectamente, pero cuando el teléfono entra en el modo de suspensión profunda, las paradas de ejecución de este controlador se detiene. Utilizando esta respuesta de la pregunta en SO, me las arreglé para usar bloqueos de estela y funciona bien. Pero cuando explícitamente poner el teléfono en modo de suspensión profunda, el controlador deja de ejecutar. ¿Dónde puedo colocar el wakelock en el servicio. Haga clic en el fragmento de código a continuación.

public class PlaySound extends Service{ PowerManager.WakeLock wl ; PowerManager pm; private SoundManager mSoundManager; boolean wakeUpFlag = false; @Override public void onCreate(){ super.onCreate(); mSoundManager = new SoundManager(); mSoundManager.initSounds(getBaseContext()); mSoundManager.addSound(1, R.raw.sound); } @Override public int onStartCommand(Intent intent, int flags, int startId) { startservice(); return START_STICKY; } private void startservice() { System.out.println("Started the service"); timer.scheduleAtFixedRate( new TimerTask() { public void run() { toastHandler.sendEmptyMessage(0); } }, 0, 60000); } private final Handler toastHandler = new Handler() { @Override public void handleMessage(Message msg) { result =start(); System.out.println("result"+result); close(); } }; protected void close() { try { if(wakeUpFlag){ wl.release(); System.out.println("Released the wakelock"); } if(!pm.isScreenOn()){ System.out.println("Screen is off - back to sleep"); pm.goToSleep(1000); } else{ System.out.println("Screen is on - no need to sleep"); } bs.close(); writer.close(); System.out.println("Closed socket and writer"); System.out.println("Size of file:"+f.length()/1024); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } public void start(){ try{ wakeUpFlag = false; pm = (PowerManager)getSystemService(Context.POWER_SERVICE); if(!pm.isScreenOn()) { wakeUpFlag = true; wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"CollectData"); System.out.println("Screen off - wake lock acquired"); wl.acquire(); } else{ System.out.println("Screen on - no need of wake lock"); } } catch(Exception e){ e.printStackTrace(); } mSoundManager.playSound(1); } 

  • ¿Cuándo Android parará su cpu sin el bloqueo de la estela?
  • ¿Cómo despertar android y mostrar la actividad?
  • AlarmManager no siempre ejecuta BroadcastReceiver
  • ¿Cómo desactiva Android Wear cuando está en modo de suspensión?
  • ¿El sistema operativo Android libera un wakelock si la aplicación o el servicio que lo contiene se destruye?
  • ¿Es posible tener varias cerraduras de la estela?
  • Uso de WakeLock para mantener una reproducción en secuencia
  • Desarrollar la aplicación de alarma
  • 3 Solutions collect form web for “Wake se bloquea servicio androide recurrente”

    Sigue el patrón que Mark Murphy proporciona con WakefulIntentService . Yo sugeriría recoger sus libros, no sólo para la explicación detallada de esta clase y el ejemplo que incluye en uno de ellos, sino para la otra riqueza de información que encontrará en ellos.

    Acabo de implementar recientemente este patrón para mi aplicación principal y esta clase funciona como un encanto.

    No creo que esté utilizando la bandera correcta accorinding a la documentación de Android fior PowerManager :

    * Si mantiene un wakelock parcial, la CPU continuará funcionando, independientemente de los temporizadores e incluso después de que el usuario presione el botón de encendido. En todos los demás wakelocks, la CPU se ejecutará, pero el usuario todavía puede poner el dispositivo para dormir con el botón de encendido.

    En otras palabras, trate de utilizar PARTIAL_WAKE_LOCK ya que éste es el único que garantiza que la CPU se ejecute

    Creo que sería mejor usar android.app.AlarmManager para programar una alarma de despertador. Tenga cuidado sin embargo – usted no desea hacer ningún trabajo de largo funcionamiento en su método de onReceive () como eso se llama normalmente en el hilo principal, y ahorcará su actividad. Usted todavía tendrá que adquirir el wakelock durante la duración de su tarea para evitar que el teléfono de dormir a medio camino.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.