Open In App

What is Context in Android?

Last Updated : 15 Aug, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Android Applications are popular for a long time and it is evolving to a greater level as users’ expectations are that they need to view the data that they want in an easier smoother view. Hence, the android developers must know the important terminologies before developing the app. In Android Programming we generally come across the word Context. So what exactly is this Context and why is it so important? To answer this question let’s first see what the literal meaning of Context is:

The Circumstances that form the setting for an Event, Statement, or Idea, and in terms of which it can be fully understood.

Looking at this definition we come across two things:

  • The Context tells us about the surrounding information.
  • It is very important to understand the environment which we want to understand.

Similarly when we talk about Android Programming Context can be understood as something which gives us the Context of the current state of our application. We can break the Context and its use into three major points: 

  • It allows us to access resources.
  • It allows us to interact with other Android components by sending messages.
  • It gives you information about your app environment.

The code has been given in both Java and Kotlin Programming Language for Android.

Understanding Context by a Real World Example

Let’s a person visit a hotel. He needs breakfast, lunch, and dinner at a suitable time. Except for these things there are also many other things, he wants to do during his time of stay. So how does he get these things? He will ask the room-service person to bring these things for him. Right? So here the room-service person is the Context considering you are the single activity and the hotel to be your app, finally, the breakfast, lunch & dinner have to be the resources.

How Does this Work?

1. It is the Context of the current/active state of the application.

Usually, the app got multiple screens like display/inquiry/add/delete screens(A general requirement of a basic app). So when the user is searching for something, the Context is an inquiry screen in this case.

2. It is used to get information about the activity and application.

The inquiry screen’s Context specifies that the user is in inquiry activity, and he/she can submit queries related to the app

3. It is used to get access to resources, databases, shared preferences, etc.

Via Rest services, API calls can be consumed in android apps. Rest Services usually hold database data and provide the output in JSON format to the android app. The Context for the respective screen helps to get hold of database data and the shared data across screens

4. Both the Activity and Application classes extend the Context class.

In android, Context is the main important concept and the wrong usage of it leads to memory leakage. Activity refers to an individual screen and Application refers to the whole app and both extend the Context class. 

Types of Context in Android

There are mainly two types of Context that are available in Android. 

  1. Application Context and
  2. Activity Context

The Overall view of the App hierarchy looks like the following:

Mockup Screen Of Application And Activity

 

It can be seen in the above image that in “Sample Application”, the nearest Context is Application Context. In “Activity1” and “Activity2”, both Activity Context (Here it is Activity1 Context for Activity1 and Activity2 Context for Activity2) and Application Context.The nearest Context to both is their Activity Context only.

Application Context

This Context is tied to the Lifecycle of an Application. Mainly it is an instance that is a singleton and can be accessed via getApplicationContext(). Some use cases of Application Context are:

  • If it is necessary to create a singleton object
  • During the necessity of a library in an activity

getApplicationContext():

It is used to return the Context which is linked to the Application which holds all activities running inside it. When we call a method or a constructor, we often have to pass a Context and often we use “this” to pass the activity Context or “getApplicationContext” to pass the application Context. This method is generally used for the application level and can be used to refer to all the activities. For example, if we want to access a variable throughout the android app, one has to use it via getApplicationContext().

Example:

Java




import android.app.Application;
  
public class GlobalExampleClass extends Application {
    private String globalName;
    private String globalEmail;
  
    public String getName() {
        return globalName;
    }
  
    public void setName(String aName) {
        globalName = aName;
    }
  
    public String getEmail() {
        return globalEmail;
    }
  
    public void setEmail(String aEmail) {
        globalEmail = aEmail;
    }
}


Kotlin




import android.app.Application
  
class GlobalExampleClass : Application() {
    private var globalName: String? = null
    private var globalEmail: String? = null
  
    fun getName(): String? {
        return globalName
    }
  
    fun setName(aName: String?) {
        globalName = aName
    }
  
    fun getEmail(): String? {
        return globalEmail
    }
  
    fun setEmail(aEmail: String?) {
        globalEmail = aEmail
    }
}


Inside the activity class, set the name and email of GlobalExampleClass, which can be accessed from another activity. Let us see via the below steps.

Syntax:

// Activity 1
public class <your activity1> extends Activity {
  ........
  ........
  private <yourapplicationname> globarVar;
  ........
  @Override
  public void onCreate(Bundle savedInstanceState) {
    .......
    final GlobalExampleClass globalExampleVariable = (GlobalExampleClass) getApplicationContext();
    
    // In this activity set name and email and can reuse in other activities
    globalExampleVariable.setName("getApplicationContext example");
    globalExampleVariable.setEmail("xxxxxx@gmail.com");
    
    .......
}
  
// Activity 2  
public class <your activity2> extends Activity {
  ........
  ........
  private <yourapplicationname> globarVar;
  .......
  @Override
  public void onCreate(Bundle savedInstanceState) {
    .......
    final GlobalExampleClass globalExampleVariable = (GlobalExampleClass) getApplicationContext();
    
    // As in activity1, name and email is set, we can retrieve it here
    final String globalName  = globalExampleVariable.getName();
    final String globalEmail = globalExampleVariable.getEmail();
    
    .......
}

So, whenever the variable scope is required throughout the application, we can get it by means of getApplicationContext(). Following is a list of functionalities of Application Context.

List of functionalities of Application Context:

