Problema con Wake Lock

79 views
Skip to first unread message

Leandro Garcia

unread,
Apr 11, 2015, 3:10:12 AM4/11/15
to desarrollad...@googlegroups.com
Buenas a todos. Tengo un problema que llevo varios días volviendome loco sin encontrar una solución. Llevo muy poco como programador en Android y creo que por eso no logro solucionarlo.
Estoy haciendo una aplicación que es una agenda, donde yo agrego un evento para determinado día a determinada hora, y me avisa mediante una notificación. Todo el programa está puesto en un Servicio. El código funcionaba muy bien hasta que descubrí que cuando apagaba la pantalla, si bien el servicio no se destruía, se ponía en pausa. Investigué y descubrí que se solucionaba usando el Wake Lock, para que el sistema no ponga en pausa mi aplicación cuando se encuentra en Sleep. Puse el permiso android.permission.WAKE_LOCK en el Manifest, y en el onCreate del servicio puse este código:

PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "KS");
wl
.acquire();


Para probar que funcionara, puse esto:

public void onCreate() {
       
super.onCreate();

       
PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
       
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "KS");
        wl
.acquire();

       
final Handler handlerTmr = new Handler();
        timer
= new Timer();
       
TimerTask doAsync = new TimerTask()
       
{
           
@Override
           
public void run() {
                handlerTmr
.post(new Runnable() {
                   
public void run() {
                       
new Async().execute();
                   
}
               
});
           
}
       
};
        timer
.schedule(doAsync, 2000, 10000);
   
}


Utilicé una AsyncTask porque debo realizar una conexión con un Web Service, así que para probarlo lo dejé igual y solo reemplazé el código por uno de prueba.

private class Async extends AsyncTask<Void, Void, Boolean> {

       
@Override
       
protected Boolean doInBackground(Void... params) {
            Vibrator vibrate = (Vibrator) getSystemService(VIBRATOR_SERVICE);
            vibrate
.vibrate(1000);
           
return true;
       
}

       
@Override
       
protected void onPostExecute(Boolean fin) {
       
}
   
}

Cuando lo probé y apagué la pantalla, parecía que funcionaba bien, el dispositivo vibrara cada 10 segundos a pesar del Sleep. Al cabo de 30 segundos ya no vibró mas, el servicio se sigue suspendiendo supongo.


Realmente ya no se que hacer, busqué bastante y no pude encontrar nada que me ayude, agradecería que alguien que sepa me de una mano para saber que es lo que estoy haciendo mal. Muchas gracias.

Gabriel Pozo

unread,
Apr 11, 2015, 9:22:24 AM4/11/15
to desarrollad...@googlegroups.com
Primero, y antes que nada, para saber si se ejecuta o no algo, no deberías hacer que vibre el dispositivo, deberías usar logs ;)
http://www.aprendiendodeandroidymas.com/2013/08/como-veo-el-log-de-android-en-la.html
http://www.aprendiendodeandroidymas.com/2013/11/como-puedo-usar-el-logcat-para-ayudarme.html

Ahora estas seguro que el service se pone en sleep? Y si colocas algunos log en el mismo y ves que sucede?
Viste el ciclo de vida de un service?
http://developer.android.com/guide/components/services.html

Porque dices que tenes que utilizar wake lock?
Podría ver esto también http://stackoverflow.com/a/8713795/1748764 ;)


--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/16b8f7b3-319e-490a-aec9-fe5d59ce4be6%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Leandro Garcia

unread,
Apr 11, 2015, 7:05:56 PM4/11/15
to desarrollad...@googlegroups.com
Gracias por responder Gabriel. Si, se usar los logs, pero no me sirve para nada ya que tengo que desconectar el dispositivo de la computadora. Mientras se está cargando, no se suspende nada, el problema viene cuando deja de cargar y apago la pantalla, así que no puedo averiguarlo poniendo logs.
Y sobre lo último que me pasaste, intenté usar el servicio de alarma, pero el intervalo mínimo que tiene es cada 15 minutos, yo necesito que el código se ejecute una vez por minuto. Estuve averiguando sobre el WakefulBroadcastReceiver, pero no se bien como funciona y me parece que no me sirve para lo que yo quiero hacer.

