1

I created one sample application which will start the service in background and even if when clear from cache the service is running but that works on Android version 5.Not supporting in android version 8.1.

My MainActivity.cs code

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


        SetContentView(Resource.Layout.Main);

        Android.Support.V7.Widget.Toolbar toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);

        SetSupportActionBar(toolbar);

        //var alarmIntent = new Intent(this, typeof(AlarmReceiver));
        //alarmIntent.PutExtra("title", "Hello");
        //alarmIntent.PutExtra("message", "World!");

        Intent intent = new Intent(NOTIFICATION_CHANNEL_ID);
        intent.SetClass(this, typeof(AlarmReceiver));

        var pending = PendingIntent.GetBroadcast(this, 0, intent, PendingIntentFlags.UpdateCurrent);

        var alarmManager = GetSystemService(AlarmService).JavaCast<AlarmManager>();
        alarmManager.SetRepeating(AlarmType.ElapsedRealtime, DateTime.Now.Millisecond, 5 * 100, pending);

    }

I have AlarmReciever.cs class

 [BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { Android.Content.Intent.ActionBootCompleted })]
class AlarmReceiver : BroadcastReceiver
{
    Context context;
    public override void OnReceive(Context context, Intent intent)
    {
        this.context = context;
        Toast.MakeText(context, "Service is Running in background", ToastLength.Long).Show();

        if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
        {
            context.StartForegroundService(new Intent(context, typeof(BackgroundService)));
        }
        else
        {
            context.StartService(new Intent(context, typeof(BackgroundService)));
        }
        //Intent background = new Intent(context, typeof(BackgroundService));
        //context.StartForegroundService(background);

    }
}

When clearing the app from cache then i am calling OnTaskRemoved method in my Service class-

 [Service]
public class BackgroundService : Service
{
    public override void OnCreate()
    {
        base.OnCreate();

    }

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {
        Log.Debug("service", "Service Started");
        //init the handler in oncreate
        System.Timers.Timer Timer1 = new System.Timers.Timer();
        Timer1.Start();
        Timer1.Interval = 3000;
        int a = 0;
        Timer1.Enabled = true;
        //Timer1.Elapsed += OnTimedEvent;
        Timer1.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) =>
        {
            Timer1.Stop();
            Timer1.Start();
            a++;
            //Delete time since it will no longer be used.
            Timer1.Dispose();
        };
        Timer1.Start();

        return StartCommandResult.Sticky;
    }

    public override IBinder OnBind(Intent intent)
    {
        return null;
    }

    public override void OnTaskRemoved(Intent rootIntent)
    {
        Intent restartServiceIntent = new Intent(this, this.Class);
        restartServiceIntent.SetPackage(this.PackageName);
        Log.Debug("service", "Service Restarted");

        PendingIntent restartServicePendingIntent = PendingIntent.GetService(this, 1, restartServiceIntent, PendingIntentFlags.OneShot);
        AlarmManager alarmService = (AlarmManager)this.GetSystemService(Context.AlarmService);

        alarmService.SetRepeating(AlarmType.RtcWakeup, SystemClock.CurrentThreadTimeMillis(), 30 * 1000, restartServicePendingIntent);
        NotificationManager notificationManager =
            (NotificationManager)GetSystemService(NotificationService);

        Notification.Builder builder = new Notification.Builder(this);
        Intent notificationIntent = new Intent(this, typeof(MainActivity));
        PendingIntent contentIntent = PendingIntent.GetActivity(this, 0, notificationIntent, 0);

        //set
        builder.SetContentIntent(contentIntent);
        builder.SetSmallIcon(Resource.Mipmap.launcher_foreground);
        builder.SetContentText("Service Running in background");
        builder.SetContentTitle("Service Restarted");
        builder.SetAutoCancel(true);
        builder.SetDefaults(NotificationDefaults.All);


        notificationManager.Notify(1, builder.Build());

        base.OnTaskRemoved(rootIntent);
    }
}

This code is working for android version 5.But when I am clearing the app cache and testing in android version 8.1 then application stopped(not hitting OnTaskRemoved Method).

Can anyone help where i am going wrong.Thanks in Advance.

shweta
  • 77
  • 6
  • You could refer to this link.https://stackoverflow.com/questions/49486656/ontaskremoved-not-getting-called-when-home-press-kill-the-app – Leon Mar 22 '19 at 07:23

1 Answers1

0

Android API level 26 (8.0) introduced much stricter limitations on what background services were able to do and for how long, especially when their respective app is not in the foreground. There's some Android documentation on exactly what those limitations are.

The official recommendation TL;DR is - if the service you want to run is "user-visible", then consider making your service a Foreground Service. Foreground Services require that you display a notification while that service is running (think of the notification that your audio player displays while it's playing music). If not, then it can probably be handled by scheduling a Job.

draconastar
  • 385
  • 3
  • 12