I’m creating an queued upload manager. With this answer to my previous question’s guidance, I’ll be using a Service, to upload these images. It was recommended that I use a database to keep track of the successfully uploaded, and the pending files.
My initial research leads me to believe that I’ll want to create a Bound Service, so I can update my UI once the photos have uploaded, as well as a Started Service, so it can run independent of my Activities that create it. It seems that I’ll also need to start it in its own process via the process=":something" directive in the app manifest.
My question is, what would the best way of sharing an SQLite (unless there is a better way) database amongst the N activity clients and the uploader service?
I envision it working like this, in pseudo code:
// in an app
writeRecordToDb( . . . );
// start service
if( service doesn't exist )
{
// start service, and bind
}
// in the service:
if( shared db has another row )
{
doDownload( . . . );
if( download worked )
{
notifyActivity();
if( db has another row )
doDownload( . . . );
}
else
{
retryDownload( . . . );
}
}
Is this the correct way to go about this? I’m again attempting to circumvent the problem of having multiple Activity instances request photo uploads when there is little to no cellular signal. I’ve just finished reading though the Service and Bound Service docs, and I’m feeling good, but not great.
I wouldn’t.
You do not need to use the binding pattern to update the UI. You can:
LocalBroadcastManagerthat the activity picks up, orPendingIntentsupplied in anIntentextra onstartActivity()by the activity, orWhich is why you should not bother with binding, as you do not need that, but you do need to start the service.
Option #1: Keep your
SQLiteOpenHelperin a static data memberOption #2: Use a
ContentProviderwrapper around your databaseUsing a database as a communications channel between components is akin to two next-door neighbors communicating with each other using a banner towed by a biplane. Yes, it works. However, it is slow and expensive.
(also, there’s never a biplane when you need one, but I digress…)
If you wish to use a database as a backing store for pending downloads, in case there is some interruption (e.g., user powers down the device) and you wish to pick up those downloads later on, that’s fine. However, the service will know what to download by the command you send to it via
startService().