Gabriel Pozo

unread,
Apr 11, 2015, 7:27:55 PM4/11/15
to desarrollad...@googlegroups.com

Dudo que para probar tu app tengas que desconectarlo, seguramente hay alguna opción en el modo depuración o en la conexión USB. De todas maneras podrías crear un archivo en el que vas escribiendo la salida del log ;)
Yo  e creado de esa, forma aplicaciones donde el service maneja la comunicación de la aplicación siempre en segundo plano sin problemas ;)
Seguramente el SO esta matando tu service, debes usar los ;)
Sino como sabes que es lo que le esta pasando a tu aplicación? Viste el ciclo de vida del service, fíjate que no es igual al de un activity. Como levantas el services? Haces un bind con en activity o lo levantas en un proceso separado?

Tenés que mostrarnos la salida del log y el código donde levantas el services ;)


El sáb., 11 de abril de 2015 20:06, Leandro Garcia <lea...@hotmail.com> escribió:
Gracias por responder Gabriel. Si, se usar los logs, pero no me sirve para nada ya que tengo que desconectar el dispositivo de la computadora. Mientras se está cargando, no se suspende nada, el problema viene cuando deja de cargar y apago la pantalla, así que no puedo averiguarlo poniendo logs.
Y sobre lo último que me pasaste, intenté usar el servicio de alarma, pero el intervalo mínimo que tiene es cada 15 minutos, yo necesito que el código se ejecute una vez por minuto. Estuve averiguando sobre el WakefulBroadcastReceiver, pero no se bien como funciona y me parece que no me sirve para lo que yo quiero hacer.

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Gabriel Pozo

unread,
Apr 11, 2015, 7:29:09 PM4/11/15
to desarrollad...@googlegroups.com

P.D: el wake lock, te sería de utilidad para por ejemplo un vídeo juego, porque? Que hace realmente?

Leandro Garcia

unread,
Apr 11, 2015, 8:42:50 PM4/11/15
to desarrollad...@googlegroups.com
Mi celular no es muy bueno, y no veo la necesidad de revisar los logs ya que se exactamente que es lo que está pasando, no hay errores, simplemente el servicio se pone "en pausa", prendo la pantalla, vibra, apago la pantalla, no vibra más, es entendible lo que sucede. El launcher es el MainActivity, y en el onCreate tiene este código:

startService(new Intent(this, Servicio.class));

Y el servicio arranca. Yo creo que el WakeLock es lo que necesito, según lo que leí es para que siga procesando mi servicio aún con el teléfono en modo Sleep, y es precisamente lo que necesito pero no se por qué no funciona.

Gabriel Pozo

unread,
Apr 12, 2015, 12:37:56 PM4/12/15
to desarrollad...@googlegroups.com
Sigo sin entender como puedes desarrollar "adivinando cosas" sin utilizar el log ;)

En cuanto a saber como levantabas el servicio, para eso se necesita ver todo el código, manifest, clase que estiende de service, etc, etc. No trozos de código ;) Si no estamos "adivinando", y de eso no se trata lo que es relacionado a la programación  (por eso no me gusta cuando se habla de "magia" en algunos lenguajes de programación :D)
Mira esto:
http://stackoverflow.com/questions/4083756/android-service-process-vs-not
A eso me refería, si levantabas el services en otro proceso ;)
En un caso extremo (aclaro que no digo que esto sea buena práctica) si el OS quiere matar a tu services, antes de que esto suceda, podrías volver a levantarlo con el Alarm Manager, más que todo esto no necesitas, enumeremos opciones para mantener un services corriendo:

