DST
DST

Reputation: 49

Xamarin Android Background Service crashes when the Application get closed

Hello, I want to build an app, in which you can start a service, which runs intependenly and creates a notification, and this service should constantly proof, if the DateTime.Now.Date is bigger than a spezific Date.

When I execute the code below, the notification gets displayed, but when I am closing the app, a few secondes later I get two times an information that the app crashed and I dont know why.

I cant even debug the code because this anly happens when the application is closed....

I hope you can help me thanks!

Here is my code:

namespace App
{
    [Activity(Label = "App", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        int count = 1;

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

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our button from the layout resource,
            // and attach an event to it
            Button button = FindViewById<Button>(Resource.Id.MyButton);

            button.Click += delegate {
                button.Text = string.Format("{0} clicks!", count++);
                StartService(new Intent(this, typeof(backgroudservice)));
            };
        }
    }

    public class backgroudservice : Service
    {
        public override IBinder OnBind(Intent intent)
        {
            return null;
        }

        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {

            newnotification("Title", "Text: ", 0);

            new Task(() => {
                DoWork();
                Thread.Sleep(1000);
            }).Start();

            return StartCommandResult.Sticky;
        }

        public void DoWork()
        {
            if (DateTime.Now.Date > Convert.ToDateTime("2016-03-29").Date)
            {
                cancelnotification(0);
                StopSelf();
            }
        }

        public override void OnDestroy()
        {
            base.OnDestroy();
            cancelnotification(0);
        }

        private void newnotification(string titel, string text, int id)
        {
            Notification.Builder builder = new Notification.Builder(this)
           .SetContentTitle(titel)
           .SetContentText(text)
           .SetSmallIcon(Resource.Drawable.droidlogo_small)
           .SetAutoCancel(false)
           .SetVisibility(NotificationVisibility.Public)
           .SetContentIntent(PendingIntent.GetActivity(this, 0, new Intent(this, typeof(MainActivity)), PendingIntentFlags.OneShot));

            // Build the notification:
            Notification notification = builder.Build();
            notification.Flags = NotificationFlags.NoClear;
            //notification.ContentIntent = new Intent(this,typeof(login));
            // Get the notification manager:
            NotificationManager notificationManager = GetSystemService(Context.NotificationService) as NotificationManager;

            // Publish the notification:
            notificationManager.Notify(id, notification);

        }
        private void cancelnotification(int id)
        {
            NotificationManager notificationManager = GetSystemService(Context.NotificationService) as NotificationManager;
            notificationManager.Cancel(id);
        }
    }
}

Upvotes: 2

Views: 1739

Answers (2)

DST
DST

Reputation: 49

I solved it, I forgot the [Service] above my class, now it works!

    [Service]
    public class backgroudservice : Service
    {
    ...
    }

Upvotes: 1

Mark Larter
Mark Larter

Reputation: 2373

You might try moving the call to cancelnotification in your service's OnDestroy to before the call to the base method, i.e.:

public override void OnDestroy()
    {
        cancelnotification(0);
        base.OnDestroy();
    }

Upvotes: 0

Related Questions