À partir du niveau d'API Android 26, des notifications persistantes sont requises pour services de premier plan. Cette exigence vise à vous empêcher de masquer les services susceptibles d'imposer des exigences excessives aux ressources système, y compris en particulier la batterie. Cette exigence crée un problème potentiel: si une application avec plusieurs services de premier plan ne gère pas soigneusement la notification qu'il est partagé entre tous les services, il peut y avoir plusieurs instances des notifications impossibles à ignorer, ce qui crée un encombrement indésirable dans la liste active les notifications.
Ce problème devient plus complexe lorsque vous utilisez des SDK tels que le composant Navigation
qui exécutent des services de premier plan indépendamment de l'application
les propres notifications persistantes indépendantes, ce qui les rend difficiles à regrouper.
Pour résoudre ces problèmes, le SDK Navigation v1.11 a introduit une API simple pour
permettent de gérer les notifications persistantes dans l'application, y compris dans le SDK.
Composants
Le gestionnaire de services de premier plan fournit un wrapper autour du premier plan Android et la classe de notification persistante. L'instance principale de ce wrapper consiste à forcer la réutilisation de l'ID de notification pour que la notification soit partagé entre tous les services de premier plan à l'aide du gestionnaire.
Le SDK Navigation contient des méthodes statiques pour initialiser et obtenir
Singleton ForegroundServiceManager
. Ce singleton ne peut être initialisé
qu'une seule fois dans la vie du SDK Navigation. Par conséquent, si vous utilisez l'un des
les appels d'initialisation (initForegroundServiceManagerMessageAndIntent()
ou
initForegroundServiceManagerProvider()
), vous devez entourer
avec un bloc try-catch
au cas où ce chemin serait à nouveau entré. SDK Navigation
génère une exception d'exécution si vous appelez l'une ou l'autre méthode plusieurs fois, sauf si vous
Effacez d'abord toutes les références à ForegroundServiceManager
, puis appelez
clearForegroundServiceManager()
avant chaque appel suivant.
Les quatre paramètres de initForegroundServiceManagerMessageAndIntent()
sont les suivants :
application
, notificationId
, defaultMessage
et resumeIntent
. Si le
si les trois derniers paramètres sont nuls, la notification
Notification du SDK Navigation. Il est toujours possible de masquer d'autres éléments de premier plan
dans l'application derrière cette notification. Le paramètre notificationId
spécifie l'ID de notification à utiliser pour la notification. Si c'est le cas
Null, une valeur arbitraire est utilisée. Vous pouvez le définir explicitement pour contourner
entre en conflit avec d'autres notifications, comme celles d'un autre SDK. La
defaultMessage
est une chaîne qui s'affiche lorsque le système n'est pas
la navigation. resumeIntent
est un intent qui est déclenché lorsque la notification
sur laquelle l'utilisateur clique. Si resumeIntent
a une valeur nulle, l'utilisateur clique sur la notification.
sont ignorés.
Les trois paramètres de initForegroundServiceManagerProvider()
sont les suivants :
application
, notificationId
et notificationProvider
. Si le dernier
deux paramètres ont une valeur nulle, la notification provient du SDK Navigation standard
. Le paramètre notificationId
spécifie l'ID de notification
doit être utilisé pour la notification. Si elle est nulle, une valeur arbitraire est
utilisé. Vous pouvez le définir explicitement pour éviter les conflits avec d'autres
des notifications, comme celles d'un autre SDK. Si notificationProvider
est
le fournisseur est toujours responsable
générer la notification à afficher.
La méthode getForegroundServiceManager()
du SDK Navigation renvoie
singleton du gestionnaire de services
de premier plan. Si vous n'en avez pas encore généré,
cela équivaut à appeler initForegroundServiceManagerMessageAndIntent()
avec des paramètres nuls pour notificationId
, defaultMessage
et
resumeIntent
ForegroundServiceManager
propose trois méthodes simples. Les deux premières
sont pour
un service au premier plan ou en dehors. Elles sont généralement appelées
dans le service qui a été créé. L'utilisation de ces méthodes garantit que
sont associés à la notification persistante partagée. Le dernier
La méthode updateNotification()
indique au gestionnaire que la notification a
modifié et doit être affiché de nouveau.
Si vous avez besoin d'un contrôle total sur la notification persistante partagée,
l'API fournit une interface NotificationContentProvider
permettant de définir
fournisseur de notifications, qui contient une seule méthode pour recevoir une notification
avec le contenu actuel. Il fournit également une classe de base, que vous pouvez
utiliser éventuellement pour aider
à définir le fournisseur. L'une des principales classes de base
est qu'elle permet d'appeler updateNotification()
sans utiliser
besoin d'accéder à ForegroundServiceManager
. Si vous utilisez une instance
fournisseur de notifications pour recevoir les nouveaux messages, appelez ceci
interne directement pour afficher le message dans la notification.
Scénarios d'utilisation
Cette section détaille les scénarios d'utilisation des disques persistants partagés les notifications.
- Masquer les notifications persistantes des autres services de premier plan d'applications
- Le scénario le plus simple consiste à conserver le comportement actuel et à n'utiliser
notification persistante pour afficher les informations du SDK Navigation. Autres services
peuvent se cacher derrière cette notification à l'aide du gestionnaire de services de premier plan
startForeground()
etstopForeground()
. - Masquer les notifications persistantes des autres services de premier plan de l'application, mais définir texte par défaut affiché en l'absence de navigation
- Le deuxième scénario le plus simple consiste à préserver le comportement actuel et à n'utiliser
la notification persistante permettant d'afficher les informations du SDK Navigation,
lorsque le système ne navigue pas. Lorsque le système n'est pas en cours de navigation,
chaîne fournie à
initForegroundServiceManagerMessageAndIntent()
s'affiche à la place de la chaîne du SDK Navigation par défaut qui mentionne "Google Maps". Vous pouvez également utiliser cet appel pour définir l'intent de reprise se déclenche lorsque l'utilisateur clique sur la notification. - Prendre le contrôle total du rendu de la notification persistante
- Le dernier scénario nécessite de définir et de créer un fournisseur de notifications
et le transmettre à
ForegroundServiceManager
en utilisantinitForegroundServiceManagerProvider()
Cette option vous offre un contrôle total de ce qui est affiché dans la notification, mais aussi déconnecte les informations de notification du SDK Navigation et supprimez ainsi les instructions de navigation détaillées utiles affichées dans . Google ne propose pas de moyen simple pour récupérer ces informations et les insérer dans la notification.
Exemple de fournisseur de notifications
L'exemple de code suivant montre comment créer et renvoyer des notifications à l'aide d'un simple fournisseur de contenu de notification.
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 "";
}
}
}
Après avoir créé NotificationContentProviderImpl
, connectez
SDK Navigation pour y accéder à l'aide du code suivant:
ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);
Mises en garde et projets futurs
- Veillez à appeler le
initForegroundServiceManagerMessageAndIntent()
ou leinitForegroundServiceManagerProvider()
avant l'heure le scénario d'utilisation prévu est bien défini. Vous devez appeler cette méthode avant de créer un navigateur. - Veillez à détecter les exceptions des appels à
initForegroundServiceManagerMessageAndIntent()
ouinitForegroundServiceManagerProvider()
si le chemin de code est saisi plusieurs fois. Dans le SDK Navigation v2.0, appeler cette méthode génère plusieurs fois une exception cochée plutôt qu'une exception d'exécution. - Google a peut-être encore du travail pour obtenir un style cohérent durée de vie de la notification correspondant au style de l'en-tête.
- Lorsque vous définissez un fournisseur de notifications, vous pouvez contrôler le comportement des notifications prioritaires avec la priorité.
- Google ne propose pas de moyen simple pour obtenir des instructions de navigation détaillées d'informations qu'un fournisseur de notifications peut insérer dans la notification.