Android - Implémenter les notifications à distance
Dans cette page, vous découvrirez comment les notifications sont gérées dans votre application et quelles sont toutes les options à votre disposition pour créer une excellente expérience de messagerie pour vos utilisateurs.
Notificare prend en charge plusieurs types de notifications interactives et exploitables qui seront traitées pour vous sans aucun développement supplémentaire. Si vous souhaitez empêcher ce comportement par défaut, veuillez noter que vous devrez soit gérer toutes les fonctionnalités vous-même (enregistrement des métriques, présentation de l'interface utilisateur ou collecte des réponses), ou si vous ne le faites pas, vous comprenez que certaines fonctionnalités ne fonctionneront pas comme annoncé. .
Demander l'autorisation
Depuis Android 13, l’autorisation de notification n’est pas accordée par défaut et doit être demandée. Nous avons recommandé de cibler Android 13 pour avoir plus de contrôle sur la demande.
Lorsqu’ils exécutent Android 13 et ciblent Android 12 ou une version antérieure, les utilisateurs seront invités à fournir l’autorisation lors de la création du canal de notification. Généralement, au démarrage de l'application.
Bien que les demandes d'autorisation doivent suivre une norme recommandée, le contrôle de l'expérience globale est quelque chose de propre à chaque application. Cependant, vous pouvez utiliser le code suivant comme source d'inspiration pour votre implémentation.
- Kotlin
- Java
class MainActivity : AppCompatActivity() {
private val notificationsPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
if (!granted) {
// User denied notifications permissions
return@registerForActivityResult
}
// You can enable remote notifications
lifecycleScope.launch {
try {
Notificare.push().enableRemoteNotifications()
} catch (e: Exception) {
// ...
}
}
}
private fun onEnableRemoteNotificationsClicked() {
// Ensure we have sufficient permissions
if (!ensureNotificationsPermission()) return
// We have sufficient permissions to enable remote notifications
lifecycleScope.launch {
try {
Notificare.push().enableRemoteNotifications()
} catch (e: Exception) {
// ...
}
}
}
private fun ensureNotificationsPermission(): Boolean {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return true
val permission = android.Manifest.permission.POST_NOTIFICATIONS
val granted = ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
if (granted) return true
if (shouldShowRequestPermissionRationale(permission)) {
AlertDialog.Builder(this)
.setTitle(R.string.app_name)
.setMessage(R.string.notifications_permission_rationale)
.setPositiveButton(android.R.string.ok) { _, _ ->
notificationsPermissionLauncher.launch(permission)
}
.show()
return false
}
notificationsPermissionLauncher.launch(permission)
return false
}
}
public class MainActivity extends AppCompatActivity {
private final ActivityResultLauncher<String> notificationsPermissionLauncher = registerForActivityResult(
new ActivityResultContracts.RequestPermission(), granted -> {
if (!granted) {
// User denied notifications permissions
return;
}
// You can enable remote notifications
NotificarePushCompat.enableRemoteNotifications(new NotificareCallback<Unit>() {
@Override
public void onSuccess(Unit result) {
}
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
);
private void onEnableRemoteNotificationsClicked() {
// Ensure we have sufficient permissions
if (!ensureNotificationsPermission()) return;
// We have sufficient permissions to enable remote notifications
NotificarePushCompat.enableRemoteNotifications(new NotificareCallback<Unit>() {
@Override
public void onSuccess(Unit result) {
}
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
private boolean ensureNotificationsPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return true;
String permission = android.Manifest.permission.POST_NOTIFICATIONS;
boolean granted = ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
if (granted) return true;
if (shouldShowRequestPermissionRationale(permission)) {
new AlertDialog.Builder(this)
.setTitle(R.string.app_name)
.setMessage(R.string.notifications_permission_rationale)
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
notificationsPermissionLauncher.launch(permission);
})
.show();
return false;
}
notificationsPermissionLauncher.launch(permission);
return false;
}
}
Activer les notifications
Pour permettre à l'appareil de recevoir des notifications, il vous suffit d'invoquer une seule méthode.
- Kotlin
- Java
// Check if the user has previously enabled remote notifications.
Notificare.push().hasRemoteNotificationsEnabled
NotificarePushCompat.enableRemoteNotifications(new NotificareCallback<Unit>() {
@Override
public void onSuccess(Unit result) {
}
@Override
public void onFailure(@NonNull Exception e) {
}
});
En règle générale, l'étape ci-dessus est effectuée lors d'une certaine forme d'intégration des utilisateurs. Lorsque l'utilisateur a déjà suivi ce flux, nous activons automatiquement les notifications au lancement de Notificare.
Vous pouvez également vérifier si l'utilisateur s'est inscrit aux notifications à distance.
- Kotlin
- Java
// Check if the user has previously enabled remote notifications.
Notificare.push().hasRemoteNotificationsEnabled
// Check if the user has previously enabled remote notifications.
NotificarePushCompat.getHasRemoteNotificationsEnabled();
De plus, vous pouvez vérifier si l'utilisateur a désactivé les notifications dans les paramètres système.
- Kotlin
- Java
Notificare.push().allowedUI
NotificarePushCompat.getAllowedUI();
Si vous souhaitez également donner accès à la vue des paramètres de votre application à partir des paramètres de notification dans les paramètres de l'appareil, vous pouvez écouter l'intention NOTIFICATION_PREFERENCES. Cela ajoutera un lien vers votre activité dans les paramètres de l'appareil.
<activity android:name=".SettingsActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.NOTIFICATION_PREFERENCES" />
</intent-filter>
</activity>
Désactiver les notifications à distance
La désactivation des notifications à distance peut être réalisée de la même manière que leur activation.
- Kotlin
- Java
Notificare.push().disableRemoteNotifications()
NotificarePushCompat.disableRemoteNotifications(new NotificareCallback<Unit>() {
@Override
public void onSuccess(Unit result) {
}
@Override
public void onFailure(@NonNull Exception e) {
}
});
Lorsque cette méthode est appelée, nous enregistrerons automatiquement votre appareil pour ne jamais recevoir de notifications à distance, même si vous conserverez toujours le même profil utilisateur, les mêmes messages de boîte de réception et profiterez de tous les autres services pris en charge par votre forfait. Vous pouvez à tout moment demander une réinscription aux notifications push si vous le souhaitez.
Recevoir des notifications
En raison des changements apportés à Android 12 en matière de gestion des notifications, votre activité doit devenir le trampoline. . En supposant que vous laissez votre MainActivity
recevoir les intentions de notification, vous devez déclarer le intent-filter
suivant dans votre AndroidManifest.xml
.
<activity android:name=".MainActivity" android:launchMode="singleTask">
<intent-filter>
<action android:name="re.notifica.intent.action.RemoteMessageOpened" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Vous devez configurer l'activité recevant ces intentions avec android:launchMode="singleTask"
pour éviter de la recréer plusieurs fois lors du traitement de la série d'intentions déclenchées lors de l'ouverture d'une notification depuis le tiroir de notifications. Vous pouvez également utiliser android:launchMode="singleTop"
, mais sachez que le système d'exploitation le recréera lors du traitement des liens profonds déclenchés par NotificationActivity
. Pour plus d'informations sur les modes de lancement, reportez-vous à la documentation Android.
De plus, afin de traiter ces intentions, vous devez en prendre soin dans votre MainActivity
comme indiqué ci-dessous.
- Kotlin
- Java
override fun onCreate(savedInstanceState: Bundle?) {
// more code ...
if (intent != null) handleIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
// more code ...
if (intent != null) handleIntent(intent)
}
private fun handleIntent(intent: Intent) {
if (Notificare.push().handleTrampolineIntent(intent)) {
Log.d(TAG, "Trampoline intent handled.")
return
}
// more code ...
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
// more code ...
if (getIntent() != null) handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
// more code ...
if (intent != null) handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (NotificarePushCompat.handleTrampolineIntent(intent)) {
Log.d(TAG, "Trampoline intent handled.");
return;
}
// more code ...
}
Écouter les notifications reçues
Une fois que vous recevez des notifications dans votre application, nous pouvons approfondir et comprendre pleinement comment elles sont traitées. Notre bibliothèque se charge de placer une notification dans le centre de notifications afin que les développeurs n'aient besoin d'aucune action pour afficher les notifications. Si vous souhaitez être averti des notifications entrantes dans votre propre Intent Receiver, par exemple pour ajouter un badge à l'icône de votre lanceur d'application, vous pouvez utiliser NotificarePushIntentReceiver
.
Commencez par créer une sous-classe de ce Intent Receiver et en remplaçant la méthode onNotificationReceived()
.
- Kotlin
- Java
class CustomPushIntentReceiver: NotificarePushIntentReceiver() {
override fun onNotificationReceived(
context: Context,
notification: NotificareNotification,
deliveryMechanism: NotificareNotificationDeliveryMechanism
) {
// more code ...
}
}
public class CustomPushIntentReceiver extends NotificarePushIntentReceiver {
@Override
protected void onNotificationReceived(
@NonNull Context context,
@NonNull NotificareNotification notification,
@NonNull NotificareNotificationDeliveryMechanism deliveryMechanism
) {
// more code ...
}
}
Afin de recevoir ces intentions dans votre intent receiver, vous devez informer Notificare de votre classe.
- Kotlin
- Java
Notificare.push().intentReceiver = CustomPushIntentReceiver::class.java
NotificarePushCompat.setIntentReceiver(CustomPushIntentReceiver.class);
Enfin, déclarez votre récepteur d'intention personnalisé dans votre AndroidManifest.xml
.
<receiver
android:name=".CustomPushIntentReceiver"
android:exported="false" />
Présenter les notifications
Une notification peut être ouverte en appuyant soit sur la notification elle-même, soit en appuyant sur une action dans la notification. Nous émettrons une intention dans chaque cas vers une Activity
qui déclare les intent-filters
appropriés. Pour recevoir ces intentions, ajoutez ce qui suit à votre MainActivity
dans AndroidManifest.xml
.
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="re.notifica.intent.action.NotificationOpened" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="re.notifica.intent.action.ActionOpened" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Pour gérer les intentions ci-dessus, vous pouvez adopter l'approche gérée et utiliser notre module NotificarePushUI
qui prend en charge tous les événements et types d'interface utilisateur ainsi que les actions, ou vous pouvez les prendre entièrement en charge et les présenter comme vous le souhaitez. Cependant, soyez conscient si vous adoptez une approche non gérée, car vous devrez gérer tous les aspects et types de présentation des notifications, y compris les événements nécessaires pour montrer l'engagement de l'utilisateur dans notre tableau de bord.
Le code ci-dessous illustre comment cela fonctionne lors de l'utilisation de l'approche gérée.
- Kotlin
- Java
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// more code ...
if (intent != null) handleIntent(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// more code ...
if (intent != null) handleIntent(intent)
}
private fun handleIntent(intent: Intent) {
if (NotificarePushCompat.handleTrampolineIntent(intent)) return;
Notificare.push().parseNotificationOpenedIntent(intent)?.also { result ->
Notificare.pushUI().presentNotification(this, result.notification)
return
}
Notificare.push().parseNotificationActionOpenedIntent(intent)?.also { result ->
Notificare.pushUI().presentAction(this, result.notification, result.action)
return
}
// more code ...
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// more code ...
if (getIntent() != null) handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// more code ...
if (intent != null) handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (NotificarePushCompat.handleTrampolineIntent(intent)) return;
NotificareNotificationOpenedIntentResult notificationOpenedIntentResult = NotificarePushCompat.parseNotificationOpenedIntent(intent);
if (notificationOpenedIntentResult != null) {
NotificarePushUICompat.presentNotification(
this,
notificationOpenedIntentResult.getNotification()
);
}
NotificareNotificationActionOpenedIntentResult notificationActionOpenedIntentResult = NotificarePushCompat.parseNotificationActionOpenedIntent(intent);
if (notificationActionOpenedIntentResult != null) {
NotificarePushUICompat.presentAction(
this,
notificationActionOpenedIntentResult.getNotification(),
notificationActionOpenedIntentResult.getAction()
);
}
// more code ...
}
De plus, lorsque vous utilisez l’approche gérée, vous pouvez écouter les événements du cycle de vie des notifications et effectuer toutes les étapes supplémentaires dont vous pourriez avoir besoin. Laissez votre Activity
implémenter NotificarePushUI.NotificationLifecycleListener
et ajoutez les méthodes suivantes si nécessaire.
- Kotlin
- Java
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// more code ...
Notificare.pushUI().addLifecycleListener(this)
}
override fun onDestroy() {
super.onDestroy()
// more code ...
Notificare.pushUI().removeLifecycleListener(this)
}
override fun onNotificationWillPresent(notification: NotificareNotification) {
}
override fun onNotificationPresented(notification: NotificareNotification) {
}
override fun onNotificationFinishedPresenting(notification: NotificareNotification) {
}
override fun onNotificationFailedToPresent(notification: NotificareNotification) {
}
override fun onNotificationUrlClicked(notification: NotificareNotification, uri: Uri) {
}
override fun onActionWillExecute(notification: NotificareNotification, action: NotificareNotification.Action) {
}
override fun onActionExecuted(notification: NotificareNotification, action: NotificareNotification.Action) {
}
override fun onActionFailedToExecute(
notification: NotificareNotification,
action: NotificareNotification.Action,
error: Exception?
) {
}
override fun onCustomActionReceived(
notification: NotificareNotification,
action: NotificareNotification.Action,
uri: Uri,
) {
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// more code ...
NotificarePushUICompat.addLifecycleListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
// more code ...
NotificarePushUICompat.removeLifecycleListener(this);
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
}
@Override
public void onNotificationWillPresent(@NonNull NotificareNotification notification) {
}
@Override
public void onNotificationPresented(@NonNull NotificareNotification notification) {
}
@Override
public void onNotificationFinishedPresenting(@NonNull NotificareNotification notification) {
}
@Override
public void onNotificationFailedToPresent(@NonNull NotificareNotification notification) {
}
@Override
public void onNotificationUrlClicked(@NonNull NotificareNotification notification, @NonNull Uri uri) {
}
@Override
public void onActionWillExecute(@NonNull NotificareNotification notification, @NonNull NotificareNotification.Action action) {
}
@Override
public void onActionExecuted(@NonNull NotificareNotification notification, @NonNull NotificareNotification.Action action) {
}
@Override
public void onActionFailedToExecute(
@NonNull NotificareNotification notification,
@NonNull NotificareNotification.Action action,
@Nullable Exception error
) {
}
@Override
public void onCustomActionReceived(
@NonNull NotificareNotification notification,
@NonNull NotificareNotification.Action action,
@NonNull Uri uri
) {
}