2012-08-15 5 views
11

Me gustaría crear una aplicación de Android con funciones de supervisión en tiempo real. Una función de supervisión es auditar el flujo de audio. La otra función es interactuar con un sensor periférico. Estas funciones de monitoreo pueden ser activadas por otros. Además, para ahorrar consumo de energía, la función de audio se ejecutará en modo de votación, es decir, dormirá durante un cierto período de tiempo y se activará durante un cierto período de tiempo.android monitoring apps

Estoy pensando en cómo diseñar la aplicación Android.

  • Ya sea para diseñar la función de audio como un servicio o una actividad? El problema es que si está diseñado como una actividad, la función de audio estará apagada si la pantalla se apaga después de un período de tiempo.

  • cómo diseñar la función de votación? Use un AlarmManager o un hilo interno con Timer?

Mi objetivo es ahorrar el mayor consumo de energía posible. Gracias.

+0

¿Qué es "audit the audio flow"? – CommonsWare

+0

usa AudioRecord para leer el flujo del buffer de audio y auditar el nivel de decibelios y hacer el registro. Gracias. – babysnow

Respuesta

1

Recomendaría seguir a

a) Use a Service. La actividad es una entidad efímera (funciona solo mientras está en la pantalla)

b) Realice el servicio en primer plano (lea esto: http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification). Esto disminuirá la probabilidad de que el sistema va a matar a su servicio

c) En el servicio, iniciar un hilo y hacer todo lo que necesita en el hilo.

d) Si desea ejecutar periódicamente, acaba de hacer Thread.sleep() en el hilo (hilo cuando duerme no consume ciclos de CPU).

I creen c) y d) es preferible a AlarmManager. Aquí hay una pieza de la documentación (http://developer.android.com/reference/android/app/AlarmManager.html): "Nota: El Administrador de alarmas está diseñado para casos en los que desea que su código de aplicación se ejecute en un entorno específico tiempo, incluso si su aplicación no se está ejecutando. Para las operaciones de temporización normales (tics, tiempos de espera, etc.) es más fácil y mucho más eficiente usar Handler ".

Debido a que su aplicación en ejecución que es mejor tener un poco de hilo se desplazan permanentemente y ejecutar algo en él. En general, Handler, HandlerThread, MessageQueue son solo clases de conveniencia para un manejo y programación de mensajes más complejos. Parece que su caso es bastante simple y el hilo habitual debería ser suficiente.

1

Concurrente con Víctor, que debe de utilizar un servicio, y el pin en la memoria llamando startForeground()

Sin embargo le sugiero que busque en la utilización del sistema integrado de Handler; coloque su funcionalidad en un Runnable y llame al mhandler.postDelayed(myRunnable, <some point in future>); esto permitirá que el framework de Android aproveche al máximo la administración de energía.

0

Eso es un servicio.

Y es posible que desee un poco de robustez adicional: el servicio se puede matar y NO se reinició más tarde, incluso siendo un servicio en primer plano. Eso detendrá su monitoreo.

Comience su servicio desde la interfaz de usuario. Si desea que el servicio sobreviva al reinicio del dispositivo, también puede iniciarlo desde un BroadcastReceiver para android.intent.action.BOOT_COMPLETED.

Cree un hilo en el servicio como se describe en otras respuestas aquí.

Además, use el Administrador de alarmas para reiniciar periódicamente su servicio. Múltiples llamadas a startService() son correctas. Si ya se está ejecutando, el servicio seguirá funcionando. Pero si el sistema lo olvidó, por ejemplo, después de una serie de condiciones de bajo recurso, se reiniciará ahora.

Programe esas alarmas de manera responsable: para ser un buen ciudadano, establezca la frecuencia absolutamente mínima. Después de todo, Android tenía algunas buenas razones para matar el servicio.

Con algunos servicios, es posible que se necesiten más pasos, pero en este caso este enfoque parece ser suficiente.