2016-04-08 18 views
0

Ich erhalte die folgende Ausnahme:Xamarin Mitteilung Android Absturz

java.lang.IllegalStateException: Das angegebene Kind bereits einen Elternteil hat. Sie müssen removeVeiw() für die Elternfaust des Kindes aufrufen.

beim Ausführen der folgenden Codeblöcke. Alles beginnt auf meiner Formularseite mit einem Tastendruck, der den Alarmmanager zum Generieren einer geplanten Benachrichtigung verwendet. Das Problem ist, dass wenn die Benachrichtigung angeklickt wird, die obige Ausnahme ausgelöst wird, wenn die App noch aktiv ist.

Wenn ich Anwendungen auf dem Telefon wechsle, dann klicke auf die Benachrichtigung, es bringt die Anwendung wie vorgesehen ohne den Absturz zurück.

Im Folgenden sind die Code-Schnipsel in Frage für diesen Workflow:

von Xamarin Seite:

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

Alarm Empfänger:

[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.FormsApplicationActivity {

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

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

Vorschläge, wie zu lösen? Die größte Frage ist für mich, welches Objekt ich removeView() aufrufen muss? Diese Ausnahme wird für die LoadApplication (newApp()) ausgelöst. Linie in meiner MainActivity.

Da eine vollständige Stapelprotokollierung sehr lang ist, klicken Sie für das Pastebin auf here.

+0

Gibt es eine Chance, dass Sie einen vollständigen Stack-Trace bereitstellen könnten? – pushasha

+0

Sie haben Ihren AlarmReceiver nicht installiert - Sie haben den NotificationService zweimal gepostet. Und es wäre hilfreich, wenn Sie uns sagen könnten, welche spezielle Linie die Ausnahme verursacht – Jason

+0

hinzugefügt Stack-Trace – Nebri

Antwort

0

Entdeckt die Antwort selbst.

innerhalb des AlarmReceiver alles, was ich tun muß, war dies:

resultIntent.SetFlags (ActivityFlags.Singletop);