Now we have this great article:
http://android-developers.blogspot.com/2010/04/multitasking-android-way.html

"Services can further negotiate this behavior by requesting they be
considered "foreground." This places the service in a "please don't kill"
state, but requires that it include a notification to the user about it
actively running. This is useful for services such as background music
playback or car navigation, which the user is actively aware of; when you're
playing music and using the browser, you can always see the music-playing
glyph in the status bar. Android won't try to kill these services, but as a
trade-off, ensures the user knows about them and is able to explicitly stop
them when desired."

But like in the API documentation it doesn't mention that the thread/process
gets a prio boost when running with the foreground flag.

On Tue, Apr 13, 2010 at 6:42 PM, Mariano Kamp <mariano.k...@gmail.com>wrote:

> Ok, I'll explain in detail. There are two issues in this story: (a)
> "killability" of the service (b) execution prio of the service
>
> In the good old days I just
> used  Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST) in my
> service and things went wonderfully. My sync service ran and took as much
> CPU was available, but the foreground app got all it needed too.
>
> In rare cases my service was shot down, but as my service could deal with
> that it was more a matter of efficiency than of data loss, so it was ok.
>
> Progressively over time this happened more frequently though. With
> information from you that we discussed on this list the story looked to me
> like this: It became en vogue for many popular services to call
> setForeground(). That lead to my services being shot down much more
> frequently, to the point where it became really painful because my service
> sometimes didn't even last for two seconds.
>
> At the time I understood from what you said that I should consider calling
> setForeground() and that you will make it no-op in a future release and at
> the same time introduce a new API to replace the old one with the addition
> that a notification needs to be shown, so that the user sees what's going on
> and can punish apps that misuse this feature.
>
> Now it took some time for me to get to the new API, because I need to
> implement a useful notification first. To make the new notification useful I
> rewrote my progress reporting, introduced remote views etc. to show the sync
> phases and their progress in the notification. I also let the user set if
> s/he wants to see the notification and get the added stability or not.
>
> The old setForeground() only had an effect on the killability of the
> process, but not on the scheduling priority. The priority I was then able to
> set independently to low as I don't want to slow down the foreground app in
> recognizing gestures or other stuff in the foreground that needs low
> latency.
>
> With the advent of startForeground() this doesn't work anymore, because
> signaling in the foreground, killability and scheduling priority seem to
> have been rolled into one.
>
> It would be great if those things could be independently controlled like it
> was possible before. And maybe it still is today? Process.setThreadPrio()
> doesn't do the trick anymore though.
>
> Don't get me wrong it is ok, when my activities sometimes get killed. If
> there were API for that I would also let the OS know when I would prefer not
> to (startCriticalSection()) and when it is cool to kill my activities.
>
> As we are on the topic. It is not so cool to be just shot down. I would
> prefer to get a signal that I am about to be shut down and get some time to
> finish what I am doing in a grace period and then clean up (and save my
> state). This would even be ok when this trigger would come earlier than the
> OS actually absolutely needs to do it.
>
> Ok, now back to your question. Let me give you two examples. One is not so
> much of a problem today, I just try to explain what kind of uses I see, the
> other one is what this thread is about.
>
> (a) I store articles' metadata in a sqlite database in the phone memory and
> the actual content (html, css, images) on the sd card.
>
> As part of the sync some articles are removed. So I run over all articles
> that are eligible for removal in the database. If I would get a signal to
> clean up as outlined above I would break before I start deleting a new
> article.
>
> But back to what is implemented today. For each article I have to remove
> the database record and the files on the sd card. The former is very fast,
> the latter is slow.
>
> It can happen that my process is suddenly killed in the middle of the
> removal of an article. Hence I first removed the assets on the sd card, then
> the database record. This way in the next sync I can clean up the rest and
> only have the issue that between syncs (or restarts) some assets are missing
> and articles are displayed with errors.
>
> It would be *nicer* if I could invoke startCriticalSection() for the
> removal of each article, but it's not a huge headache the way it is today.
>
> (b) I sync with Google Reader and unfortunately the API doesn't support
> incremental syncing for the most part. I have to fetch and parse an xml
> stream that contains up to 10,000 ids (not that uncommon) during every sync,
> write them to a temp database table and then set all articles in my database
> to read for which I don't find their id in the temp database.
>
> The issue is that if I need to retry that after my process had been killed
> I have to fetch the xml stream with the 10,000 ids again. That is very
> inefficient and wastes bandwidth, sync time, cpu and battery. And it gets
> worse, this process can take say 20 seconds. So on the second and all
> subsequent tries it may be shot down again. That's the reason I want this
> part to have a lower kill prio then an actual foreground app/audio stream
> from the background, but a higher kill prio than other background
> activities, including the one I described in (a).
>
> To give you another example: The Android download service. What I am
> writing here is just from observations as user, I haven't looked at the API
> or the code. (And I might be totally wrong, because I tried a couple of
> times to download a video using the download service  and it never
> completed).
>
> Anyway, some http servers allow retries, some don't, so for the later it
> would be very unfortunate if the download process gets killed after 50 MB of
> a 100MB file, because the download service would need to re-download the
> 50MBs after a restart again.
>
> Now the download service sports a notification, so it may use the new API,
> but that would clearly be wrong as it also boosts the scheduling prio which
> is totally the wrong thing to do here as the download doesn't need low
> latency at all. I just think it would not be a practical problem, because
> downloads tend to be I/O bound almost 100% of the time. But I still hope you
> see the picture I am trying to convey here?
>
> Cheers,
>
> Mariano
>
> On Tue, Apr 13, 2010 at 1:05 AM, Dianne Hackborn <hack...@android.com>
> wrote:
>
> Why do you want to use startForeground()?  What is it giving you?  If you
> want your code to run in the background, it is probably not what you want.
>
> On Mon, Apr 12, 2010 at 2:04 PM, Mariano Kamp <mariano.k...@gmail.com>
> wrote:
>
> 1) CPU is not a problem per se. My process can happily be starved of CPU,
> but as it needs to do xml parsing it does task the CPU albeit at it's lowest
> prio.
>
> 2) As I said I rely on an external API that doesn't understand incremental
> updates.
>
> Anyway, I think there is no good solution and the usefulness of this thread
> is nearing zero now, so I will stop before I waste anymore of everybody's
> time. Thanks so far.
>
> On Mon, Apr 12, 2010 at 10:58 PM, Mark Murphy <mmur...@commonsware.com>
> wrote:
>
>  Mariano Kamp wrote:
> >
> >     Quoting myself:
> >
> > And you have done so wonderfully.
> >
> > What is it your trying to say though?
> >
> > That it is ok to raise the priority when I don't want my process to be
> > killed.
>
> I'm saying what Ms. Hackborn confirmed in her reply to my post --
> startForeground() elevates the service's process to the foreground
> priority class. The not-too-unreasonable assumption the SDK makes is
> that something that is supposed to be in the foreground is supposed to
> be in the foreground. I mean, "foreground" is in the method's name.
> There's no question the documentation could be stronger, though.
>
> That being said, your choices are:
>
> 1. Continue using startForeground() and either live with the complaints
> or modify your service to be less CPU-intensive, or
>
> 2. Stop using startForeground() and modify your architecture to better
> support the service being shut down
>
> Since Android applications have to support their services being shut
> down (via task killers, the Services screen in Settings, etc.), I would
> think #2 would be the better answer, but that's your call.
>
> --
> Mark Murphy (a Commons Guy)
> http://commonsware.com | http://twitter.com/commonsguy
>
> Android Training in NYC: 4-6 June 2010: http://guruloft.com
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-developers@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com>
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>
> To unsubscribe, reply using "remove me" as the subject.
>
>   --
>
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-developers@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com>
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>
>
>
> --
> Dianne Hackborn
> Android framework engineer
> hack...@android.com
>
> Note: please don't send private questions to me, as I don't have time to
> provide private support, and so won't reply to such e-mails.  All such
> questions should be posted on public forums, where I and others can see and
> answer them.
>
> --
>
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to android-developers@googlegroups.com
> To unsubscribe from this group, send email to
> android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com>
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to