Search code examples
androidandroid-servicelistenerandroid-binder

Avoid Service callback when Activity gets closed and re-opened


I have a LocalService that exposes a Binder with some APIs. I create a Service Listener, just like this:

if (dataServiceListener == null) {
    dataServiceListener = new DataServiceListener();
    mainActivity.getApplicationContext().bindService
        (new Intent(mainActivity, LocalService.class),
        dataServiceListener.svcConn, mainActivity.BIND_AUTO_CREATE);
}

After I call the method that the Binder in dataServiceListener exposes, I get the response in the dataServiceListener onResult() method. Up to this point, no kind of issues, everything is working. Some sort of problem occurs when I close the Activity that is waiting for the Service Listener callback and immediately reopen it. Even though I re-instantiate the dataServiceListener in onCreate(), I get two callbacks instead of one, the old one from the destroyed Activity and the latter (right) one; this way the results mix up on the UI. Is there a way to tell the Service or the Service Listener that when the activity finishes, the callbacks must be avoided. Or maybe even destroy the ServiceListener objects.

I think this is the issue that Mark L. Murphy (Commonsware) described in "The Busy Coder's Guide to Android Development":

The biggest catch is to make sure that the activity retracts the listeners when it is done.

How can I do this? Is there a way to get rid of the useless listeners when the activity finishes?

Thank you!


Solution

  • I finally solved the issue (and no, I haven't been working on it for so long :D).

    The callback to the listener was made before the Fragment's onDestroy was called. So the boolean "dontupdate" value was never set to false. Overriding onBackPressed in the main activity solved the problem, as I invoked a destroy() method for each fragment that takes care of setting the boolean value to false.