2011-02-19 12 views
6

En mi aplicación, en el método onCreate() de la actividad principal, estoy creando un bloqueo de activación para que la CPU siga funcionando si el teléfono se enciende standb/pantalla se apaga.Android: la aplicación no debe funcionar correctamente, la aplicación debe seguir ejecutándose en espera

También en el método onCreate intento crear un servicio que use el acelerómetro. Este servicio debe ejecutarse continuamente mientras la aplicación está abierta y monitorea los valores del acelerómetro (sé que esto no es bueno para la batería, pero necesito que lo haga). Aquí está mi código en este momento y el servicio comienza bien.

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

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

     if (appStart == true) 
     { 
      Intent AccelService = new Intent(this, Accelerometer.class); 
      AccelService.putExtra("unreg", false); 
      startService(AccelService); 
     } 
     appStart = false; 
    } 

Tengo el siguiente conjunto de permisos en mi manifiesta -

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

He intentado esto con diferentes cerraduras - luminosidad de la pantalla y el brillo completo en vano también. Mi salida en Logcat es aquí -

F/PowerManager(15628): android.util.Log$TerribleFailure: WakeLock finalized while still held: Howaya 
F/PowerManager(15628): at android.util.Log.wtf(Log.java:260) 
F/PowerManager(15628): at android.util.Log.wtf(Log.java:239) 
F/PowerManager(15628): at android.os.PowerManager$WakeLock.finalize(PowerManager.java:329) 
F/PowerManager(15628): at dalvik.system.NativeStart.run(Native Method) 

He visto a personas que dicen que wakelocks parciales no funcionan como deberían hacerlo, como en este enlace Google standby error page pero esto fue liberado y cerró el año pasado, así que no sé ese es el caso, alguien puede ayudar aquí por favor? Tengo un HTC Desire con respecto a ese último punto también, gracias.

Respuesta

2

En mi aplicación, en el método onCreate() de la actividad principal, estoy creando un bloqueo de activación para que la CPU siga funcionando si el teléfono se enciende o la pantalla se apaga.

Utilice android:keepScreenOn en uno de los widgets de su diseño. Eso es mucho, mucho más seguro para las actividades que lidiar manualmente con un WakeLock. Además, no necesita el permiso WAKE_LOCK, entonces, IIRC.

Mi salida en Logcat está aquí

Ese error es porque nunca se suelta el WakeLock. Por favor, no filtre WakeLocks.

Ahora, ha logrado escribir toda esta prosa e incluir todos estos listados, y ha olvidado una pequeña cosa: en realidad nos dice cuál es su pregunta. Este es un elemento bastante importante para un sitio de preguntas y respuestas como StackOverflow. Y, no, "¿alguien puede ayudar aquí por favor?" no cuenta como una pregunta cuando nunca defines qué "ayuda" es lo que estás buscando recibir.

+0

Bien, lo siento si no estaba claro y gracias por la respuesta. Mi pregunta era cómo puedo ejecutar un wakelock en mi teléfono para que mi aplicación se ejecute mientras la pantalla todavía está apagada, ya que el código que estoy usando no funciona. Preferiría no tener la pantalla encendida para que no desperdicie tanta batería y no tenga que usar el widget en caso de que decidiera ponerlo en el mercado (entonces otros usuarios tendrían que usar el widget) – bobby123

+1

@ bobby123 : Una actividad no puede tener una necesidad lógica de un 'WakeLock 'parcial. Un * servicio * podría tener la necesidad de un 'WakeLock' parcial, pero no una actividad, cuyo único propósito para existir es mostrar cosas en la pantalla. Así que, o saca tu 'WakeLock' de la actividad y entra al servicio (ajusta la lógica de tu negocio para que coincida), o usa' android: keepScreenOn'. Adquiera su 'WakeLock' en' onCreate() 'de su servicio y libérelo en' onDestroy() '. Use 'startForeground()' para que su servicio no se nuble y proporcione al usuario una manera fácil de acceder a una actividad para detener el servicio. – CommonsWare

+0

Eso es lo que quería saber, gracias. Moveré el bloqueo de activación al servicio ya que es para lo que realmente lo necesito. Tengo un botón de menú para que el usuario finalice el servicio en cualquier momento. Una última pregunta, por favor, ¿sabe si el método onSensorChanged() para el acelerómetro aún funciona bajo un bloqueo parcial de activación o sigue siendo un problema con Google? – bobby123

9

El problema se debe a que su objeto WakeLock es una variable de ámbito local dentro del método OnCreate. Después de que se ejecute el método - el objeto WakeLock ya no se referencia - por lo tanto, es elegible para la recolección de basura. Si se produce GC de Dalvik, el objeto está listo para finalizar, y el código interno del finalizador le advierte que WakeLock aún se mantiene activado y activo, pero se someterá a GC. Debe obtener un nuevo objeto WakeLock y asignarlo a un campo de tipo de clase WakeLock en su clase derivada de actividad. Lea sobre programación orientada a objetos y Garbage Collector: comprenderá el problema.

0

Como dijo @Michal P, usted adquiere un wakelock en el método onCreate, pero nunca lo suelta.

Cuando GC escanea este objeto de referencia cero, llame al método de finalización predeterminado, pero en realidad está activo.

@Override 
    protected void finalize() throws Throwable { 
     synchronized (mToken) { 
      if (mHeld) { 
       Log.wtf(TAG, "WakeLock finalized while still held: " + mTag); 
       Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0); 
       try { 
        mService.releaseWakeLock(mToken, 0); 
       } catch (RemoteException e) { 
       } 
      } 
     } 
    } 
Cuestiones relacionadas