BackgroundTask trigger on battery state - windows-phone-8

I'm developping a Windows phone App and I cannot figure out how trigger a backgroundtask everytime the battery level changes. I mean, I would like to launch a task everytime the battery goes -1%. I've looked in SystemTrigger class but I found nothing about the battery state. Does somebody has an idea ?

You can get the current battery charge using something like this.
int charge = Windows.Phone.Devices.Power.Battery.GetDefault().RemainingChargePercent;
But I'm not sure that you will be capable of running a backgroundtask when the battery decreases. Your backgroundtask doesn't run continuously. The phones scheduler defines when the background tasks are run and once the code in your background task ends it can't do anything until the scheduler runs it again.

Related

How can I schedule a Background Task to trigger at a specific time

This is a Windows Phone 8.1 app. I want to be able to trigger a task to execute at a specific time. My main concerns are accuracy, resource and user experience.
I have tried a TimeTrigger with an IBackgroundTask but found that, aside from the minimum 15 minutes constraint, the execution time is far from accurate - sometime the task triggers 8 minutes later, some times 20 so no use for a scheduled trigger.
I have looked at toast but I need the task to run without user input and, as far as I can see, the toast notifications have no capability to trigger code execution without the user interacting.
I have looked at the alarm clock approach but, firstly it uses toast notifications and, secondly, I understand you can only have one alarm app that the user must declare so that's a bit intrusive.
I have looked at using a Task.Delay approach using async and await to avoid blocking the UI thread but this is hardly a background-centric approach.
Has anyone managed to find a way to create resource-friendly, scheduled background tasks (i.e. an alarm and sleep function) for Windows Phone 8.1?

Using AS3 Timer & distriqt Notification ANE To Send Notifications While In Sleep Mode

I'm using the AS3 Timer class to sync data between a Flex Mobile app and a server ideally every 30 mins then send a local (distriqt) Notification to the user when action is required.
However, when the device goes into sleep / hibernate mode it seems to slow down, even stop the Timer. I've tried using a lower interval (5mins) but it still only works intermittently.
This is very hard to test as the behavior is different in debug / run modes.
Any suggestions?
Thanks.
Sounds like you might need to change your approach here. Background operation of applications is very different from the foreground.
Your application will run for a little while (depending on the current device memory load among other things) and will then enter a suspended mode, mainly to preserve the application's memory state.
There are some background mode exceptions to this, such as audio playback and location updates, however if you aren't performing these then Apple will most likely reject your application as part of the review process.
You can also investigate the executeInBackground flag on the NativeApplication. This allows a long running task to execute in the background, however this does not guarantee that the application would run in the background continuously.
You can read more here: http://blogs.adobe.com/airodynamics/2012/05/04/air-ios-background-behavior/
UIBackgroundModes: https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW22

Create A background service in Windows phone 8 to update location

I have to create a Background Task which should run after every 1 minute and should call a Rest service to update the Mobile longitude and Latitude Location. The rest service for this purpose have been written all I have to do is to write a Task in my existing application which should perform this update. Can you guys please tell which is the most easiest way to implement this functionality.
Thanks,
There isn't a concept of a service like exists in Windows Desktop. Applications are running, or not on the phone. One application on the phone, tracking location, can be running in the background while other applications run.
If your application is in the foreground, you will just directly call the web services with updated location.
You can use a scheduled background agent to periodically update location, but it is likely that it won't update frequently enough for your needs.
MSDN has details about how to create an application that actively tracks location in the background, subject to some important limitations, and reasons the application may be deactivated:
The app stops actively tracking location. An app stops tracking location by removing event handlers for the PositionChanged and StatusChanged events of the Geolocator class or by calling the Stop() method of the GeoCoordinateWatcher class.
The app has run in the background for 4 hours without user interaction.
Battery Saver is active.
Device memory is low.
The user disables Location Services on the phone.
Another app begins running in the background.
In addition, there is a complete tutorial available for this scenario.

Windows Phone 8 - Keeping background location tracking active beyond four hours

I'm in the process of developing a WP8 app that makes use of the background location tracking abilities provided by the OS. The idea is to monitor the users position and to notify them when they are near certain types of places.
So far it all seems to work fine and when running the location tracking works as I would expect.
The problem is, it seems that the phone times out background apps after around four hours, stopping the location tracking.
I can understand why Microsoft did it, to preserve battery life etc. But there's not much point having a background location tracking app that has to be manually restarted every four hours! If a user chooses to run this app and is made aware of the potential battery hit, surely it should be able to run indefinitely - to a point of course, if the system runs out of resources or similar then that's fair enough.
Does anyone have any experience with this? There must be hundreds of others apps in the store that have run into this issue I would have thought? And presumably there must be some way of keeping the location tracking running?
I've tried periodically updating the live tile (using a DispatcherTimer) while the tracking is running but this doesn't seem to be enough to keep the app alive either :(
Anyone have any ideas?
Thanks.
There is no way to achieve your desired behavior. The app will be deactivated under anye of following conditions:
The app stops actively tracking location. An app stops tracking location by removing event handlers for the PositionChanged and StatusChanged events of the Geolocator class or by calling the Stop() method of the GeoCoordinateWatcher class.
The app has run in the background for 4 hours without user interaction.
Battery Saver is active.
Device memory is low.
The user disables Location Services on the phone.
Another app begins running in the background.
Source: Running location-tracking apps in the background for Windows Phone 8
What you could do is to show a toast notification before app is deactivated advising the user, and make him navigate back to the app, extending the period for other 4 hours that way.
There is no way to keep it running without any user interaction.

WinRT OnSuspending

What does event OnSuspending in App.xaml.cs mean? I suppose this event is fired when we change Metro to Desktop or change metro application but what is done with app memory? Is it freed, saved somewhere or it is kept until OS exhausted memory? What steps I have to do as a programmer to keep application working after resuming? What do I need to save?
From your applications point of view, the suspend is somewhat like the 'pause' option of the debugger. Execution is completely stopped and the OS has the option to either resume the app at a later point or shut it down for good.
In the first scenario, your app will not have a clue about the meantime. In case it is shut down by the OS, on the next start the previous execution state will be set to 'terminated' so you should restore the app as it was when you received the 'suspend' event.