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 будет инициировано событие, связанное с размахом вашего уведомления.