I am writing an app that has to read the GPS even in background.
I managed to maintain the app working in background (what in itself is an issue in ai2), thanks to Ullis Roboter's wonderful tools: https://ullisroboterseite.de/android-AI2-KeepAlive-en.html
(Thanks!)
I am sure the app is running in bg as, for example, it produces sounds from time to time, items are updated, etc.
But... the GPS feature stops working after some time in bg. I mean, everything in the app goes on working but the "ChangeLocation" event of the location sensor is not fired, so that the coordinates read by the app are "frozen". Until the app goes to foreground again... then GPS starts again.
I turned OFF "battery optimization" for the app in Android's setting but it didn't solve the problem.
This is a possible explanation if you are testing with Android 8+:
In an effort to reduce power consumption, Android 8.0 (API level 26) limits how frequently an app can retrieve the user's current location while the app is running in the background. Under these conditions, apps can receive location updates only a few times each hour.
What you experience is probably expected behavior.
How often are you updating the device's location?
You said "the GPS feature stops working after some time in bg"; how long is 'some time'?
Keep the app in the foreground? Use a StayAwake routine. Here is how you might code a Stay Awake block routine using a Notifier
Using either an extension or a block routine drains your device battery rapidly . These work around methods are not running the app in the Background, they force the app
screen to stay open .
this is why I wrote a locationservice extension...
Location Service Extension
This extension is able to run in the background while your app is closed and stores location data (latitude, longitude and optionally current datetime, altitude, accuracy, speed, current address and provider) in TinyDB.
Also a background web functionality is available which can be used to send the location data to a web service of your choice using a POST request. This could be used for example to store the location data in a MySQL database or to send an email after a location change was detected while the app is not running.
A notifier will be displayed while the location service is running in the background.
Your extension looks nice. Do you think it will work on Android >=8.0 taking into account what Steve said?
This is a possible explanation if you are testing with Android 8+: In an effort to reduce power consumption, Android 8.0 (API level 26) limits how frequently an app can retrieve the user's current location while the app is running in the background. Under these conditions, apps can receive location updates only a few times each hour .
If you use Taifun's excellent extension, the coordinates read by the app in real time are "frozen" and stored in a TinyDB until the app returns to foreground again . The extension then can report the locations captured when asleep when it is awakened. The location changes are stored but not reported in the app until the app returns to the foreground. As far as I can tell, you do not receive continuous notifications on the device while the app is in the background capturing location data. The coordinates are captured but you read them in arrears, not real time. You can reproduce a trak showing where you have been while the app hibernated, which might be all you want to do anyway.
No. I'd need to read the locations in background in "real time".
@Taifun, can you confirm this? Is your extension limited to store the locations read in bg in TinyDB? I guess there is no special reason for that... If you can access the GPS in bg you could in principle fire any app function with them, besides storing in TinyDB (?).
If your extension can also send these locations to a given server in real time, what seems to be the case, maybe I could work with that. Although the in-app solution would be much better.
here is the description again, what the extension is able to do
This extension is able to run in the background while your app is closed and stores location data (latitude, longitude and optionally current datetime, altitude, accuracy, speed, current address and provider) in TinyDB.
Also a background web functionality is available which can be used to send the location data to a web service of your choice using a POST request. This could be used for example to store the location data in a MySQL database or to send an email after a location change was detected while the app is not running.
A notifier will be displayed while the location service is running in the background.
no you can't
everything you like to run in the background needs to be implemented separately, read again the description of what is possible...
btw. you did not mention what exactly you are trying to do after a location change ...
The app has to fire some stuff (eg. alarm sound, query a server, ...) when the device gets close to certain locations. That is why is has to retrieve the location from time to time and take decisions based on that.
Alternatively, since Taifun's extension 'does not offer a proximity alert', use the standard LocationSensor and a StayAwake routine (see item # 3) and either a ringed fence or calculate the distance from your current location constantly and when that distance is small trigger your alarm or query your server
One last question: the storage of the location points in TinyDB is in real time or in chunks (when the app awakes)? As I said, my app DOES run in bg, so in principle it could retrieve from TinyDB the points stored by your extension at any time.... (?)
I prefer to avoid keeping the screen on all the time and similar stuff, if possible. As I said, I was able to keep the app running in background, the only problem is the location sensor.