> I notice this two methods, handleReceiver() and makeApplication()。
>
> In which case,packageInfo.makeApplication(false, mInstrumentation); was 
> called and mApplication == null? Which will make a receiver be 
> instantiated(by cl.loadClass(component).newInstance())before 
> *packageInfo.makeApplication(false, 
> mInstrumentation);* and *instrumentation.callApplicationOnCreate(app);*.
>
 
>
>      private void handleReceiver(ReceiverData data) {
>
>         // If we are getting ready to gc after going to the background, 
> well
>
>         // we are back active so skip it.
>
>         unscheduleGcIdler();
>
>  
>
>         String component = data.intent.getComponent().getClassName();
>
>  
>
>         LoadedApk packageInfo = getPackageInfoNoCheck(
>
>                 data.info.applicationInfo, data.compatInfo);
>
>  
>
>         IActivityManager mgr = ActivityManagerNative.getDefault();
>
>  
>
>         BroadcastReceiver receiver;
>
>         try {
>
>             java.lang.ClassLoader cl = packageInfo.getClassLoader();
>
>             data.intent.setExtrasClassLoader(cl);
>
>             data.setExtrasClassLoader(cl);
>
>             receiver = 
> *(BroadcastReceiver)cl.loadClass(component).newInstance();*
>
>         } catch (Exception e) {
>
>             if (DEBUG_BROADCAST) Slog.i(TAG,
>
>                     "Finishing failed broadcast to " + 
> data.intent.getComponent());
>
>             data.sendFinished(mgr);
>
>             throw new RuntimeException(
>
>                 "Unable to instantiate receiver " + component
>
>                 + ": " + e.toString(), e);
>
>         }
>
>  
>
>         try {
>
>             Application app = *packageInfo.makeApplication(false, 
> mInstrumentation);*
>
>  
>
>             if (localLOGV) Slog.v(
>
>                 TAG, "Performing receive of " + data.intent
>
>                 + ": app=" + app
>
>                 + ", appName=" + app.getPackageName()
>
>                 + ", pkg=" + packageInfo.getPackageName()
>
>                 + ", comp=" + data.intent.getComponent().toShortString()
>
>                 + ", dir=" + packageInfo.getAppDir());
>
>  
>
>             ContextImpl context = (ContextImpl)app.getBaseContext();
>
>             sCurrentBroadcastIntent.set(data.intent);
>
>             receiver.setPendingResult(data);
>
>             receiver.onReceive(context.getReceiverRestrictedContext(),
>
>                     data.intent);
>
>         } catch (Exception e) {
>
>             if (DEBUG_BROADCAST) Slog.i(TAG,
>
>                     "Finishing failed broadcast to " + 
> data.intent.getComponent());
>
>             data.sendFinished(mgr);
>
>             if (!mInstrumentation.onException(receiver, e)) {
>
>                 throw new RuntimeException(
>
>                     "Unable to start receiver " + component
>
>                     + ": " + e.toString(), e);
>
>             }
>
>         } finally {
>
>             sCurrentBroadcastIntent.set(null);
>
>         }
>
>  
>
>         if (receiver.getPendingResult() != null) {
>
>             data.finish();
>
>         }
>
>     }
>
>  
>
>  
>
>     public Application makeApplication(boolean forceDefaultAppClass,
>
>             Instrumentation instrumentation) {
>
>         *if (mApplication != null) {*
>
>             return mApplication;
>
>         }
>
>  
>
>         Application app = null;
>
>  
>
>         String appClass = mApplicationInfo.className;
>
>         if (forceDefaultAppClass || (appClass == null)) {
>
>             appClass = "android.app.Application";
>
>         }
>
>  
>
>         try {
>
>             java.lang.ClassLoader cl = getClassLoader();
>
>             ContextImpl appContext = new ContextImpl();
>
>             appContext.init(this, null, mActivityThread);
>
>             *app = mActivityThread.mInstrumentation.newApplication(*
>
> *                    cl, appClass, appContext);*
>
>             appContext.setOuterContext(app);
>
>         } catch (Exception e) {
>
>             if (!mActivityThread.mInstrumentation.onException(app, e)) {
>
>                 throw new RuntimeException(
>
>                     "Unable to instantiate application " + appClass
>
>                     + ": " + e.toString(), e);
>
>             }
>
>         }
>
>         mActivityThread.mAllApplications.add(app);
>
>         mApplication = app;
>
>  
>
>         if (instrumentation != null) {
>
>             try {
>
>                * instrumentation.callApplicationOnCreate(app);*
>
>             } catch (Exception e) {
>
>                 if (!instrumentation.onException(app, e)) {
>
>                     throw new RuntimeException(
>
>                         "Unable to create application " + 
> app.getClass().getName()
>
>                         + ": " + e.toString(), e);
>
>                 }
>
>             }
>
>         }
>
>         
>
>         return app;
>
>     }
>
>  
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to