A partir del nivel de API 26 de Android, las notificaciones persistentes son necesarias para servicios en primer plano. Con este requisito, no podrás ocultar servicios que podrían imponer una demanda excesiva a los recursos del sistema, como en particular la batería. Este requisito crea un posible problema. Si una app con varios servicios en primer plano no administra cuidadosamente la notificación, que se comparta en todos los servicios, puede haber múltiples notificaciones que no se pueden descartar, lo que genera un desorden no deseado en la lista activa de notificaciones.
Este problema se vuelve más desafiante cuando usas SDKs como Navigation.
de aplicaciones que ejecutan servicios en primer plano independientes de la app que tiene su
propias notificaciones persistentes independientes, lo que dificulta su consolidación.
Para abordar estos problemas, el SDK de Navigation v1.11 introdujo una API simple para
ayudan a administrar notificaciones persistentes en toda la app, incluido el SDK.
Componentes
El administrador de servicios en primer plano proporciona un wrapper alrededor del primer plano de Android. la clase de servicio y la clase de notificación persistente. El elemento principal de este wrapper es aplicar la reutilización del ID de notificación para que la notificación que se comparten en todos los servicios en primer plano a través del administrador.
El SDK de Navigation contiene métodos estáticos para inicializar y obtener la
ForegroundServiceManager
singleton. Este singleton solo se puede inicializar
una vez durante la vida útil del SDK de Navigation. Por lo tanto, si usas
llamadas de inicialización (initForegroundServiceManagerMessageAndIntent()
o
initForegroundServiceManagerProvider()
), debes rodear
con un bloque try-catch en caso de que se vuelva a ingresar esa ruta. El SDK de Navigation
arroja una excepción de tiempo de ejecución si llamas a cualquiera de los métodos más de una vez, a menos que
Primero, borra todas las referencias a ForegroundServiceManager
y llama
clearForegroundServiceManager()
antes de cada llamada posterior.
Los cuatro parámetros de initForegroundServiceManagerMessageAndIntent()
son
application
, notificationId
, defaultMessage
y resumeIntent
. Si el botón
los tres parámetros finales son nulos, entonces la notificación es la
Notificación del SDK de Navigation. Aún es posible ocultar otros elementos en primer plano
en la app detrás de esta notificación. El parámetro notificationId
especifica el ID de notificación que se debe usar para la notificación. Si es
null, se usa un valor arbitrario. Puedes configurarlo de forma explícita para que evite
entra en conflicto con otras notificaciones, como las de otro SDK. El
defaultMessage
es una cadena que se muestra cuando el sistema no está
la navegación. El resumeIntent
es un intent que se activa cuando la notificación
se hace clic en él. Si resumeIntent
es nulo, hace clic en la notificación.
se ignoran.
Los tres parámetros de initForegroundServiceManagerProvider()
son
application
, notificationId
y notificationProvider
. Si el resultado
Si hay dos parámetros nulos, la notificación se usará para el SDK de Navigation estándar.
notificación. El parámetro notificationId
especifica el ID de notificación que
para la notificación. Si es nulo, entonces un valor arbitrario
que se usan. Puedes configurarlo de forma explícita para que evite conflictos con otros
como las de otro SDK. Si el notificationProvider
es
el proveedor, siempre es responsable
que genera la notificación que se renderizará.
El método getForegroundServiceManager()
del SDK de Navigation muestra el
singleton del administrador de servicios en primer plano. Si aún no lo has hecho,
equivale a llamar a initForegroundServiceManagerMessageAndIntent()
.
con parámetros nulos para notificationId
, defaultMessage
y
resumeIntent
ForegroundServiceManager
tiene tres métodos simples. Las dos primeras son para
mover un servicio hacia y desde el primer plano, y suelen llamarse desde
dentro del servicio que se creó. El uso de estos métodos garantiza que la
servicios están asociados con la notificación persistente compartida. La final
updateNotification()
, marca el administrador que tiene la notificación
y deberá volver a renderizarse.
Si necesitas el control total de la notificación persistente compartida,
la API proporciona una interfaz NotificationContentProvider
para definir un
proveedor de notificaciones, que contiene un único método para recibir una notificación
con el contenido actual. También proporciona una clase base, que puedes
usar de manera opcional para ayudar a definir el proveedor. Uno de los servicios principales
es que proporciona una manera de llamar a updateNotification()
sin las
necesitas acceder a ForegroundServiceManager
. Si usas una instancia del
proveedor de notificaciones para recibir notificaciones nuevas, puedes llamar a
método interno directamente para procesar el mensaje en la notificación.
situaciones de uso
En esta sección, se detallan las situaciones de uso notificaciones.
- Ocultar notificaciones persistentes de otros servicios en primer plano de la app
- La situación más fácil es preservar el comportamiento actual y solo usar
notificación persistente para renderizar la información del SDK de Navigation. Otros servicios
puede ocultarse detrás de esta notificación usando el administrador de servicios en primer plano
startForeground()
ystopForeground()
. - Ocultar notificaciones persistentes de otros servicios en primer plano de la app, pero establecer texto predeterminado que se muestra cuando no navegas
- La segunda situación más fácil es preservar el comportamiento actual y solo utilizar
la notificación persistente para renderizar información del SDK de Navigation, excepto
cuando el sistema no está navegando. Cuando el sistema no está navegando, el ícono
cadena proporcionada a
initForegroundServiceManagerMessageAndIntent()
en lugar de la cadena del SDK de Navigation predeterminada que menciona “Google Maps”. También puedes usar esta llamada para establecer el intent de reanudación se activa cuando se hace clic en la notificación. - Toma el control total de la renderización de la notificación persistente
- La situación final requiere definir y crear un proveedor de notificaciones
y pásala al archivo
ForegroundServiceManager
coninitForegroundServiceManagerProvider()
Esta opción te brinda control total de lo que se muestra en la notificación, pero también desconecta la información de notificaciones del SDK de Navigation del y, así, eliminar las útiles indicaciones paso a paso notificación. Google no proporciona un método sencillo para recuperar esto: información e insertarla en la notificación.
Ejemplo de proveedor de notificaciones
En el siguiente ejemplo de código, se muestra cómo crear y mostrar notificaciones con un proveedor de contenido de notificaciones simple.
public class NotificationContentProviderImpl
extends NotificationContentProviderBase
implements NotificationContentProvider {
private String channelId;
private Context context;
private String message;
/** Constructor */
public NotificationContentProviderImpl(Application application) {
super(application);
message = "-- uninitialized --";
channelId = null;
this.context = application;
}
/**
* Sets message to display in the notification. Calls updateNotification
* to display the message immediately.
*
* @param msg The message to display in the notification.
*/
public void setMessage(String msg) {
message = msg;
updateNotification();
}
/**
* Returns the notification as it should be rendered.
*/
@Override
public Notification getNotification() {
Notification notification;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
Spanned styledText = Html.fromHtml(message, FROM_HTML_MODE_LEGACY);
String channelId = getChannelId(context);
notification =
new Notification.Builder(context, channelId)
.setContentTitle("Notifications Demo")
.setStyle(new Notification.BigTextStyle()
.bigText(styledText))
.setSmallIcon(R.drawable.ic_navigation_white_24dp)
.setTicker("ticker text")
.build();
} else {
notification = new Notification.Builder(context)
.setContentTitle("Notification Demo")
.setContentText("testing non-O text")
.build();
}
return notification;
}
// Helper to set up a channel ID.
private String getChannelId(Context context) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
if (channelId == null) {
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel(
"default", "navigation", NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("For navigation persistent notification.");
notificationManager.createNotificationChannel(channel);
channelId = channel.getId();
}
return channelId;
} else {
return "";
}
}
}
Después de crear NotificationContentProviderImpl
, conecta el
hacia él con el siguiente código:
ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);
Advertencias y planes futuros
- Asegúrate de llamar a
initForegroundServiceManagerMessageAndIntent()
oinitForegroundServiceManagerProvider()
con anticipación para que el caso de uso esperado está bien definido. Debes llamar a este método. antes de crear un nuevo Navigator. - Asegúrate de detectar excepciones de llamadas
initForegroundServiceManagerMessageAndIntent()
oinitForegroundServiceManagerProvider()
en caso de que la ruta de aprendizaje del código sea se ingresó más de una vez. En la versión 2.0 del SDK de Navigation, llamar a este método varias veces arroja una excepción verificada en lugar de una excepción de tiempo de ejecución. - Es posible que Google aún tenga trabajo por hacer para lograr un estilo coherente en la la vida útil de la notificación que coincide con el estilo del encabezado.
- Cuando defines un proveedor de notificaciones, puedes controlar el comportamiento de atención con la prioridad.
- Google no proporciona un medio sencillo para recuperar instrucciones paso a paso información que un proveedor de notificaciones puede insertar en la notificación.