Reputation: 2201
I'm new to android and I'm trying to understand the difference between getApplication()
, getApplicationContext(
), getBaseContext()
, getContext()
and someClass.this
and especially when to use the these methods in the following code lines:
When I launch a toast what is the difference between these and in which cases to I use them?
Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
same with intents:
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);
Upvotes: 138
Views: 65053
Reputation: 68187
Toast and Intent, both require reference to context. Methods like getApplication, getApplicationContext, LoginActivity.this and getBaseContext offer reference to the context.
Now the confusing thing is the declaration of different contexts and their specific-usage. To make things simple, you should count two types of context available in the Android framework.
Application context is attached to the application's life-cycle and will always be same throughout the life of application. So if you are using Toast, you can use application context or even activity context (both) because a toast can be raised from anywhere with in your application and is not attached to a window.
Activity context is attached to the Activity's life-cycle and can be destroyed if the activity's onDestroy()
is raised. If you want to launch a new activity, you need to use activity's context in its Intent so that the new launching activity is connected to the current activity (in terms of activity stack). However, you may use application's context too to launch a new activity but then you need to set flag Intent.FLAG_ACTIVITY_NEW_TASK
in intent to treat it as a new task.
Now referring to your cases:
LoginActivity.this
though its referring to your own class which extends Activity class but the base class (Activity) also extends Context class, so it can be used to offer activity context.
getApplication()
though its referring to Application object but the Application class extends Context class, so it can be used to offer application context.
getApplicationContext()
offers application context.
getBaseContext()
offers activity context.
Tips: Whenever you need to manipulate
Views
then go for Activity-Context, else Application-Context would be enough.
Upvotes: 239
Reputation: 645
The answer by Waqas is very clear and complete, however I'd like to further clarify the difference between using this
vs. getBaseContext()
, or getApplication()
vs. getApplicationContext()
. Both Activity
and Application
extend not Context
itself, but ContextWrapper
, which is a
"Proxying implementation of
Context
that simply delegates all of its calls to anotherContext
".
That "real" context is what you get by using getBaseContext()
.
So although this
(for Activity
) and getBaseContext()
both give the activity context, they
this != getBaseContext()
) and this
is slightly less efficient, as the calls go through an extra level of indirection. I doubt it makes any practical difference, though.The same logic applies to getApplication()
vs. getApplicationContext()
.
Upvotes: 32
Reputation: 111
Class.this used if your class extends Activity getapplication() used refer application and application extends application context getbasecontext()refer your activity context context refer to your activity life cycle context applicationcontext refer to your app life cycle
Upvotes: 0
Reputation: 13501
LoginActivity.this
the above line is an Activity which is obeveously a Context.. this is used when you create some AlertDialogs... At some places its compulsory that you use Activity Context...
getApplication()
Same here the make text method needs Context and Application itself implements Context
getApplicationContext()
this is most preferred way since this Context
lives untill Application shuts down.
getBaseContext()
this Context is available to widgets and Views..
But All of them gives a Context object and nothing else..
Upvotes: 6