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

Xamarin通知Android崩溃

谷永贞
2023-03-14

我得到以下异常:

Java.Lang.IllegalStateException:指定的子项已具有父项。您必须在孩子的父拳上调用 removeVeiw()。

运行以下代码块时。这一切都从我的表单页面开始,只需按一下按钮,即可使用警报管理器生成计划通知。问题是,如果单击通知,则如果应用仍处于活动状态,则会引发上述异常。

如果我在手机上切换应用程序,然后单击通知,它会按预期将应用程序恢复而不会崩溃。

以下是该工作流中的代码片段:

来自xamarin页面:

 private void BtnStartJob_Clicked(object sender, EventArgs e)
    {
        lblStatus.Text = "";
        if (btnStartJob.Text == "Start Job")
        {
            tmrToggle.StartCommand.Execute(null);
            App.Manager.StartJob(App.Manager.currentTimesheet.ProjectID);
            btnStartJob.Text = "Start Break";
        }
        else if (btnStartJob.Text == "End Break")
        {
            tmrAlert.PauseCommand.Execute(null);
            tmrToggle.StartCommand.Execute(null);
            App.Manager.EndBreak(App.Manager.currentTimesheet.TimesheetID);
            btnStartJob.Text = "Start Break";
            var notificationService = DependencyService.Get<INotificationService>();
            notificationService.CancelNotification();
        }
        else if (btnStartJob.Text == "Start Break")
        {
            tmrAlert.StartCommand.Execute(null);
            tmrToggle.PauseCommand.Execute(null);
            App.Manager.StartBreak(App.Manager.currentTimesheet.TimesheetID);
            btnStartJob.Text = "End Break";

            // schedule the notification here.
            var notificationService = DependencyService.Get<INotificationService>();
            notificationService.CreateNotification("Take Action", "Your break started 1 second ago, please take action.", TimeSpan.FromSeconds(15).Ticks);
        }
    }

通知服务

    public class NotificationService : INotificationService
{

    public void CancelNotification()
    {
        var alarmIntent = new Intent(Android.App.Application.Context, typeof(AlarmReceiver));            
        var pending = PendingIntent.GetBroadcast(Android.App.Application.Context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);

        var alarmManager = Android.App.Application.Context.GetSystemService("alarm").JavaCast<AlarmManager>();
        alarmManager.Cancel(pending);            
    }

    public void CreateNotification(string title, string message, long durationInTicks)
    {
        var duration = TimeSpan.FromTicks(durationInTicks);

        var alarmIntent = new Intent(Forms.Context, typeof(AlarmReceiver));
        alarmIntent.PutExtra("title", title);
        alarmIntent.PutExtra("message", message);

        var pending = PendingIntent.GetBroadcast(Android.App.Application.Context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);

        var alarmManager = Android.App.Application.Context.GetSystemService("alarm").JavaCast<AlarmManager>();
        alarmManager.Set(AlarmType.ElapsedRealtime, duration.Milliseconds, pending);
    }
}    

报警接收器:

    [BroadcastReceiver]
class AlarmReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        var message = intent.GetStringExtra("message");
        var title = intent.GetStringExtra("title");

        var resultIntent = new Intent(context, typeof(MainActivity));
        resultIntent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);

        var pending = PendingIntent.GetActivity(context, 0,
            resultIntent,
            PendingIntentFlags.CancelCurrent);

        var builder =
            new Notification.Builder(context)
                .SetContentTitle(title)
                .SetContentText(message)                    
                .SetSmallIcon(Resource.Drawable.WESSUClogo)
                .SetDefaults(NotificationDefaults.All);

        builder.SetContentIntent(pending);

        var notification = builder.Build();

        var manager = NotificationManager.FromContext(context);
        manager.Notify(1337, notification);
    }
}

MainActivity: global::Xamarin。forms . platform . Android . forms application activity {

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        global::Xamarin.Forms.Forms.Init(this, bundle);
        LoadApplication(new App());                        
    }
}

关于如何解决这个问题有什么建议吗?对我来说,最大的问题是我需要调用removeView()的对象是什么?此异常在LoadApplication(newApp())上抛出;这是我的主要活动。

由于完整的堆栈跟踪非常长,请单击此处查看pastebin。

共有1个答案

卞安邦
2023-03-14

我自己发现了答案。

在警报接收器中,我需要做的就是:

结果意向。SetFlags(ActivityFlags。singletop);

 类似资料:
  • 我正在使用Xamarin.Auth登录Facebook。我为iOS和Android创建了一个单独的渲染器。在auth.completed中,我在自定义呈现器的PCL类中调用了一个AfterLogin(UserInfo)方法。这会执行一些附加工作,然后调用 我不知道它指的是什么观点。 从ADB编辑堆栈跟踪

  • 问题内容: 我设法使通知在较旧的API中起作用,但在Oreo中不起作用。创建通知会导致我的应用程序仍然可以正常运行(logcat中没有消息),但是在Activity运行时,SystemUI崩溃并以无休止的周期重启。这是systemcat进程的logcat错误: 我的代码: 我在创建的MediaPlayerService的onCreate上初始化了mNotificationUtils。 问题答案:

  • 我注意到,当我在后台发送FCM负载时,我看到通知消息被显示,这与文档一致,但我看到收到的每个通知消息的本机通知。当我的应用程序在后台时,我收到了3条推送消息(带有通知负载),现在我在通知托盘中看到了3条本机通知。为什么他们没有崩溃?默认情况下,根据FCM文档,所有通知消息都是可折叠的。参考文件:https://firebase.google.com/docs/cloud-messaging/con

  • 我开发了一个React Native应用程序,当应用程序处于活动状态时,每次收到来自OneSignal的消息推送时都会崩溃。 错误是。 如果我在应用程序处于后台时收到通知,则没有问题。 这是我的身材。gradle文件: 还有我的应用/构建。gradle文件: 你知道问题来自哪里吗?

  • 我已经为我的Xamarin.Forms UWP应用程序实现了一个推送通知功能,我可以接收通知,然后弹出一个祝酒词。我正在使用下面的代码。 当用户单击/轻击通知时,我想从我的PCL项目中打开一个特定的页面,并将这个变量作为参数传递。我怎么能这么做?如有任何帮助,我们将不胜感激。