I'm using a syncadapter in my application. I need it to trigger an event every day, at 6 AM. Is that possible?
Is there a way to trigger a syncadapter event every day at a given time?
Thanks!
This may help:
ContentResolver.addPeriodicSync()
This, too:
Transferring Data Using Sync Adapters
Or, you can always trigger a sync yourself:
ContentResolver.requestSync()
However, I advise against doing a requestSync() unless you're dead certain that you need to sync with a server every day at 6 AM regardless of what's happened with the data. The point of a sync adapter is that the system helps you keep your device up-to-date without wasting battery. If you keep turning WiFi or data access off and on to do syncs, you're using far more battery than if you let the sync adapter framework schedule everything for you.
I feel like the accepted answer didn't really answer the question. This is what I found in the docs:
"Notice that addPeriodicSync() doesn't run the sync adapter at a particular time of day. To run your sync adapter at roughly the same time every day, use a repeating alarm as a trigger. Repeating alarms are described in more detail in the reference documentation for AlarmManager."
http://developer.android.com/training/sync-adapters/running-sync-adapter.html#RunPeriodic
Related
I'm creating an event app for Android. I am using a local database with the SQL Server and I have some questions about how to implement a background service that retrieves the most recent events from my database. Basically, I wanted something like this: every day, at 9 am, I get a notification that new events have been added. For that, I thought about using a background service and the alarm manager that every day at 9 am called the service that would look for recent events in my database. But I have some doubts on how I could do this? I saw some things on the internet but I ended up getting confused. And if there was no internet, was it possible to access the database as soon as there was a connection?
Thanks to anyone who to help me.
What you are looking for is Workermanager. https://developer.android.com/topic/libraries/architecture/workmanager/basics Simplified: You define a function which is called when the constraints you set are met. these constraints are 9 am and internet available and repeat every 24h.
I would use a PeriodicworkRequest for your task and set the time, when the first execution should be done with an initialdelay which you can define dynamic with some code, depending on the current time.
You can as you wrote in a comment do the work with a OneTimeWork which also triggers another OneTimeWork. The Request is only executed when all constraints are met and is postponed until they are met.
It is a matter of how time sensitive your case is, wether you use OneTimeWork or a PeriodicWork
This article could help you find your preferred solution
https://medium.com/androiddevelopers/workmanager-periodicity-ff35185ff006
My app needs to perform myAction() 12 or 24 hours after the user clicks a button.
I understand I can't use handler.postDelayed(Runnable, long) for this because the long argument is based on uptime rather than actual time.
So I think I am just left with TimerTask/Timer or AlarmManager, but I'm not sure which of these would be most appropriate - plus, I hear a lot of bad comments about TimerTask/Timer, saying that it's unreliable, etc.
Also, I have the requirement where if the device is restarted, then I still need myAction() to be performed at the same time it would have been (or as soon after as possible) as if the device had never been turned off. For this requirement, maybe I need to store details of myAction() in the database and then use a BootReceiver to recall it for execution when the device restarts, but it would nice if there was a class that could take care of this, too.
So what would be an appropriate and reliable way of calling myAction() in 12/24 hours time, whilst accommodating device restarts?
Use GCM Network Manager or Firebase Job Dispatcher.
These are the 2 best practice approaches to doing periodic work on Android.
https://developers.google.com/cloud-messaging/network-manager#run_tasks
https://github.com/firebase/firebase-jobdispatcher-android
(Note, although the name implies that they are related to push messaging, they are not. Both are solutions for running periodic work locally on a device.)
This question is vague but I am not sure what to Google for exactly.
But in my app I have a section where you create a list of tasks with various attributes, and a lot of these numbers are summed up and displayed in daily totals visually. But these daily totals should reset every 24 hours (based on the hour of the day the user chooses for the cutoff, e.g. 3 am if someone works late).
Right now: my database can hold all the data by day. Then my daily counters will visually display the numbers by pulling the corresponding data from the database looking for the current day. That's the easy part.
The hard part: I can refresh the counter after the time cutoff if the user rotates the screen or restarts the app because then it'll be looking for items in the database with a new day that won't be found, so everything will be 0 as intended. But what if the user is just staring at the screen as the time cutoff rolls by? How do I make the app refresh the counters once the time hits? What if they're not even using the app at all (either it's minimized in the background or not even active).
Do I need to have some kind of always-running loop in the background that checks the current time against the values in the database? If so, isn't this inefficient if it's always needing to pull values from a database based on time? What's the correct practice for something like this?
You can setup a service and schedule that service to run periodically so that it does whatever job you want it to do
maybe this article can help you.
Alarm manager and services will be ideal for you to implement to do something for your requirement.
Services : It will be running all the time irrespective of your life-cycle of activity.
Alarm manager: Inside services use alarm manager to trigger event to update UI at regular interval.
Finally you can use Local braodcast reciever to update your Activity from services.
You can check implemetation in details below :
Android update activity UI from service
Regarding the problematic stated below I have come to a point where I need to make a decision on whether to:
Start a Service once that has an AlarmManager inside which then starts the query every 10 minutes. This Service will only be stopped if the user sets an "Onn-Off" Switch to "Off".
Use an AlarmManager to start an IntentService every 10 Minutes. This Service will then only be started when needed and closed afterwards
Which of these ways is better when it comes to:
- Ability to exchange data received by the Service (Or Intenservice) with other activities/services
- Battery usage
- Overall "good coding habits" ?
Thanks!
Original Question:
I am a pretty new Android Developer and have come across a situation that I do not know how to solve. I have already spent several days searching for a solution but could not find one.
While trying to develop my first app idea I have started playing around with receiving and parsing data from the internet. What I have achieved so far is generating a query that receives JSON data via an API and parses this JSON. All of which is done inside an AsyncTask. The received data is then shown on the screen.
However, for the purpose of my app idea, I need this to be done in the background. What I have thought of is:
Starting a Service that pretty much has the same logic as my Asynctask. Managed by an AlarmManager, this service then requests, receives and parses the data in a specific time interval.
Now the tricky part begins:
The data that I receive (let's say every 10 minutes) shall be used to change an alarm clock. So, as a simple example, let's say the user can set his alarm clock to 08:00 in the morning. The application then checks the current temperature every 10 minutes and changes the alarm clock time to 07:45 if the temperature is below 0° celcius because the user has to wake up earlier to clear the ice off his car.
Also, when "waking up" the application, the current (or rather the latest received) tempereture shall be shown in the UI.
What would be the best way to achieve this? I am having some issues regarding passing/receiving data from AsyncTasks/Services to/from Activities.
My first approach would be to start a single service from the MainActivity, passing some data to the Service (like the initial time the alarm shall start and the current location of the user). The Service then has two seperate AlarmManagers. One of which is set to perform the actual alarm (waking up the user in the morning) and the other manages the time interval of getting the data from the internet.
My questions:
- Does my train of thought make any sense at all so far?
- What is the best way to pass and receive data to/from a service? My best guess would be to use intents to pass and a broadcastreceiver to receive data from the service. would this make sense in this specific situation?
I fear that it is not welcomed to post questions without putting in any effort of your own before. Although I did not add any actual source code, I hope you can see that I have dealt with these questions for quite a while now but could not really start coding before I know the structure of the application.
Thanks in advance
Use AlarmManager to start an IntentService as often as necessary (in your example, it should be sufficient to start checking the temperature about two hours before the user plans to get up and maybe again after one hour and finally half an hour before the normal wakeup time. More often only in case of extreme weather conditions.
It's not necessary to check the temperature exactly at 03:33 a.m. so use
setInexactRepeating(), this will be easier on the battery.
See also Scheduling Repeating Alarms
Write the results to SharedPreferences and have one IntentService check 15 minutes before normal wakeup time if the user should get up right then. Cancel the normal wakeup alarm in this case. Communicating via SharedPreferences (think of a mailbox) and local (!) Broadcasts is a good idea - cheap and secure :)
My app periodically refresh data by pointing the api. Right know this process is every 3 minutes. Thats mean that every 3 minutes app, points to api requests and calculating data.
What is the best time value between refreshing points? Somewhere i ready that good is every 30 minutes.
I focusing right now on battery life and looking for the best solution.
Thanks.
Exact answer for this question depends entirely on how important is "refresh" for your app to work stably. I haven't checked the c2dm approach.
Few steps can be followed to improve performance and battery
1) Stop your periodic refresh when application is in background
2) Follow the design tips thats been given here.
3) Its better to give user a choice regarding Refresh timer with 10, 20 , 30 minutes as choice in your app settings (optional).
You can use Google's C2DM to notify the device of new information instead of polling for it. Yes 3 minutes is too soon, use 30.