  • Load Resource Values
  • Start a Service
  • Bind to a Service
  • Send a Broadcast
  • Register BroadcastReceiver

Activity Context

It is the activity Context meaning each and every screen got an activity. For example, EnquiryActivity refers to EnquiryActivity only and AddActivity refers to AddActivity only. It is tied to the life cycle of activity. It is used for the current Context. The method of invoking the Activity Context is getContext().

 Some use cases of Activity Context are:

  • The user is creating an object whose lifecycle is attached to an activity.
  • Whenever inside an activity for UI related kind of operations like toast, dialogue, etc.,

getContext():

It returns the Context which is linked to the Activity from which it is called. This is useful when we want to call the Context from only the current running activity.

Example:

Java




@Override
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
    // view.getContext() refers to the current activity view
    // Here it is used to start the activity
    Intent intent = new Intent(view.getContext(), <your java classname>::class.java);
    intent.putExtra(pid, ID);
    view.getContext().startActivity(intent);
}


Kotlin




fun onItemClick(parent: AdapterView<*>?, view: View, pos: Int, id: Long) {
    // view.getContext() refers to the current activity view
    // Here it is used to start the activity
    val intent = Intent(view.context, <your java classname>::class.java)
    intent.putExtra(pid, ID)
    view.context.startActivity(intent)
}


List of Functionalities of Activity Context:

  • Load Resource Values
  • Layout Inflation
  • Start an Activity
  • Show a Dialog
  • Start a Service
  • Bind to a Service
  • Send a Broadcast
  • Register BroadcastReceiver

From the functionalities of both Application and Activity, we can see that the difference is that the Application Context is not related to UI. It should be used only to start a service or load resource values etc. Apart from getApplicationContext() and getContext(), getBaseContext() or this are the different terminologies used throughout the app development. Let us see with an example

getBaseContext():

The base Context is set by the constructor or setBaseContext().This method is only valid if we have a ContextWrapper. Android provides a ContextWrapper class that is created around an existing Context using: 

ContextWrapper wrapper = new ContextWrapper(context);

The benefit of using a ContextWrapper is that it lets you “modify behavior without changing the original Context”.

Syntax:

public <YourHandler>(Context ctx) {
    // if the context is instanceof ContextWrapper
    while (ctx instanceof ContextWrapper) {
        // use getBaseContext()
        final Context baseContext = ((ContextWrapper)context).getBaseContext();
        if (baseContext == null) {
            break;
        }
        // And then we can assign to context and reuse that
        ctx = baseContext;
    }
}

this:

“this” argument is of a type “Context”.  To explain this Context let’s take an example to show a Toast Message using “this”.

Example:

Java




import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
  
// Show a simple toast message, that can be done after doing some activities
// Toast.makeText(this, "Action got completed", Toast.LENGTH_SHORT).show();
  
public class ExampleActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_example);
  
        // Displaying Toast with Hello Javatpoint message
        Toast.makeText(this,"Action done",Toast.LENGTH_SHORT).show();
    }
}


Kotlin




import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
  
// Show a simple toast message, that can be done after doing some activities
// Toast.makeText(this, "Action got completed", Toast.LENGTH_SHORT).show();
  
class ExampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main_example)
  
        // Displaying Toast with Hello Javatpoint message
        Toast.makeText(this, "Action done", Toast.LENGTH_SHORT).show()
    }
}


Another example to start the activity using “this”:

Java




import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
  
public class FirstActivity extends AppCompatActivity {
  
    public static final String newMessage = "Your message to go for next screen";
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
    }
  
    // There must be some button and on click of
    // that below method can be invoked
    public void sendMessageToNextScreen(View view) {
        // Here it is used with "this"
        Intent intent = new Intent(this, SecondActivity.class);
        EditText editText = (EditText) findViewById(R.id.editText);
        String message = editText.getText().toString();
        intent.putExtra(newMessage, message);
  
        // Start the SecondActivity
        startActivity(intent);
    }
}


Kotlin




import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
  
class FirstActivity : AppCompatActivity() {
  
    private var newMessage = "Your message to go for next screen"
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_first)
    }
  
    // There must be some button and on click of
    // that below method can be invoked
    fun sendMessageToNextScreen(view: View?) {
        // Here it is used with "this"
        val intent = Intent(this, SecondActivity::class.java)
        val editText: EditText = findViewById(R.id.editText)
        val message = editText.text.toString()
        intent.putExtra(newMessage, message)
  
        // Start the SecondActivity
        startActivity(intent)
    }
}




Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads