This code seems to rely on the fact that your background thread does
not die immediately. If your service is rebound within 30 * 1000
milliseconds, then it all works well.

- This is an unlikely scenario, but what if the re-bind happens more
than 30 seconds later?
- What if the service is stopped entirely and - when your activity (re)
binds - a brand new instance of your service is started? Not very
likely scenario either, but i'm not sure that it could never happen.

Why, instead, don't you keep your service alive by calling startService
()? This makes sure that any subsequent 'unbind' does not stop and
destroy your service.

On May 28, 11:53 pm, Robert Green <[email protected]> wrote:
> 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 <[email protected]> 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 <[email protected]> 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.- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to