Servicio con cola de prioridad en Android

Me gustaría implementar un IntentService ( código fuente ) que maneja intentos basados ​​en una simple prioridad numérica. Los intentos con mayor prioridad deben ser procesados ​​primero por el servicio que los intentos con menor prioridad.

¿Hay algo en Android que haga esto ya? Si no, ¿hay indicaciones sobre cómo implementarlo?

Un primer intento de implementación de un servicio de intenciones con prioridades, basado en la respuesta de IntentService y el código fuente de IntentService de Android. Se probará ampliamente y editar en consecuencia.

 public abstract class PriorityIntentService extends Service { private final class QueueItem implements Comparable<QueueItem> { Intent intent; int priority; int startId; @Override public int compareTo(QueueItem another) { if (this.priority < another.priority) { return -1; } else if (this.priority > another.priority) { return 1; } else { return (this.startId < another.startId) ? -1 : 1; } } } private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { try { final QueueItem item = mQueue.take(); onHandleIntent(item.intent); if (mQueue.isEmpty()) { PriorityIntentService.this.stopSelf(); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static final String EXTRA_PRIORITY = "priority"; private String mName; private PriorityBlockingQueue<QueueItem> mQueue; private boolean mRedelivery; private volatile ServiceHandler mServiceHandler; private volatile Looper mServiceLooper; public PriorityIntentService(String name) { super(); mName = name; } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("PriorityIntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); mQueue = new PriorityBlockingQueue<QueueItem>(); } @Override public void onDestroy() { mServiceLooper.quit(); } protected abstract void onHandleIntent(Intent intent); @Override public void onStart(Intent intent, int startId) { final QueueItem item = new QueueItem(); item.intent = intent; item.startId = startId; final int priority = intent.getIntExtra(EXTRA_PRIORITY, 0); item.priority = priority; mQueue.add(item); mServiceHandler.sendEmptyMessage(0); } @Override public int onStartCommand(Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; } public void setIntentRedelivery(boolean enabled) { mRedelivery = enabled; } } 

Realmente no. Sin IntentService , no hay mucho para IntentService . Cocinar un PriorityIntentService respaldado por un PriorityBlockingQueue , en lugar de un Handler + Looper , no debe ser mucho más largo.

  • Cómo reiniciar el servicio después de que la aplicación sea eliminada de las tareas recientes
  • La llamada de servicio vuelve a la actividad en android
  • Adquisición de instancia del servicio de fondo
  • El servicio no se reinicia después de que "Clear Memory" + appWidget se bloquea
  • Servicio de Android: onBind (Intención) y onUnbind (Intención) se llama una sola vez
  • Recolector de datos de sensor de fondo en Android
  • ¿Cuál es la forma correcta de detener un servicio que se está ejecutando como primer plano
  • Icono de servicio persistente en la barra de notificaciones
  • Lanzar una excepción personalizada de un servicio a una actividad
  • No puedo encontrar la causa de mi accidente con este seguimiento de pila
  • La notificación de la barra de estado de Android lanza una nueva aplicación aunque esté en ejecución. ¿Cómo sincronizar la aplicación de lanzamiento desde el icono de la aplicación y la notificación de barra de estado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.