1 - lo que comentas del wake lock https://developer.android.com/training/scheduling/wakelock.html#cpu (como ahí dice, eso te va a servir si queres que el service termine de realizar una tarea sin importar el estado de tu device, no es completamente útil para una tarea eterna ;) )
2 - Levantar el services en un proceso separado ;)
3 - Usar el Alarm Maganager, para asegurarte de que el services permanezca levantado

Para finalizar, hacer vibrar el dispositivo o por ejemplo utilizar toast, para saber si algo funciona o no, no es una buena práctica.
Siempre utiliza logs, como sabes si alguna otra cosa no falla cuando el dispositivo esta desconectado? Vibra una o dos veces, código morse? :D (es broma ;))
Arme una app donde utilizábamos la posición del GPS, y para los últimos test (para hacerlo lo más real posible) salíamos a dar algunas vueltas con el device. Es bastante sencillo armar un archivo donde simplemente se escriban las salidas de error del log, o algunas salidas del log que creas de utilidad ;)

Saludos
 

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Leandro Garcia

unread,
Apr 12, 2015, 4:24:59 PM4/12/15
to desarrollad...@googlegroups.com
A ver, no estoy adivinando, se que no está fallando porque ya revisé los logs, ya probé la aplicación usando logs y no hay ningún error, lo único que necesitaba era saber si se seguia ejecutando o no con el dispositivo desconectado, y para eso la vibración es más que suficiente, no es que testeo todos mis proyectos así, solo que en este caso en específico esa fue la mejor idea que tuve y resultó bien para probar. No me digas más que revise los logs porque no hay ningún tipo de excepción en la ejecución del código, solo se suspende sin más y vuelve si prendo la pantalla. Y el código lo pasé entero.. pasé el servicio y el main donde levanto el servicio, es todo lo que hay. Te lo paso entero por si no entendiste los otros:

public class KService extends Service {

   
@Override

   
public void onCreate() {
       
super.onCreate();
       
PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
       
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "KS");
        wl
.acquire();
       
final Handler handlerTmr = new Handler();

       
Timer timer = new Timer();

       
TimerTask doAsync = new TimerTask()
       
{
           
@Override
           
public void run() {
                handlerTmr
.post(new Runnable() {
                   
public void run() {
                       
new Async().execute();
                   
}
               
});
           
}
       
};

        timer
.schedule(doAsync, 1000, 10000);
   
}

   
@Override
   
public int onStartCommand(Intent intent, int flags, int startId) {
       
return START_STICKY;
   
}

   
@Override
   
public IBinder onBind(Intent intent) {
       
throw new UnsupportedOperationException("Not yet implemented");
   
}

   
@Override
   
public void onDestroy() {

   
}

   
private class Async extends AsyncTask<Void, Void, Boolean> {
       
@Override
       
protected Boolean doInBackground(Void... params) {
           
Vibrator vibrate = (Vibrator) getSystemService(VIBRATOR_SERVICE);

            vibrate
.vibrate(500);

           
return true;
       
}

       
@Override
       
protected void onPostExecute(Boolean fin) {
       
}
   
}
}

public class MainActivity extends ActionBarActivity {
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView
(R.layout.activity_main);
        startService
(new Intent(this, KService.class));
   
}

   
@Override
   
public boolean onCreateOptionsMenu(Menu menu) {
       
// Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater
().inflate(R.menu.menu_main, menu);
       
return true;
   
}

   
@Override
   
public boolean onOptionsItemSelected(MenuItem item) {
       
// Handle action bar item clicks here. The action bar will
       
// automatically handle clicks on the Home/Up button, so long
       
// as you specify a parent activity in AndroidManifest.xml.
       
int id = item.getItemId();

       
//noinspection SimplifiableIfStatement
       
if (id == R.id.action_settings) {
           
return true;
       
}
   
}
}


Lo que me dijiste del AlarmManager y ejecutar en un proceso aparte quizás me pueda servir, voy a ver que puedo hacer con eso. Gracias.
Reply all
Reply to author
Forward
Message has been deleted
0 new messages