You should read the documentation for getApplicationContext(), and not
simply believe what the name says.

It does NOT, repeat, NOT, return your application. Well, it might, but
it might not.

"Return the context of the single, global Application object of the
current process. This generally should only be used if you need a
Context whose lifecycle is separate from the current context, that is
tied to the lifetime of the process rather than the current
component."

Read that carefully. I didn't, first time. The application object it
returns may not even be associated with your current .apk -- it can be
some other .apk with code running in the same process.

It does NOT necessarily return the same as Activity.getApplication().

Activity.getApplication() can be useful. I claim
Context.getApplicationContext() should absolutely NEVER be called by
developers using the SDK. We simply do not have sufficient control
over what it returns. It may work today -- and then later, when you
introduce another .apk with the same signature and process name,
suddenly stop working -- some of the time.

This literally happened to me, which is why I'm clear on the point.

The object it returns may even have been loaded with a different
classloader -- you won't even be able to cast to get access.

The page you linked needs to be fixed! Just as various demos needed to
be fixed for the same flaw.

On Jun 19, 6:04 pm, Nathan <[email protected]> wrote:
> On Jun 19, 5:45 pm, Mark Murphy <[email protected]> wrote:
>
> > Well, as I wrote:
>
> > "A number of GUI-related things fail outright if you use
> > getApplicationContext() instead of an Activity, for example."
>
> > Off the top of my head, I can't name any specific methods. Resources
> > don't map right, IIRC, and you can't use one for opening a Dialog. It
> > seems like any time I suggest somebody replace getApplicationContext()
> > with "this" in a StackOverflow answer, it fixes their problem.
> > Frankly, I just avoid getApplicationContext() completely unless I am
> > specifically looking for the Application object.
>
> > Also, FWIW, Ms. Hackborn has voiced her concerns about Application as
> > a Context in the past.
>
> Advice from Google Developers isn't exactly consistent on this point,
> then.
>
> From this page:
>
> http://developer.android.com/intl/de/resources/articles/avoiding-memo...
> "  The second solution is to use the Application context. This context
> will live as long as your application is alive and does not depend on
> the activities life cycle. If you plan on keeping long-lived objects
> that need a context, remember the application object. You can obtain
> it easily by calling Context.getApplicationContext() or
> Activity.getApplication()."
>
> Romain and Ms. Hackborn should probably talk. First, we should use an
> application context to avoid storing the Activity context. Second, we
> should use an Activity context because an application context plain
> won't work.
>
> Perhaps these aren't in conflict. If you have to store a context
> beyond the life of an Activity (something to be avoided when
> possible), you are stuck with the application context and whatever
> limitations it has.
>
> I don't know what Google Analytics does with the context; I'd guess
> they use the file system for temp storage. I don't if I'm allowed to
> reverse engineer the jar to find out, because the terms and conditions
> page is down.
>
> Nathan

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to