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;
}
};
¿Qué es "onEWCreate", es su error Manuscrito o mi poco conocimiento? – pengwang
oppps lo siento mostrar show onCreate - Esa es mi propia envoltura para informes de excepción. – siliconeagle
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