BroadcastReceiver не реагирует на уведомления, созданные в GmcService

Использование Xamarin.Android.

У меня есть BroadcastReceiver:

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

Я использую Службу обмена сообщениями Google Cloud и создаю уведомление при получении какого-либо сообщения. Используя SetContentIntent построителя уведомлений, я экспортирую некоторые дополнительные функции в действие, которое будет работать с этим уведомлением, если пользователь откроет его. И это работает. Но когда я инициализирую свой конструктор уведомлений с помощью SetDeleteIntent внутри службы GCM, уведомление не вызывает OnReceive в BroadcastReceiver, если пользователь проведет пальцем, чтобы отклонить уведомление.

Когда я делаю все то же самое внутри своей деятельности (не внутри службы GCM), OnReceive срабатывает при каждом событии смахивания с уведомлением. Но это не работает внутри службы.

Я даже реализовал тот же метод CreateNotification в моей деятельности, что и в службе. Когда я звоню (чтобы создать уведомление) от моей деятельности - все работает отлично. Когда я вызываю его из службы, используя статический указатель на текущий экземпляр действия - MyActivity.CurrentInstance.CreateNotification(...) - мое уведомление не реагирует на событие, касающееся отклонения. Я даже пытался поместить код CreateNotification в RunOnUiThread - безрезультатно.

Таким образом, событие "Размах к уведомлению" срабатывает только в том случае, если это уведомление было создано в моей деятельности. Но я создаю уведомления, когда получаю сообщения от GCM. Он фактически создает уведомления, даже когда приложение не запущено.

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());
    //});
}

Любые идеи, как создать уведомление (внутри службы), которое сможет вызвать событие свайп-уволить?

1 ответ

Решение

событие уведомления о смахивании с уведомлением инициируется только в том случае, если это уведомление было создано в моей деятельности

Когда вы Когда вы используете SetDeleteIntent(deleteIntent) метод, убедитесь, что ваш deleteIntent инициализируется с помощью PendingIntent.GetBroadcast метод.

GetBroadcastet значит получить PendingIntent который будет выполнять трансляцию, как звонок Context.sendBroadcast(), Когда вы используете GetActivity метод, это означает, что получить PendingIntent это начнет новую деятельность. Вот почему ваше уведомление не срабатывает OnReceive в BroadcastReceiver, Для получения дополнительной информации вы можете прочитать этот документ.

Изменить ваш код:

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

Кому:

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

Затем в вашем сервисе GCM будет инициировано событие, связанное с размахом вашего уведомления.

Другие вопросы по тегам