Использование 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());
//});
}
Любые идеи о том, как создать уведомление (внутри службы), которое сможет инициировать событие «смахнуть для отклонения»?