Difference between getContext() , getApplicationContext() , getBaseContext() and “this”

前端 未结 8 1913
臣服心动
臣服心动 2020-11-22 02:15

What is the difference between getContext() , getApplicationContext() , getBaseContext() , and \"this\"?

Though

相关标签:
8条回答
  • 2020-11-22 02:17

    From this docs

    I understood that you should use:

    Try using the context-application instead of a context-activity

    0 讨论(0)
  • 2020-11-22 02:20

    Context provides information about the Actvity or Application to newly created components.

    Relevant Context should be provided to newly created components (whether application context or activity context)

    Since Activity is a subclass of Context, one can use this to get that activity's context

    0 讨论(0)
  • 2020-11-22 02:24

    The question "what the Context is" is one of the most difficult questions in the Android universe.

    Context defines methods that access system resources, retrieve application's static assets, check permissions, perform UI manipulations and many more. In essence, Context is an example of God Object anti-pattern in production.

    When it comes to which kind of Context should we use, it becomes very complicated because except for being God Object, the hierarchy tree of Context subclasses violates Liskov Substitution Principle brutally.

    This blog post attempts to summarize Context classes applicability in different situations.

    Let me copy the main table from that post for completeness:

    +----------------------------+-------------+----------+---------+-----------------+-------------------+
    |                            | Application | Activity | Service | ContentProvider | BroadcastReceiver |
    +----------------------------+-------------+----------+---------+-----------------+-------------------+
    | Show a Dialog              | NO          | YES      | NO      | NO              | NO                |
    | Start an Activity          | NO¹         | YES      | NO¹     | NO¹             | NO¹               |
    | Layout Inflation           | NO²         | YES      | NO²     | NO²             | NO²               |
    | Start a Service            | YES         | YES      | YES     | YES             | YES               |
    | Bind to a Service          | YES         | YES      | YES     | YES             | NO                |
    | Send a Broadcast           | YES         | YES      | YES     | YES             | YES               |
    | Register BroadcastReceiver | YES         | YES      | YES     | YES             | NO³               |
    | Load Resource Values       | YES         | YES      | YES     | YES             | YES               |
    +----------------------------+-------------+----------+---------+-----------------+-------------------+
    
    1. An application CAN start an Activity from here, but it requires that a new task be created. This may fit specific use cases, but can create non-standard back stack behaviors in your application and is generally not recommended or considered good practice.
    2. This is legal, but inflation will be done with the default theme for the system on which you are running, not what’s defined in your application.
    3. Allowed if the receiver is null, which is used for obtaining the current value of a sticky broadcast, on Android 4.2 and above.

    screenshot

    0 讨论(0)
  • 2020-11-22 02:26

    Most answers already cover getContext() and getApplicationContext() but getBaseContext() is rarely explained.

    The method getBaseContext() is only relevant when you 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”. For example, if you have an activity called myActivity then can create a View with a different theme than myActivity:

    ContextWrapper customTheme = new ContextWrapper(myActivity) {
      @Override
      public Resources.Theme getTheme() { 
        return someTheme;
      }
    }
    View myView = new MyView(customTheme);
    

    ContextWrapper is really powerful because it lets you override most functions provided by Context including code to access resources (e.g. openFileInput(), getString()), interact with other components (e.g. sendBroadcast(), registerReceiver()), requests permissions (e.g. checkCallingOrSelfPermission()) and resolving file system locations (e.g. getFilesDir()). ContextWrapper is really useful to work around device/version specific problems or to apply one-off customizations to components such as Views that require a context.

    The method getBaseContext() can be used to access the “base” Context that the ContextWrapper wraps around. You might need to access the “base” context if you need to, for example, check whether it’s a Service, Activity or Application:

    public class CustomToast {
      public void makeText(Context context, int resId, int duration) {
        while (context instanceof ContextWrapper) {
          context = context.baseContext();
        }
        if (context instanceof Service)) {
          throw new RuntimeException("Cannot call this from a service");
        }
        ...
      }
    }
    

    Or if you need to call the “unwrapped” version of a method:

    class MyCustomWrapper extends ContextWrapper {
      @Override
      public Drawable getWallpaper() {
        if (BuildInfo.DEBUG) {
          return mDebugBackground;
        } else {
          return getBaseContext().getWallpaper();
        }
      }
    }
    
    0 讨论(0)
  • 2020-11-22 02:35

    getApplicationContext() - Returns the context for all activities running in application.

    getBaseContext() - If you want to access Context from another context within application you can access.

    getContext() - Returns the context view only current running activity.

    0 讨论(0)
  • 2020-11-22 02:39

    A Context is:

    • an abstract class whose implementation is provided by the Android system.
    • It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
    0 讨论(0)
提交回复
热议问题