2011-03-21 11 views
5

¿Cuál es la forma correcta de hacer un servicio en primer plano que luego puedo vincular? He seguido la demostración de Android API que incluye un ejemplo de cómo crear un servicio en primer plano. No hay ningún ejemplo sobre el servicio de inicio vinculado a él al mismo tiempo.Servicio de primer plano de Android que puede vincularse

Quiero ver un buen ejemplo de servicio de reproductor de música con actividad "ligada" a él.

¿Hay alguno?

quiero hacer algo como:

  • Cuando un programa es primero (primero significa que el servicio no se ha iniciado aún) comenzó Quiero empezar un servicio de primer plano, que haga todo el trabajo. La interfaz de usuario (actividad) es solo para controlar ese trabajo
  • Si el usuario presiona el botón de inicio, el servicio debe permanecer activo (y la notificación en la barra debe estar presente)
  • Ahora, si el usuario hace clic en notificación en la barra de notificaciones, la actividad debe comenzar y vincularse al servicio (o algo así, de la manera correcta) y el usuario toma el control del trabajo.
  • Si la actividad está activa y el usuario presiona el botón Atrás, la actividad se debe destruir y también se debe destruir el servicio.

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

Respuesta

-3

para llevar a cabo tareas por las que la única cosa que tengo que hacer era añadir siguiente propiedad a AndroidManifest.xml a mi actividad definición

android:launchMode="singleTop" 

Eso fue todo.

Saludos

10

antes de froyo había setForeground (verdadero) en el Servicio que era fácil, pero también fácil de abusar.

Ahora hay servicios startForeGround que requieren que se active una notificación (para que el usuario pueda ver que se está ejecutando un servicio de primer plano).

hice esta clase de controlarlo:

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 multimedia esta actualización de la notificación - tenga en cuenta el servicio de primer plano solamente se requiere, mientras que los medios de comunicación está jugando y se debe dejar encendido después de que se detenga, se 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 unión - que acaba de enlazar de manera normal en su actividad onStart que acaba de hacer una llamada bindService como se puede enlazar a cualquier servicio (que no importa el tiempo lo 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; 
    } 
}; 
+0

¿Qué es "onEWCreate", es su error Manuscrito o mi poco conocimiento? – pengwang

+0

oppps lo siento mostrar show onCreate - Esa es mi propia envoltura para informes de excepción. – siliconeagle

+0

He encontrado el mismo comportamiento extraño de la demo de API Demos. Si va a API Demos (API versión 7) y vaya a la aplicación -> Servicio -> Controlador de servicio local que toca Iniciar el servicio. Ahora la notificación en notif. la barra está funcionando. Ahora presione el botón INICIO y para notif. barra y presione en la notificación del servicio (Servicio local de muestra). ¡Ahora!Tienes que presionar el botón Atrás tres veces para regresar. ¿Por qué en el mundo? !!? – zmeda

Cuestiones relacionadas