Servicio de primer plano de Android que puede enlazarse

¿Cuál es la manera correcta de hacer el servicio de primer plano que más tarde pueda vincularlo? He seguido la demostración de API de Android que incluye un ejemplo de cómo crear servicio de primer plano. No hay ningún ejemplo sobre el servicio de inicio en bind to it al mismo tiempo.

Quiero ver un buen ejemplo de servicio de reproductor de música con la actividad "obligado" a ella.

¿Hay alguna?

Quiero hacer algo como:

  • Cuando un programa es el primero (primero significa que el servicio no se ha iniciado todavía) iniciado Quiero iniciar el servicio de primer plano que hacen todo el trabajo. Interfaz de usuario (actividad) es sólo para controlar ese trabajo
  • Si el usuario presiona el servicio de botones de inicio debe permanecer en funcionamiento (y la notificación en la barra debe estar presente)
  • Ahora, si el usuario hace clic en la notificación en la barra de notificación actividad debe iniciar y enlazar al servicio (o algo así, la forma correcta) y el usuario toma el control sobre el trabajo.
  • Si la actividad está activa y el usuario presiona la actividad del botón de volver a ser destruido y también el servicio debe ser destruido.

¿Qué métodos tengo que anular para realizar esta tarea? ¿Cuál es la forma de Android de hacer esto?

Antes froyo allí era setForeground (verdad) en el servicio que era fácil, pero también fácil abusar.

Ahora hay servicios startForeGround que requiere una notificación para ser activado (para que el usuario pueda ver que hay un foregroundservice en ejecución).

Hice esta clase para controlarla:

public class NotificationUpdater { public static void turnOnForeground(Service srv,int notifID,NotificationManager mNotificationManager,Notification notif) { try { Method m = Service.class.getMethod("startForeground", new Class[] {int.class, Notification.class}); m.invoke(srv, notifID, notif); } catch (Exception e) { srv.setForeground(true); mNotificationManager.notify(notifID, notif); } } public static void turnOffForeground(Service srv,int notifID,NotificationManager mNotificationManager) { try { Method m = Service.class.getMethod("stopForeground", new Class[] {boolean.class}); m.invoke(srv, true); } catch (Exception e) { srv.setForeground(false); mNotificationManager.cancel(notifID); } } } 

Entonces para mi reproductor de medios de esta actualización de la notificación – tenga en cuenta el servicio de primer plano sólo es necesario mientras el medio está jugando y debe dejarse encendido después de que se detenga, es una mala práctica.

 private void updateNotification(){ boolean playing = ((mFGPlayerBean.getState()==MediaPlayerWrapper.STATE_PLAYING) || (mBGPlayerBean.getState()==MediaPlayerWrapper.STATE_PLAYING)); if (playing) { Notification notification = getNotification(); NotificationUpdater.turnOnForeground(this,Globals.NOTIFICATION_ID_MP,mNotificationManager,notification); } else { NotificationUpdater.turnOffForeground(this,Globals.NOTIFICATION_ID_MP,mNotificationManager); } } 

Como para la vinculación – que acaba de enlazar de la manera normal en su actividad onStart que acaba de hacer una llamada bindService como lo haría a cualquier servicio (no importa el tiempo en primer plano o no)

 MediaPlayerService mpService=null; @Override protected void onEWCreate(Bundle savedInstanceState) { Intent intent = new Intent(this, MediaPlayerService.class); startService(intent); } @Override protected void onStart() { // assume startService has been called already if (mpService==null) { Intent intentBind = new Intent(this, MediaPlayerService.class); bindService(intentBind, mConnection, 0); } } private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mpService = ((MediaPlayerService.MediaBinder)service).getService(); } public void onServiceDisconnected(ComponentName className) { mpService = null; } }; 

Para lograr la tarea solicitada lo único que tengo que hacer es añadir la siguiente propiedad a AndroidManifest.xml a mi definición de actividad

 android:launchMode="singleTop" 

Eso fue todo.

Saludos

  • Actualización del fragmento de la actividad mediante Rxjava Android
  • Calendario de Android: el resultado de onActivityResult es siempre 0
  • No se puede resolver la actividad para el resultado
  • ¿Cómo detectar si regresó de la actividad infantil?
  • Android: Reutilizar el mismo objeto de vista en diferentes actividades (el caso se trata de banners publicitarios)
  • Android: hace que la actividad A espere a que la actividad B termine y devuelva algunos valores
  • Averigüe si la actividad actual será la raíz de la tarea eventualmente, después de que las actividades de acabado pendientes hayan desaparecido
  • Transmisión de datos de un fragmento en una actividad de otra actividad
  • Cómo llamar a startactivity para obtener resultados de una clase que no sea de actividad para obtener los resultados
  • Cómo hacer que el servicio Android se comunique con la actividad
  • System.exit (0) no cierra todas mis actividades?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.