Another Use for getApplicationContext(): Binding and Rotation

Earlier, I pointed out a good use for a method that I generally recommend developers avoid, getApplicationContext(). Recently, Ms. Hackborn pointed out another good use for it, tied to binding of services to activities that might undergo a configuration change, such as an orientation change.

When an activity changes configuration (rotation, dock, locale, etc.), Android wants to destroy and recreate your activities, to ensure you have the right resources, among other reasons. You have the opportunity to pass an object from the old instance of the activity to the new one via onRetainNonConfigurationInstance(), getting it in the new activity via getLastNonConfigurationInstance().

For example, if you have an AsyncTask, you can pass it from the old activity to the new one. Done properly, your AsyncTask will be (mostly) oblivious to the shift and you will not leak memory.

If you have an activity that has bound to a service via bindService(), you have a ServiceConnection object that represents the bound connection. I inquired as to whether it was safe to pass the ServiceConnection from the old activity to the new one via onRetainNonConfigurationInstance().

The answer: yes…but only if you bound to the service using getApplicationContext(), not this (i.e., the activity as Context).

I need to put together some sample code for this scenario. However, this is rather useful for helping to make sure your service does not shut down unexpectedly.