Bitbang3r Bitbang3r - 1 month ago 7
Android Question

"Static" startActivity(Intent) method?

I have a Button. Its View.OnClickHandler-implementing class is instantiated about 3 constructors deep from the nearest reference to an android.app.Activity object. When clicked, I want it to open the Location settings panel so the user can enable GPS and/or network-based location by launching the

Settings.ACTION_LOCATION_SOURCE_SETTINGS
intent.

Short of promiscuously passing that parent Activity object from constructor to constructor to constructor so my
onClick()
method can see it, is there any way to just reach up into the metaphorical static ether and scream, "Hey, Android... launch
Settings.ACTION_LOCATION_SOURCE_SETTINGS
" without having to have an actual live Activity object handy to use for its startActivity method?

Answer

I believe you are saying that you need an Activity object for the first parameter of new Intent or some other method to generate intents. Please do correct me if I'm wrong. If that is the case you actually just need a Context object (Activity is a sub-class of Context), that may not help particularly in this case.

I'd need to see the code to be sure there wasn't a way to get at a context object neatly from the spot you need it. There may be some way to do it (e.g. access to outer variable from anonymous object scope; a fairly common pattern with handlers on Android).

I would say that in some of my apps I do pass context objects around quite a bit. Personally I think this practice (known as dependency injection) is not so bad as some engineers think. If you are using managers or state-laden objects deep in the app, concealing this fact with global accessors or automatic dependency injection, is just papering over that fact.

Here are two other similar questions on this topic with respect to Android context objects:

Static Way to get Context on android?

Using Application context everywhere?