El temporizador Android llega tarde cuando la pantalla del teléfono está bloqueada

Tengo un servicio que ejecuta un TimerTask en un método, que debe contar cada segundo y hacer algo después de algún tiempo. Mi servicio funciona correctamente y cuando inicie el método en servicio, el temporizador comienza a marcar cada segundo (1000 milisegundos). El problema es que, cuando la pantalla del dispositivo se apaga, mi temporizador se detiene a veces y no cuenta correctamente. Puedo ver en el archivo de registro que el temporizador se detiene durante 15 segundos, luego se ejecuta 5 segundos, luego se detiene de nuevo … Cuando el dispositivo está conectado a la computadora, temporizador siempre funciona normalmente, este problema se produce cuando desconecto el dispositivo de la computadora.

Aquí está mi servicio:

public class MyService extends Service { private String TAG = getClass().getName(); public void count() { Log.i(TAG, "Service Count Method Start"); int counter; Timer mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { Log.i(TAG, "Timer count value : " + counter); if (!someCondition) { counter++; if (DefaultApplication.notOnDisplayTime >= 180) { Log.d(TAG, "APPLICATION REACHED TIME LIMIT!"); someCondition = true; } else someCondition = false; } else { counter = 0; } } }, 0, 1000); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return mBinder; } public class MyServiceBinder extends Binder { public MyService getService() { return MyService.this; } } private final IBinder mBinder = new MyServiceBinder(); @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub Log.i(TAG, "MyService Unbound"); return super.onUnbind(intent); } } 

Y aquí está la salida logcat:

  04-25 14:35:22.951 I/com.mypackagename.MyService( 6745): Timer count value : 73 04-25 14:35:23.949 I/com.mypackagename.MyService( 6745): Timer count value : 74 04-25 14:35:24.019 D/dalvikvm( 6832): GC_FOR_MALLOC freed 6656 objects / 495856 bytes in 61ms 04-25 14:35:24.951 I/com.mypackagename.MyService( 6745): Timer count value : 75 04-25 14:35:25.951 I/com.mypackagename.MyService( 6745): Timer count value : 76 

#### La pantalla se bloquea aquí ####

  04-25 14:35:26.929 I/power ( 96): *** set_screen_state 0] 04-25 14:35:26.959 V/KeyguardViewMediator( 96): password timeout now 04-25 14:35:26.959 D/KeyguardViewManager( 96): show() 04-25 14:35:26.999 D/Sensors ( 96): close_akm, fd=138 04-25 14:35:26.999 I/com.mypackagename.MyService( 6745): Timer count value : 77 04-25 14:35:27.039 D/HtcLockScreen( 96): onScreenRestart 04-25 14:35:27.039 I/HtcLockScreen( 96): updateStatusViewByPriority, mIsSimCheckView = false, mIsBatteryInfo = false, mIsMusicPlaying = false, mIsAirPlaneMode = false 04-25 14:35:27.049 I/HtcLockScreen( 96): HtcLockScreen:onResume 04-25 14:35:27.069 D/SurfaceFlinger( 96): Layer::setBuffers(this=0x785580), pid=96, w=480, h=762 04-25 14:35:27.079 D/SurfaceFlinger( 96): Layer::setBuffers(this=0x785580), pid=96, w=480, h=762 04-25 14:35:27.109 D/SurfaceFlinger( 96): Layer::requestBuffer(this=0x785580), index=0, pid=96, w=480, h=762 success 04-25 14:35:27.339 D/alogcat ( 6832): stopping ... 04-25 14:35:27.339 D/alogcat ( 6832): paused 04-25 14:35:27.609 D/SurfaceFlinger( 96): About to give-up screen, flinger = 0xb4e28 04-25 14:35:27.669 D/AK8973 ( 72): Compass CLOSE 

#### Pantalla bloqueada ####

  04-25 14:35:27.949 I/com.mypackagename.MyService( 6745): Timer count value : 78 04-25 14:35:28.949 I/com.mypackagename.MyService( 6745): Timer count value : 79 04-25 14:35:44.602 I/com.mypackagename.MyService( 6745): Timer count value : 80 04-25 14:35:45.603 I/com.mypackagename.MyService( 6745): Timer count value : 81 04-25 14:35:45.784 I/wpa_supplicant( 256): CTRL-EVENT-SCAN-RESULTS Ready 04-25 14:35:45.799 D/LocationMasfClient( 96): getNetworkLocation(): Returning cache location with accuracy 75.0 04-25 14:35:46.603 I/com.mypackagename.MyService( 6745): Timer count value : 82 04-25 14:35:47.603 I/com.mypackagename.MyService( 6745): Timer count value : 83 04-25 14:35:48.604 I/com.mypackagename.MyService( 6745): Timer count value : 84 04-25 14:35:49.604 I/com.mypackagename.MyService( 6745): Timer count value : 85 04-25 14:36:10.558 D/SurfaceFlinger( 96): Layer::requestBuffer(this=0x785580), index=1, pid=96, w=480, h=762 success 04-25 14:36:11.033 I/com.mypackagename.MyService( 6745): Timer count value : 86 04-25 14:36:13.269 I/com.mypackagename.MyService( 6745): Timer count value : 87 04-25 14:36:13.289 D/com.mypackagename.utils.XUtil( 6745): return 0 char $ 04-25 14:36:14.039 D/com.mypackagename.utils.XUtil( 6745): return 0 char $ 04-25 14:36:14.269 I/com.mypackagename.MyService( 6745): Timer count value : 88 04-25 14:36:17.009 I/com.mypackagename.MyService( 6745): Timer count value : 89 04-25 14:36:29.512 I/com.mypackagename.MyService( 6745): Timer count value : 90 

Usted puede ver que después de la pantalla bloqueada, el temporizador no parece marcar cada segundo. Se detiene durante períodos de 15 a 20 segundos y luego funciona normalmente durante 5 segundos.

¿Alguna opinión acerca de cómo evitar que el temporizador se detenga cuando la pantalla del dispositivo está bloqueada?

Suena como si necesitara un bloqueo parental parcial Esto impedirá que la CPU entre en estado de suspensión cuando la pantalla está apagada. Tenga en cuenta, sin embargo, el mal uso puede causar problemas con la batería y necesita un permiso para usar bloqueos de despertar.

  • TimerTask vs Thread.sleep vs Handler postDelayed - más preciso para llamar a la función cada N milisegundos?
  • Obtención de metadatos de SHOUTcast utilizando IcyStreamMeta
  • Cómo ejecutar la tarea Async repetidamente después de intervalos de tiempo fijos
  • Android: haga una parte del código cada 5 segundos
  • Error de Android: "No se pudo crear la instancia de epoll" o "No se pudo crear el canal de despertador"
  • Android no puede crear el controlador dentro del subproceso que no ha llamado looper.prepare ()
  • ¿Dónde puedo crear y usar ScheduledThreadPoolExecutor, TimerTask o Handler?
  • Visibilidad de ImageView Error con temporizador
  • ¿Cuál es el mejor método para ejecutar una tarea repetidamente en android? (Ej .: - Actualización de puntajes, Actualización Ui)
  • Cómo determinar si la tarea del temporizador ha finalizado
  • Detener temporizador sin destruir y volver a crear - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.