(1) is pretty easy: just put an extra class between the ContentProvider and the data that implements all the low-level CRUD. For example, one class can handle sqlite databases and another class with the same interface can handle a Google drive backend.
After doing some research, here's how you can handle (2) and (3) with Android classes:
- AsyncTask - unfortunately, AsyncTask doesn't know about configuration changes, so you have to write that yourself (and it gets ugly).
- headless fragments - Fragments without a UI. You basically have to write your own AsyncTaskLoader so that defeats the point. (See here http://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/)
- AsyncTaskLoader - seems to be the way to go
Loaders are designed to load data but you can hack a Loader to also handle insertions/update. (You can do whatever you want in the loadInBackground() method.)
The catch is that before HoneyComb, all Loaders share a thread pool to excecute requests in parallel. (After HoneyComb, Loaders execute tasks in sequence.) This means that not only are tasks that execute immediately after each other NOT guaranteed to execute in order but there will be data consistency issues if you don't handle multi-threading correctly.
If you have a Service running in the background that updates the database, you'll still have to worry about multi-threading in post-Honeycomb.
The bottom line is that there doesn't seem to be Android framework that abstracts away the problem of "database calls should not conflict with each other". You have to handle that on your own.