繁体   English   中英

Xamarin通知Android崩溃

[英]Xamarin Notification Android Crash

我收到以下异常:

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

NotificationService

    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:全局:: Xamarin.Forms.Platform.Android.FormsApplicationActivity {

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

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

有关如何解决的任何建议? 对我来说,最大的问题是我需要在哪个对象上调用removeView()? 在LoadApplication(newApp())上抛出此异常; 行在我的MainActivity中。

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

我自己发现了答案。

在AlarmReceiver内部,我所需要做的就是:

resultIntent.SetFlags(ActivityFlags.Singletop);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM