diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 204df63f600db..abf48a85c45e6 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -6480,9 +6480,9 @@ public final class ActivityThread { private T instantiate(ClassLoader cl, String className, Context c, Instantiator instantiator) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - if (c.getApplicationContext() instanceof Application) { - T a = instantiator.instantiate((Application) c.getApplicationContext(), - cl, className); + Application app = getApp(c); + if (app != null) { + T a = instantiator.instantiate(app, cl, className); if (a != null) return a; } return (T) cl.loadClass(className).newInstance(); @@ -6491,14 +6491,25 @@ public final class ActivityThread { private T instantiate(ClassLoader cl, String className, Intent intent, Context c, IntentInstantiator instantiator) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - if (c.getApplicationContext() instanceof Application) { - T a = instantiator.instantiate((Application) c.getApplicationContext(), - cl, className, intent); + Application app = getApp(c); + if (app != null) { + T a = instantiator.instantiate(app, cl, className, intent); if (a != null) return a; } return (T) cl.loadClass(className).newInstance(); } + private Application getApp(Context c) { + // We need this shortcut to avoid actually calling getApplicationContext() on an Application + // because the Application may not return itself for getApplicationContext() because the + // API doesn't enforce it. + if (c instanceof Application) return (Application) c; + if (c.getApplicationContext() instanceof Application) { + return (Application) c.getApplicationContext(); + } + return null; + } + private interface Instantiator { T instantiate(Application app, ClassLoader cl, String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException;