当前位置: 首页 > 知识库问答 >
问题:

Android中的通知点击(Xamarin表单)

罗安和
2023-03-14
public void Show(string title, string body, int id, DateTime notifyTime)
{
    var intent = CreateIntent(id);

    var localNotification = new LocalNotification();
    localNotification.Title = title;
    localNotification.Body = body;
    localNotification.Id = id;
    localNotification.NotifyTime = notifyTime;
    if (NotificationIconId != 0)
    {
        localNotification.IconId = NotificationIconId;
    }
    else
    {
        localNotification.IconId = Resource.Drawable.Icon24;
    }

    var serializedNotification = SerializeNotification(localNotification);
    intent.PutExtra(ScheduledAlarmHandler.LocalNotificationKey, serializedNotification);

    var pendingIntent = PendingIntent.GetBroadcast(Application.Context, 0, intent, PendingIntentFlags.CancelCurrent);
    var triggerTime = NotifyTimeInMilliseconds(localNotification.NotifyTime);
    var alarmManager = GetAlarmManager();

    alarmManager.Set(AlarmType.RtcWakeup, triggerTime, pendingIntent);
}
 [BroadcastReceiver(Enabled = true)]
public class ScheduledAlarmHandler : BroadcastReceiver
{
...........
public override void OnReceive(Context context, Intent intent)
{
    var extra = intent.GetStringExtra(LocalNotificationKey);
    var notification = DeserializeNotification(extra);

    var builder = new NotificationCompat.Builder(Application.Context)
        .SetContentTitle(notification.Title)
        .SetContentText(notification.Body)
        .SetSmallIcon(notification.IconId)
        .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))
        .SetAutoCancel(true);

    var resultIntent = LocalNotificationsService.GetLauncherActivity();
    resultIntent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);
    var stackBuilder = Android.Support.V4.App.TaskStackBuilder.Create(Application.Context);
    stackBuilder.AddNextIntent(resultIntent);
    var resultPendingIntent =
        stackBuilder.GetPendingIntent(0, (int)PendingIntentFlags.UpdateCurrent);
    builder.SetContentIntent(resultPendingIntent);

    var notificationManager = NotificationManagerCompat.From(Application.Context);
    notificationManager.Notify(notification.Id, builder.Build());
}
....
}
[Activity (Icon = "@drawable/icon", 
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,      LaunchMode.SingleTop)]

共有1个答案

荣曾笑
2023-03-14

对我来说是工作:

这是我的主要活动:

[Activity (Icon = "@drawable/icon", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,      LaunchMode.SingleTop)]
[IntentFilter(new[] { "test.test.alarm" }, Categories = new[] { Intent.CategoryDefault })]

这是LocalNotificationsService

    public class LocalNotificationsService 
    {
     .....
    public void Show(string title, string body, int id, DateTime notifyTime)
    {
        var intent = CreateIntent(id);

        var localNotification = new LocalNotification();
        localNotification.Title = title;
        localNotification.Body = body;
        localNotification.Id = id;
        localNotification.NotifyTime = notifyTime;
        if (NotificationIconId != 0)
        {
            localNotification.IconId = NotificationIconId;
        }
        else
        {
            localNotification.IconId = Resource.Drawable.Icon24;
        }

        var serializedNotification = SerializeNotification(localNotification);
        intent.PutExtra(ScheduledAlarmHandler.LocalNotificationKey, serializedNotification);

        var pendingIntent = PendingIntent.GetBroadcast(Application.Context, 0, intent, PendingIntentFlags.CancelCurrent);
        var triggerTime = NotifyTimeInMilliseconds(localNotification.NotifyTime);
        var alarmManager = GetAlarmManager();

        alarmManager.Set(AlarmType.RtcWakeup, triggerTime, pendingIntent);
    }

     public static PendingIntent GetDialogPendingIntent()
     { 
        return PendingIntent.GetActivity(
            Forms.Context,
            0, 
            new Intent("test.test.alarm")
                .AddFlags(ActivityFlags.NewTask),
            0);
     }

     private AlarmManager GetAlarmManager()
     {
        var alarmManager = Application.Context.GetSystemService(Context.AlarmService) as AlarmManager;
        return alarmManager;
     }

    }
[BroadcastReceiver(Enabled = true, Label = "Local Notifications Plugin Broadcast Receiver")]
public class ScheduledAlarmHandler : BroadcastReceiver
{

    public const string LocalNotificationKey = "LocalNotification";


    public override void OnReceive(Context context, Intent intent)
    {
        var extra = intent.GetStringExtra(LocalNotificationKey);
        var notification = DeserializeNotification(extra);
        var currPath = AppSettings.Data.NotificationSoundUri;

        var uri = string.IsNullOrEmpty(currPath) ? RingtoneManager.GetDefaultUri(RingtoneType.Alarm) : Uri.Parse(currPath);
        var builder = new NotificationCompat.Builder(Application.Context)
            .SetContentTitle(notification.Title)
            .SetContentText(notification.Body)
            .SetSmallIcon(notification.IconId)
            .SetSound(uri)
            .SetAutoCancel(true);


        var resultPendingIntent = LocalNotificationsService.GetDialogPendingIntent();
        builder.SetContentIntent(resultPendingIntent);

        var notificationManager = NotificationManagerCompat.From(Application.Context);
        notificationManager.Notify(notification.Id, builder.Build());
    }

    private LocalNotification DeserializeNotification(string notificationString)
    {
        var xmlSerializer = new XmlSerializer(typeof(LocalNotification));
        using (var stringReader = new StringReader(notificationString))
        {
            var notification = (LocalNotification)xmlSerializer.Deserialize(stringReader);
            return notification;
        }
    }
}
 类似资料:
  • 我已经为我的Xamarin.Forms UWP应用程序实现了一个推送通知功能,我可以接收通知,然后弹出一个祝酒词。我正在使用下面的代码。 当用户单击/轻击通知时,我想从我的PCL项目中打开一个特定的页面,并将这个变量作为参数传递。我怎么能这么做?如有任何帮助,我们将不胜感激。

  • 我得到以下异常: Java.Lang.IllegalStateException:指定的子项已具有父项。您必须在孩子的父拳上调用 removeVeiw()。 运行以下代码块时。这一切都从我的表单页面开始,只需按一下按钮,即可使用警报管理器生成计划通知。问题是,如果单击通知,则如果应用仍处于活动状态,则会引发上述异常。 如果我在手机上切换应用程序,然后单击通知,它会按预期将应用程序恢复而不会崩溃。

  • 本文向大家介绍关于Android中点击通知栏的通知启动Activity问题解决,包括了关于Android中点击通知栏的通知启动Activity问题解决的使用技巧和注意事项,需要的朋友参考一下 前言 最近遇到一个很奇葩的问题,终于解决了,所以想着记录一下,方便大家或者自己以后有需要的时候可以参考学习。 问题场景 用小米手机使用小米推送一条消息,然后点击通知栏中的消息启动应用,然后进入会话的Activ

  • 我想在记录器服务运行时显示通知。用户应该能够在通知中直接暂停或停止记录器。所以我在通知中添加了两个按钮,并实现了一个BroadcastReceiver来处理按钮点击。 它几乎像我想要的那样工作,但有一个问题我无法解决。当用户单击按钮时,我想显示活动。这是我的代码: 目前执行每个按钮的正确操作,但如果用户单击时应用程序不可见,则不显示该应用程序。如何实现这一点? 有必要在这里实现BroadcastR

  • 我有一个使用Xamarin.Forms的应用程序,针对IOS,Android和WP 8。 我的应用中需要推送通知功能。 我看过<code>pushsharp</code>演示,它似乎很有前途。但我看到的所有代码都是针对每个平台分别编写的。 我希望这件事能在法庭上进行。Forms项目,在App.cs中的某个地方,这样我就不需要重复注册设备的代码,也不需要处理应该如何处理推送通知。 任何帮助都将不胜感

  • 我已经在我的应用程序上实现了推送通知,它们工作得很好。我遇到的问题是,当我点击下拉菜单中的它们时,它们会立即重新加载应用程序。为了解决这个问题,我让应用程序创建了一个新的活动实例。这现在打开了一个新的页面,但当点击从这个新的页面返回时,它有同样的问题,并重新加载整个应用程序。