2016-04-08 43 views
0

我得到以下异常:Xamarin的Android通知崩溃

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线。

由于完整的堆栈跟踪非常长,请点击here获取pastebin。

+0

你有可能提供完整的堆栈跟踪吗? – pushasha

+0

你没有你的AlarmReceiver - 你发布了两次NotificationService。如果你能告诉我们哪个特定的行导致异常 – Jason

+0

添加堆栈跟踪 – Nebri

回答

0

我自己发现了答案。

的AlarmReceiver内的所有我需要做的是这样的:

resultIntent.SetFlags(ActivityFlags.Singletop);