Cómo iniciar una tarea de fondo de larga ejecución en el servicio de Android

Después de leer la mayor parte de la documentación disponible sobre los servicios de Android en el sitio de desarrolladores y aquí en stackoverflow, todavía estoy confundido por varios aspectos de la ejecución de un servicio en una tarea aparte. Espero que alguien me ponga en el camino correcto.

Digamos que tenemos un marco de servicios trival como

public class HliService extends Service { @Override public void onCreate() { } @Override public int onStartCommand(Intent intent, int flags, int startId) { // If we get killed, after returning from here, restart return START_STICKY; } @Override public IBinder onBind(Intent intent) { // We don't provide binding, so return null return null; } @Override public void onDestroy() { } } 

Y en el manifiesto, tengo

 <service android:name=".HliService" android:process=":HLI_Comms"/> 

De modo que el servicio se ejecuta en su propio hilo.

La intención del servicio es proporcionar una tarea de fondo que se comunicará con un dispositivo utilizando un socket TCP y hacer otras cosas. Con el riesgo de ignorar los problemas de la batería, etc, básicamente me gustaría que funcione para siempre.

Algo como

 // Method that communicates using a TCP socket, and needs to send // information back to the activity and receive messages from activity // not shown here. private void dummytask() { boolean keepGoing = true; while (keepGoing) { // do useful stuff in here // sets keepGoing false at some point } stopSelf(); } 

¿Cuál es la mejor manera de iniciar este método / tarea?

He mirado el código en el sitio de desarrollo que utiliza un manejador de mensajes y un looper, que sólo parcialmente entender, pero parece muy complicado y tal vez más de lo que necesito?

No creo que pueda llamar a este método de onCreate() o onStartCommand() ya que entonces ni se completaría cuando se invoca desde el sistema? ¿Debo iniciarlo con un temporizador o alarma?

Necesitaré agregar un manejador de mensajes para comunicarme con la actividad de gui, pero como estoy iniciando el servicio en otro hilo (en virtud de la instrucción de "proceso" de manifiesto), ¿necesito usar AIDL en su lugar?

También he mirado el uso de AysnchTask en lugar de extender el servicio, pero parece más adecuado para ejecutar una tarea y luego terminar.

Para que el servicio se ejecute en su propio hilo.

Eso pone el servicio en su propio proceso . Esto es generalmente algo que debe evitarse, ya que consume RAM adicional y CPU (para IPC). Usted puede crear un hilo creando un Thread o cualquier número de otros medios, la mayoría de los cuales han estado en Java durante una década o así.

Con el riesgo de ignorar los problemas de la batería, etc, básicamente me gustaría que funcione para siempre.

Es prácticamente imposible que un servicio funcione para siempre. Los usuarios o el sistema operativo se deshará de su servicio con el tiempo.

¿Cuál es la mejor manera de iniciar este método / tarea?

Llame a dummytask() desde un subproceso de fondo.

¿Necesito utilizar AIDL en su lugar?

No. Su servicio puede transmitir un Intent o invocar un PendingIntent suministrado por la actividad, o enviar un Message través de un Messenger suministrado por la actividad, etc. Lo mejor sería usar LocalBroadcastManager desde el paquete de soporte de Android, pero no Trabaje a través de los límites del proceso, forzándolo en opciones de comunicaciones más costosas.

Creo que podría utilizar un IntentService que se ejecuta mediante la creación de una alarma (regular) (AlarmManager.setRepeating) con un PendingIntent en ella. Puede notificar a la interfaz de usuario transmitiendo una Intención desde IntentService y recibiéndola en su interfaz de usuario a través de BroadcastReceiver.

  • Lanzar una excepción personalizada de un servicio a una actividad
  • El mejor enfoque para ejecutar el servicio en Android
  • ¿Es posible utilizar la herencia en las interfaces AIDL?
  • Conexión a un servicio web desde android - AsyncTask o Service?
  • En servicio de facturación de aplicaciones que se mueren a veces
  • Servicio de Android - URL de ping
  • Android detecta el estado táctil desde cualquier aplicación
  • Si un servicio vinculado o hilos personalizados cuando descarga algo?
  • Cómo pasar valor de cadena de servicio a la actividad en android?
  • cómo abrir la configuración de accesibilidad de mi aplicación directamente?
  • Android: mantener el servicio en ejecución cuando se mata la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.