> 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.