android - studio - Ocultar la notificación del servicio en primer plano mientras la actividad está visible
notificaciones en segundo plano android studio (2)
Puedes hacerlo así Un requisito previo para este método es que su actividad debe vincular el servicio.
Primero comienzas el servicio en primer plano.
private Notification mNotification;
public void onCreate() {
...
startForeground(1, mNotification);
}
Luego, en su actividad, vincula y desvincula el servicio como se muestra a continuación. BIND_ADJUST_WITH_ACTIVITY
es importante para mantener el servicio activo durante el tiempo en que está vinculado a la actividad visible.
public void onStart() {
...
Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
}
public void onStop() {
...
unbindService(mConnection);
}
Ahora aquí está el último pasado. Se detiene en primer plano, cuando al menos un cliente está conectado al servicio, y comienza a primer plano, cuando el último cliente se desconecta.
@Override
public void onRebind(Intent intent) {
stopForeground(true); // <- remove notification
}
@Override
public IBinder onBind(Intent intent) {
stopForeground(true); // <- remove notification
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
startForeground(1, mNotification); // <- show notification again
return true; // <- important to trigger future onRebind()
}
Al vincular un servicio, debes considerar las reglas aplicadas por Android. Si vincula un servicio no iniciado, el servicio no se iniciará automáticamente a menos que especifique el indicador BIND_AUTO_CREATE
además del indicador BIND_ADJUST_WITH_ACTIVITY
.
Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE
| BIND_ADJUST_WITH_ACTIVITY);
Si el servicio se inició con el indicador de creación automática activado y el último cliente se desvincula, el servicio se detendrá automáticamente. Si desea mantener el servicio en funcionamiento, debe iniciarlo con el método startService()
. Básicamente, su código se verá como el siguiente.
Intent intent = new Intent(this, PlayerService.class);
startService(intent);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
Llamar a startService()
para el servicio ya iniciado no tiene ningún efecto sobre él, ya que no onCommand()
método onCommand()
.
¿Es una forma de comenzar un servicio como un servicio en primer plano y ocultar la notificación mientras una actividad es visible?
Considere un reproductor de música, mientras se abre la aplicación, no necesita la notificación (es decir, los botones), pero siempre que el reproductor de música esté en segundo plano, se debe mostrar la notificación.
Lo sé, cómo hacerlo, si NO ejecuto mi servicio en primer plano ... Pero cuando se ejecuta en primer plano, el servicio en sí necesita la notificación y lo muestra y no puedo administrar la notificación por mi cuenta ...
¿Cómo puedo resolver ese problema?
Use los siguientes pasos:
1.Utilice ActivityManager para obtener el nombre del paquete actual (es decir, la Actividad que se ejecuta en la parte superior).
2.Compruebe si es su aplicación y luego no muestre las notificaciones
3.else Si no es su aplicación, muestre las notificaciones.
ActivityManager manager =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(1);
String topActivityName = tasks.get(0).topActivity.getPackageName();
if(!(topActivityName.equalsIgnoreCase("your package name"))){
//enter notification code here
}