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

Любые идеи о том, как создать уведомление (внутри службы), которое сможет инициировать событие «смахнуть для отклонения»?


person Vitaliy Hanych    schedule 06.08.2017    source источник


Ответы (1)


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

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

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

Измените свой код:

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

To :

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

Затем в вашей службе GCM будет запущено событие «прокрутить для закрытия» вашего уведомления.

person Eren Shen    schedule 08.08.2017
comment
Спасибо. GetBroadcast — отличное заклинание. Моя головная боль прошла благодаря вашей магии))) Но работает это только если я вызываю CreateNotification с помощью статического указателя на текущий экземпляр активности - MyActivity.CurrentInstance.CreateNotification(...). CreateNotification, объявленный в сервисе, не творит чудес. - person Vitaliy Hanych; 08.08.2017
comment
@Виталий Ганыч, удачного кодирования. :) - person Eren Shen; 08.08.2017
comment
Но есть ли способ заставить BroadcastReceiver реагировать на событие уведомления, которое я создаю в своей службе? Когда приложение не запущено, я не могу вызвать MyActivity.CurrentInstance.CreateNotification(). Поэтому я могу управлять событием пролистывания уведомления, только если приложение запущено. - person Vitaliy Hanych; 08.08.2017
comment
@ Виталий Ганыч, это немного сложно, вы можете опубликовать новый вопрос для лучшего ответа. :) - person Eren Shen; 08.08.2017
comment
В ПОРЯДКЕ. Спасибо за совет. - person Vitaliy Hanych; 08.08.2017