0

Utilisation de Xamarin.Android.BroadcastReceiver ne réagit pas aux notifications créées dans GmcService

J'ai un BroadcastReceiver:

public class MyBroadcastReceiver : BroadcastReceiver 
{ 
    public override void OnReceive(Context context, Intent intent) 
    { 
     try 
     { 
      string someExtra = intent.Extras.GetString("someExtra", string.Empty); 
     } 
     catch (Exception) 
     { 
     } 
    } 
} 

-je utiliser un service Google Cloud Messaging et créer une notification quand recevez un certain message. En utilisant SetContentIntent d'un générateur de notifications, j'exporte des extras à l'activité qui utilisera cette notification si l'utilisateur l'ouvre. Et il fonctionne. Mais lorsque j'initialise mon générateur de notification avec SetDeleteIntent dans le service GCM, la notification ne déclenche pas OnReceive dans le BroadcastReceiver si l'utilisateur balaye pour ignorer la notification.

Lorsque je fais tout de même dans mon activité (pas dans le service GCM) OnReceive est déclenché sur chaque événement de balayage vers la fin de la notification. Mais cela ne fonctionne pas à l'intérieur du service.

J'ai même implémenté la même méthode CreateNotification dans mon activité que dans le service. Quand je l'appelle (pour créer la notification) de mon activité - tout fonctionne parfaitement. Lorsque je l'appelle à partir du service à l'aide d'un pointeur statique vers l'instance actuelle de l'activité - MyActivity.CurrentInstance.CreateNotification (...) - ma notification ne réagit pas sur l'événement swipe-to-dismiss. J'ai même essayé de mettre le code de CreateNotification dans RunOnUiThread - aucun résultat. Par conséquent, l'événement swipe-to-dismiss de la notification est déclenché uniquement si cette notification a été créée dans mon activité. Mais je crée des notifications lorsque je reçois des messages de GCM. En fait, il crée des notifications même lorsque l'application n'est pas en cours d'exécution.

public void CreateNotification(........) { 
    //RunOnUiThread(() => { 
    var notificationBuilder = new Notification.Builder(this); 
    notificationBuilder.SetContentTitle(title); 
    notificationBuilder.SetContentText(description); 
    notificationBuilder.SetSmallIcon(Resource.Drawable.Icon); 

    var notificationIntent = new Intent(this, typeof(MainActivity)); 
     notificationIntent.PutExtra(.......) 
    var contentIntent = PendingIntent.GetActivity(Application.Context, 0, notificationIntent, PendingIntentFlags.CancelCurrent); 
    notificationBuilder.SetContentIntent(contentIntent); 

    // Actually my headache 
    const String NOTIFICATION_DELETED_ACTION = "NOTIFICATION_DELETED"; 
    var receiver = new MyBroadcastReceiver(); 
    RegisterReceiver(receiver, new IntentFilter(NOTIFICATION_DELETED_ACTION)); 
    Intent intent = new Intent(NOTIFICATION_DELETED_ACTION); 
     intent.PutExtra(.......) 
    var deleteIntent = PendingIntent.GetActivity(Application.Context, 0, intent, PendingIntentFlags.CancelCurrent); 
    notificationBuilder.SetDeleteIntent(deleteIntent); 

    var notificationManager = GetSystemService(Context.NotificationService) as NotificationManager; 
    notificationManager.Notify(1, notificationBuilder.Build()); 
    //}); 
} 

Toute idée comment créer une notification (à l'intérieur du service) qui sera en mesure de déclencher son événement swipe à rejeter?

Répondre

0

notification de la swipe à rejeter événement est déclenché uniquement en cas si cette notification a été créée dans mon activité

Lorsque vous Lorsque vous utilisez la méthode SetDeleteIntent(deleteIntent), assurez-vous que votre deleteIntent est initialisé en utilisant PendingIntent.GetBroadcast méthode.

GetBroadcastet signifie récupérer un PendingIntent qui effectuera une diffusion, comme l'appel Context.sendBroadcast(). Lorsque vous utilisez la méthode GetActivity, cela signifie récupérer un PendingIntent qui va démarrer une nouvelle activité. C'est la raison pour laquelle votre notification ne déclenche pas OnReceive dans le BroadcastReceiver. Pour plus d'informations, vous pouvez lire ceci document.

Modifier votre code:

var deleteIntent = PendingIntent.GetActivity(Application.Context, 0, intent, PendingIntentFlags.CancelCurrent); 

Pour:

var deleteIntent = PendingIntent.GetBroadcast(Application.Context, 0, intent, PendingIntentFlags.CancelCurrent); 

Ensuite, dans votre service de GCM, événement swipe à rejeter de votre notification sera déclenchée.

+0

Merci. GetBroadcast est un excellent sort. Mon mal de tête a disparu, grâce à votre magie))) Mais cela ne fonctionne que si j'appelle CreateNotification en utilisant un pointeur statique à l'instance actuelle de l'activité - MyActivity.CurrentInstance.CreateNotification (...). CreateNotification déclaré dans le service ne fait pas la magie. –

+0

@Vitaliy Hanych, codage heureux. :) –

+0

Mais existe-t-il un moyen de forcer BroadcastReceiver à réagir à l'événement de la notification que je crée dans mon service? Lorsque l'application n'est pas en cours d'exécution, je ne peux pas appeler MyActivity.CurrentInstance.CreateNotification(). Par conséquent, je peux gérer l'événement de balayage vers la fin de la notification uniquement si l'application est en cours d'exécution. –