I just tested using only bindService and now it's not doing what I
need it to do.  The requirement is to have the service stay running
between orientation changes.  Now it stops when the first activity
unbinds and starts new when the new activity binds, losing the current
work (which is a form submission), so now the server has processed
something but the client isn't going to get a response.  That doesn't
work for me.

Just in case you guys are wondering, my use case is this (and EVERYONE
that I've seen use the app tries this)

1) User flips open keyboard to fill out text fields
2) User clicks on submit button
3) App contacts server, starts processing, shows progress dialog
4) User flips phone shut
5) App reorients
6) App shows user the result of the operation.

So, how do I keep the service alive between orientations but shut it
down when the user has totally exited the app?

I just came up with a way.  What do you think about this?

I have a shut down on a timer if my service isn't doing anything.  I
just tested it and it works perfectly.  It also ensures that the
service stops in a timely fashion.  I know only about 2-3 seconds are
needed for even the worst orientation changes but I just wanted to be
safe.  I have my activities calling startService and bindService
onResume and calling unbindService onPause.  The whole thing works
well, is seamless to the user, seems really sound and plays nice with
the OS by shutting down when no longer in use.

        private void startShutdownThread() {
                Log.d(TAG, "Starting shutdown thread");
                shutDownThread = new Thread() {
                        @Override
                        public void run() {
                                while (shuttingDown && shutDownCount > 0) {
                                        //Log.d(TAG, "Shutting down in " + 
shutDownCount);
                                        try {
                                                Thread.sleep(1000);
                                        } catch (InterruptedException e) {
                                        }
                                        shutDownCount--;
                                }
                                // if the shut down hasn't been interrupted, 
then shut 'er down.
                                if (shuttingDown) {
                                        shuttingDown = false;
                                        stopSelf();
                                } else {
                                        Log.d(TAG, "Shutdown thread 
exiting...");
                                }
                        }
                };
                shutDownThread.start();
        }

        public IBinder onBind(Intent intent) {
                Log.d(TAG, "onBind()");
                bindCount++;
                // if the shutDownThread is running, stop it.
                if (shuttingDown) {
                        Log.d(TAG, "Shutdown thread stopped");
                        shuttingDown = false;
                        shutDownThread = null;
                }
                return mBinder;
        }


        @Override
        public void onRebind(Intent intent) {
                Log.d(TAG, "onRebind()");
                bindCount++;
                // if the shutDownThread is running, stop it.
                if (shuttingDown) {
                        Log.d(TAG, "Shutdown thread stopped");
                        shuttingDown = false;
                        shutDownThread = null;
                }
        }

        @Override
        public boolean onUnbind(Intent intent) {
                Log.d(TAG, "onUnbind()");
                bindCount--;
                if (bindCount == 0) {
                        // if no one is bound, start the countdown
                        shutDownCount = 30;
                        shuttingDown = true;
                        startShutdownThread();
                }
                return true;
        }

Done!  Man I'm happy to have that working.  I've been retrofitting all
the netcode with this service for the past 20 hours of coding and I
can't wait to not be working on this anymore!

On May 28, 9:58 pm, Robert Green <rbgrn....@gmail.com> wrote:
> I'm just worried about using bindService alone because I need the
> service to stay alive between orientation changes of the activity.
> There will be a period when the activity unbinds and the new activity
> binds but the service can not be stopped then or it will defeat the
> whole purpose of using it.
>
> On May 28, 5:39 pm, Mike Hearn <mh.in.engl...@gmail.com> wrote:
>
> > > I'm wondering if I just leave it running, if the OS will eventually
> > > kill it because nothing is bound to it and it is inactive.  Can I
> > > count on that?
>
> > No. If you start a service with startService() it is supposed to quit
> > itself, otherwise it will never die. It's best to pick one of bind or
> > start and stick with it, unless you are really sure what you are
> > doing. Don't worry about the service dying, remember that a service is
> > just a lifecycle construct. If you bind() to it in each activity when
> > your activities are gone the service will go away too.
>
>
--~--~---------~--~----~------------~-------~--~----~
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