dotnet / android-libraries

.NET for Android bindings for Google's libraries, such as AndroidX, GooglePlayServices, Firebase, and MLKit and their 3rd party dependency libraries.
MIT License
230 stars 49 forks source link

WorkManager not working when app is killed #333

Open Newsid opened 3 years ago

Newsid commented 3 years ago

Version Information

Describe your Issue:

Im trying to setup a WorkManager that executes a task every 15 minutes. For now I'm doing this test adding an entry in a firebase database.

I'm using the nuget package Xamarin.AndroidX.Work.Runtime (2.5.0.2)

This works fine if the app is in foreground or background, but if I kill the app it stops working.

I'm doing this test with a Nokia 8 Sirocco (api 28) and with a Samsung Galaxy A21S (api 30) that both mount Android Stock.

This is how I launch the work:

private void StartParallelWorkManager(int minutes)
     {
         PeriodicWorkRequest taskLauncher = PeriodicWorkRequest.Builder.From<UniquePeriodicWorker>(TimeSpan.FromMinutes(minutes)).Build();
         WorkManager.GetInstance(Xamarin.Essentials.Platform.AppContext).EnqueueUniquePeriodicWork("TestTask", ExistingPeriodicWorkPolicy.Keep, taskLauncher);
     }

and this is my Worker class:

public class UniquePeriodicWorker : Worker
     {
         public UniquePeriodicWorker(Context context, WorkerParameters workerParameters) : base(context, workerParameters)
         {
         }

         public override Result DoWork()
         {

             System.Console.WriteLine("{0} DO WORK", DateTime.Now.ToString("dd/MM HH:mm:ss"));
             try
             {
                 _ = CrossCloudFirestore.Current
                              .Instance
                              .Collection("WorkManagerRuns")
                              .AddAsync<DateTime>(DateTime.Now);
             }
             catch(Exception ex)
             {
                 System.Diagnostics.Debug.WriteLine(ex);
             }
             return Result.InvokeSuccess();
         }
     }

Doing the same test in android studio (using Kotlin) works like a charm.

Am I missing something in Xamarin side or Xamarin.AndroidX.Work.Runtime is not capable to achieve the same behavior of the native equivalent??

AntRemo commented 3 years ago

Hi @Newsid did you find a solution?

Newsid commented 3 years ago

Hi @AntRemo, not yet. I think it is a problem with this library that is not able to achieve the same behavior of the native equivalent.

moljac commented 3 years ago

@Newsid

Thanks for the feedback

I think it is a problem with this library that is not able to achieve the same behavior of the native equivalent.

Are you sure? Can you provide minimal repro sample for issue reproduction, please? Thanks

djhango commented 3 years ago

@moljac

I'm encountering this issue as well, see below for attached sample for reproduction: WorkManager.zip

Version Information:

Comparatively, here's a sample Android native implementation of the above repro: WorkManagerAndroid.zip

Version Information:

Daoting commented 2 years ago

@moljac

I'm encountering this issue as well.

Version Information:

moljac commented 2 years ago

@Daoting @djhango Thanks a lot for the feedback. Appreciated.

I will try to sit and dig into the issue and sample (BTW @djhango thanks a lot) ASAP, but my day is 24 hrs which is currently not enough.

Daoting commented 2 years ago

@moljac This bug still exists.

Version Information: Visual Studio Enterprise 2022 Version 17.3.2 Xamarin.AndroidX.Work.Runtime 2.7.1.4

temanado commented 2 years ago

This bug still exists

Microsoft Visual Studio Community 2022 Version 17.2.2 Xamarin.AndroidX.Work.Runtime 2.3.4.6

IgorSava commented 1 year ago

This bug still exists

Microsoft Visual Studio Community 2022 Version 17.4.1 Xamarin.AndroidX.Work.Runtime 2.7.1.5

kkppstudios commented 1 year ago

But still exists.

Microsoft Visual Studio Community 2022 Version 17.4.2 Xamarin.AndroidX.Work.Runtime 2.7.1.5

Anyone have any updates or work arounds for this??

buithienquyet commented 1 year ago

Any updates now? It seem to be hard to change because workers call C# code instead of native java code. I think we must to write worker in all java code => create jar => inject back to MAUI

Tviljan commented 1 year ago

Is this bug still relevant? Is someone working on it?

onurcoskun14 commented 1 year ago

This bug still exists

Microsoft Visual Studio Community 2022 Version 17.4.4 Xamarin.AndroidX.Work.Runtime 2.8.1.1

Zintom commented 1 year ago

Any updates now? It seem to be hard to change because workers call C# code instead of native java code. I think we must to write worker in all java code => create jar => inject back to MAUI

Damn that's a shame if true. I'm curious why the worker can't launch the C# function, surely we could set something up where Java is called and then that uses JNI to call into the C# runtime.

pkzOR commented 11 months ago

still an issue w/ Xamarin.AndroidX.Work.Runtime v 2.9.0

pkzOR commented 11 months ago

I am rescinding my previous comment after reading this: https://developer.android.com/topic/performance/background-optimization

The key point here is: "The precise restrictions imposed are determined by the device manufacturer."

All I had to do was go into Settings | App | myApp | Battery and set it to Unrestriced. Then, it started working. Any other battery setting did not work.

Note: Add logging in DoWork(), connect device to PC, allow USB tethering, build, deploy to device, watch the device log (in VS, Tools | Android | Device Log) to see it working. Run app, kill app, change battery restrictions, etc. You do need to wait the minimum time of 15 minutes.