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.
- Cómo comunicarse con HostApduService de una actividad
- Diseño en blanco - eglSurfaceAttrib no implementado
- ¿Cómo comprobar si la actividad actual tiene un diálogo delante?
- ¿Cómo obtener la actividad actual en la pantalla?
- Comprensión adicional setRetainInstance (true)
¿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?
- Creación de un archivo de encabezado para la clase de actividad de Android
- Cómo hacer que un método View invisible / Gone onBackPressed () en android
- Android: comprobando si la actividad se declara en Manifest en tiempo de ejecución
- Android: Consigue tiempo gastado por actividad
- Actividad como diálogo en android
- ¿Cómo puedo configurar la actividad del Lanzador mediante programación en android?
- ¿Cómo elegir Actividad o Fragmento si ambos escenarios son posibles?
- Reanudar una actividad cuando se hace clic en una notificación
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
- Uso de un servicio de Android para manejar una conexión de red
- ¿Qué debo usar para cargar datos usando Volley en Android?