Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bind service to FragmentActivity or Fragment?

Is it better to bind service to FragmentActivity:

bindService(Intent, ServiceConnection, int);

or to Fragment:

getActivity().bindService(Intent, ServiceConnection, int);

What is better practice?

like image 208
pawegio Avatar asked Mar 05 '13 22:03

pawegio


1 Answers

Is it better to bind service to FragmentActivity... or to Fragment

They are the same as you have them written here. getActivity() is not a Fragment -- it is a method that returns the Activity. You cannot call bindService() on a Fragment.

What is better practice?

Neither. Bind to the Application object, obtained via getApplicationContext(), with the ServiceConnection managed by (or perhaps actually being) a retained Fragment.

The reason is configuration changes. A binding is state. You need to maintain that state across configuration changes. While a retained Fragment can hold onto the ServiceConnection, there is an implicit tie in the system between the ServiceConnection and the Context that registered it for a binding. Since activities can be destroyed and recreated on configuration changes, the Activity is not a good choice of Context here. Application, which is system-global, is a safer choice, and one of the few places where choosing Application over another Context is a wise move IMHO.

Here is a blog post of mine, from a time before fragments, that gets into this a bit more. Here is a sample project demonstrating the technique.

like image 88
CommonsWare Avatar answered Sep 19 '22 11:09

CommonsWare