theblitz
theblitz

Reputation: 6881

Needing Context in non-Activity classes

I have some classes within my application that need to call Android functions that require the Context as a parameter. I don't have it as the class is not a subclass of the Activity class.

What is the correct way to tackle this problem?

  1. Pass it as a parameter on each call?
  2. Pass it at class instantiation and keep it?

Upvotes: 49

Views: 61913

Answers (7)

Mark Mooibroek
Mark Mooibroek

Reputation: 7696

Pass it as a parameter. Or better yet, get the application context to avoid memory leaks.

public class Example {
    protected Context context;

    public Example(Context context){
        this.context = context.getApplicationContext();
    }
}

Upvotes: 19

ET-CS
ET-CS

Reputation: 7160

I've answered this question here also.

You can do that using ContextWrapper, as described here.

For example:

public class MyContextWrapper extends ContextWrapper {

    public MyContextWrapper(Context base) {
      super(base);
   }

}

and use that class as it were Context

Upvotes: 4

Maxim
Maxim

Reputation: 3006

It depends on the role of the class. But anyway pass ApplicationContext but not Activity one. If you pass Activity context gc can't remove it from the memory when after you don't need activity anymore. But application context is used while application was not finished by OS.Refer Avoid Memory Leaks

Upvotes: 35

Octavian Helm
Octavian Helm

Reputation: 39604

I'm pretty much always going with a constructor parameter approach. I pass it in the instantiation and keep a private reference in the instantiated class.

You have to think about one important thing. If the class you pass the Context will exist longer than the Activity instantiating it then you should use the application context. If that class is doing UI stuff you will need an activity context.

Make sure that the class you are passing an activity context to won't last longer than the Activity or you'll leak the entire activity.

If you don't do UI stuff then go with the application context.

Upvotes: 10

evilcroco
evilcroco

Reputation: 531

The best way is to follow Bean approach:

public class Example {
    protected Context getContext() {
        ...
    }

    ...
}

Then it depends on possibilities to access context. If class is fully independent then constructor parameter and private field seems best approach.

But that bean property way shields you from further code changes.

Upvotes: 1

ccheneson
ccheneson

Reputation: 49410

Pass it at class instantiation and keep it.

One typical example is when you create a db helper. See this link

Upvotes: 3

Aracem
Aracem

Reputation: 7207

I pass it as a parameter, i think its de best form to do it

Upvotes: 3

Related Questions