谁调用了activity的oncreate()方法

这一切的一切都要从一个类说起,这个就是ActivityThread,这个类是Android应用程序的入口。正常情况下,每一个java程序都需要有一个main方法作为整个应用程序的入口。但是Android并没有将main方法暴露出来,而是封装到了ActivityThread中。现在来看一下ActivityThread中的main方法

ActivityThread ActivityMa Singleton ActivityMan ApplicationThread HHandler Instrumentation Application ActivitySta Activity Looper.prepareMainLooper() ActivityThread.attach(false) ActivityManagerNative.getDefault() ServiceManager.getService("activity") attachApplication(mAppThread) attachApplicationLocked thread.bindApplication(...) sendMessage(H.BIND_APPLICATION, data) handleBindApplication(data) callApplicationOnCreate(Application app) app.onCreate() mStackSupervisor.attachApplicationLocked(app) realStartActivityLocked() app.thread.scheduleLaunchActivity() sendMessage(H.LAUNCH_ACTIVITY, r) handleLaunchActivity(data) performLaunchActivity newActivity() 反射创建 callActivityOnCreate handleResumeActivity() 先执行onstart和onresume,在创建布局 Looper.loop() ActivityThread ActivityMa Singleton ActivityMan ApplicationThread HHandler Instrumentation Application ActivitySta Activity
  1. ActivityThread

startActivityUncheckedLocked

public static void main(String[] args) {        SamplingProfilerIntegration.start();        // CloseGuard defaults to true and can be quite spammy.  We        // disable it here, but selectively enable it later (via        // StrictMode) on debug builds, but using DropBox, not logs.        CloseGuard.setEnabled(false);        Environment.initForCurrentUser();        // Set the reporter for event logging in libcore        EventLogger.setReporter(new EventLoggingReporter());        Security.addProvider(new AndroidKeyStoreProvider());        // Make sure TrustedCertificateStore looks in the right place for CA certificates        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());        TrustedCertificateStore.setDefaultUserDirectory(configDir);        Process.setArgV0("");        //创建Looper法,这个是为什么在主线程可以使用handler的原因        Looper.prepareMainLooper();        ActivityThread thread = new ActivityThread();        //attach        thread.attach(false);        if (sMainThreadHandler == null) {            sMainThreadHandler = thread.getHandler();        }        Looper.loop();        throw new RuntimeException("Main thread loop unexpectedly exited");    }

可以发现main方法做了两件事,一个是初始化looper,另一件事情就是thread.attach(false)。在这里就activity和application操作的入口。

    private void attach(boolean system) {        sCurrentActivityThread = this;        mSystemThread = system;        if (!system) {            ViewRootImpl.addFirstDrawHandler(new Runnable() {                @Override                public void run() {                    ensureJitEnabled();                }            });            android.ddm.DdmHandleAppName.setAppName("",                                                    UserHandle.myUserId());            RuntimeInit.setApplicationObject(mAppThread.asBinder());            /// 这里找到AMS:ActivityManagerService 这个是framework中的内容            final IActivityManager mgr = ActivityManagerNative.getDefault();            try {                // 就是这里了,                mgr.attachApplication(mAppThread);            } catch (RemoteException ex) {                // Ignore            }            ...        } else {           ...        }      ...    }

这里调用application的oncreate方法

 private void handleBindApplication(AppBindData data) {                mInstrumentation.callApplicationOnCreate(app);    }

这里调用activity的oncreate方法

    private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {       //这里创建activity        Activity a = performLaunchActivity(r, customIntent);        if (a != null) {            r.createdConfig = new Configuration(mConfiguration);            Bundle oldState = r.state;            handleResumeActivity(r.token, false, r.isForward,                    !r.activity.mFinished && !r.startsNotResumed);            if (!r.activity.mFinished && r.startsNotResumed) {                // The activity manager actually wants this one to start out                // paused, because it needs to be visible but isn't in the                // foreground.  We accomplish this by going through the                // normal startup (because activities expect to go through                // onResume() the first time they run, before their window                // is displayed), and then pausing it.  However, in this case                // we do -not- need to do the full pause cycle (of freezing                // and such) because the activity manager assumes it can just                // retain the current state it has.                try {                    r.activity.mCalled = false;                    mInstrumentation.callActivityOnPause(r.activity);                    // We need to keep around the original state, in case                    // we need to be created again.  But we only do this                    // for pre-Honeycomb apps, which always save their state                    // when pausing, so we can not have them save their state                    // when restarting from a paused state.  For HC and later,                    // we want to (and can) let the state be saved as the normal                    // part of stopping the activity.                    if (r.isPreHoneycomb()) {                        r.state = oldState;                    }                    if (!r.activity.mCalled) {                        throw new SuperNotCalledException(                            "Activity " + r.intent.getComponent().toShortString() +                            " did not call through to super.onPause()");                    }                } catch (SuperNotCalledException e) {                    throw e;                } catch (Exception e) {                    if (!mInstrumentation.onException(r.activity, e)) {                        throw new RuntimeException(                                "Unable to pause activity "                                + r.intent.getComponent().toShortString()                                + ": " + e.toString(), e);                    }                }                r.paused = true;            }        } else {            // If there was an error, for any reason, tell the activity            // manager to stop us.            try {                ActivityManagerNative.getDefault()                    .finishActivity(r.token, Activity.RESULT_CANCELED, null, false);            } catch (RemoteException ex) {                // Ignore            }        }    }

这里具体创建activity,可以发现activity是通过反射的方式创建的

   private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {        // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");        ActivityInfo aInfo = r.activityInfo;        if (r.packageInfo == null) {            r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,                    Context.CONTEXT_INCLUDE_CODE);        }        ComponentName component = r.intent.getComponent();        if (component == null) {            component = r.intent.resolveActivity(                mInitialApplication.getPackageManager());            r.intent.setComponent(component);        }        if (r.activityInfo.targetActivity != null) {            component = new ComponentName(r.activityInfo.packageName,                    r.activityInfo.targetActivity);        }        Activity activity = null;        try {            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();            activity = mInstrumentation.newActivity(                    cl, component.getClassName(), r.intent);            StrictMode.incrementExpectedActivityCount(activity.getClass());            r.intent.setExtrasClassLoader(cl);            r.intent.prepareToEnterProcess();            if (r.state != null) {                r.state.setClassLoader(cl);            }        } catch (Exception e) {            if (!mInstrumentation.onException(activity, e)) {                throw new RuntimeException(                    "Unable to instantiate activity " + component                    + ": " + e.toString(), e);            }        }        try {            Application app = r.packageInfo.makeApplication(false, mInstrumentation);            if (localLOGV) Slog.v(TAG, "Performing launch of " + r);            if (localLOGV) Slog.v(                    TAG, r + ": app=" + app                    + ", appName=" + app.getPackageName()                    + ", pkg=" + r.packageInfo.getPackageName()                    + ", comp=" + r.intent.getComponent().toShortString()                    + ", dir=" + r.packageInfo.getAppDir());            if (activity != null) {                Context appContext = createBaseContextForActivity(r, activity);                CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());                Configuration config = new Configuration(mCompatConfiguration);                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "                        + r.activityInfo.name + " with config " + config);                activity.attach(appContext, this, getInstrumentation(), r.token,                        r.ident, app, r.intent, r.activityInfo, title, r.parent,                        r.embeddedID, r.lastNonConfigurationInstances, config,                        r.referrer, r.voiceInteractor);                if (customIntent != null) {                    activity.mIntent = customIntent;                }                r.lastNonConfigurationInstances = null;                activity.mStartedActivity = false;                int theme = r.activityInfo.getThemeResource();                if (theme != 0) {                    activity.setTheme(theme);                }                activity.mCalled = false;                if (r.isPersistable()) {                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);                } else {                    mInstrumentation.callActivityOnCreate(activity, r.state);                }                if (!activity.mCalled) {                    throw new SuperNotCalledException(                        "Activity " + r.intent.getComponent().toShortString() +                        " did not call through to super.onCreate()");                }                r.activity = activity;                r.stopped = true;                if (!r.activity.mFinished) {                    activity.performStart();                    r.stopped = false;                }                if (!r.activity.mFinished) {                    if (r.isPersistable()) {                        if (r.state != null || r.persistentState != null) {                            mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,                                    r.persistentState);                        }                    } else if (r.state != null) {                        mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);                    }                }                if (!r.activity.mFinished) {                    activity.mCalled = false;                    if (r.isPersistable()) {                        mInstrumentation.callActivityOnPostCreate(activity, r.state,                                r.persistentState);                    } else {                        mInstrumentation.callActivityOnPostCreate(activity, r.state);                    }                    if (!activity.mCalled) {                        throw new SuperNotCalledException(                            "Activity " + r.intent.getComponent().toShortString() +                            " did not call through to super.onPostCreate()");                    }                }            }            r.paused = true;            mActivities.put(r.token, r);        } catch (SuperNotCalledException e) {            throw e;        } catch (Exception e) {            if (!mInstrumentation.onException(activity, e)) {                throw new RuntimeException(                    "Unable to start activity " + component                    + ": " + e.toString(), e);            }        }        return activity;    }
  1. ActivityManagerNative
 static public IActivityManager getDefault() {        return gDefault.get();    }private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {        protected IActivityManager create() {            IBinder b = ServiceManager.getService("activity");            if (false) {                Log.v("ActivityManager", "default service binder = " + b);            }            IActivityManager am = asInterface(b);            if (false) {                Log.v("ActivityManager", "default service = " + am);            }            return am;        }    };
  1. ActivityManagerService
  @Override    public final void attachApplication(IApplicationThread thread) {        synchronized (this) {            int callingPid = Binder.getCallingPid();            final long origId = Binder.clearCallingIdentity();            attachApplicationLocked(thread, callingPid);            Binder.restoreCallingIdentity(origId);        }    } 
  private final boolean attachApplicationLocked(IApplicationThread thread,            int pid) {        ...        //这里调用application的oncreate方法         thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,                    profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,                    app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,                    isRestrictedBackupMode || !normalMode, app.persistent,                    new Configuration(mConfiguration), app.compat,                    getCommonServicesLocked(app.isolated),                    mCoreSettingsObserver.getCoreSettingsLocked());        ...        这里是activity的oncreate方法        mStackSupervisor.attachApplicationLocked(app)        ...        return true;    }
  1. ApplicationThread
  private class ApplicationThread extends ApplicationThreadNative {     public final void bindApplication(String processName, ApplicationInfo appInfo,                List<ProviderInfo> providers, ComponentName instrumentationName,                ProfilerInfo profilerInfo, Bundle instrumentationArgs,                IInstrumentationWatcher instrumentationWatcher,                IUiAutomationConnection instrumentationUiConnection, int debugMode,                boolean enableOpenGlTrace, boolean isRestrictedBackupMode, boolean persistent,                Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,                Bundle coreSettings) {            ...            sendMessage(H.BIND_APPLICATION, data);        }        //activity相关  public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,                ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,                String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,                PersistableBundle persistentState, List<ResultInfo> pendingResults,                List<ReferrerIntent> pendingNewIntents, boolean notResumed, boolean isForward,                ProfilerInfo profilerInfo) {            sendMessage(H.LAUNCH_ACTIVITY, r);        }  }
  1. HHandler
    这个是application启动是会创建的Handler
  public void handleMessage(Message msg) {            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));            switch (msg.what) {                      case BIND_APPLICATION:                                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");                                AppBindData data = (AppBindData)msg.obj;                                handleBindApplication(data);                                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                                break;                      case LAUNCH_ACTIVITY: {                            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");                            final ActivityClientRecord r = (ActivityClientRecord) msg.obj;                             r.packageInfo = getPackageInfoNoCheck(                                    r.activityInfo.applicationInfo, r.compatInfo);                            handleLaunchActivity(r, null);                            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                            }                             break;}
  1. Instrumentation
 public void callApplicationOnCreate(Application app) {        app.onCreate();    }  public Activity newActivity(Class<?> clazz, Context context,             IBinder token, Application application, Intent intent, ActivityInfo info,             CharSequence title, Activity parent, String id,            Object lastNonConfigurationInstance) throws InstantiationException,             IllegalAccessException {        Activity activity = (Activity)clazz.newInstance();        ActivityThread aThread = null;        activity.attach(context, aThread, this, token, 0, application, intent,                info, title, parent, id,                (Activity.NonConfigurationInstances)lastNonConfigurationInstance,                new Configuration(), null, null);        return activity;    }
  1. ActivityStackSupervisor
   final boolean realStartActivityLocked(ActivityRecord r,            ProcessRecord app, boolean andResume, boolean checkConfig)            throws RemoteException {            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,                    System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),                    r.compat, r.launchedFromPackage, r.task.voiceInteractor, app.repProcState,                    r.icicle, r.persistentState, results, newIntents, !andResume,                    mService.isNextTransitionForward(), profilerInfo);        return true;    }

更多相关文章

  1. Android(安卓)Fragment完全解析,关于碎片你所需知道的一切,Fragmen
  2. Android(安卓)Studio代码调试技巧篇
  3. View事件传递分析
  4. Android通过startService播放背景音乐简单示例
  5. Android音量相关知识总结(三)调节音量流程梳理
  6. mac 系统中Android(安卓)studio的一些快捷键
  7. android实现动画效果的方法onDrawFrame
  8. Android(安卓)HandlerThread全面解析
  9. AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结

随机推荐

  1. android 单例
  2. android 权限设置
  3. 收集整理的Android(安卓)color.xml文件的
  4. Android下调用收发短信邮件等
  5. android应用程序的安装位置
  6. Android(安卓)调用手机系统照相机拍照
  7. android 编写简单浏览器带下载
  8. [Android(安卓)UI] ActionBar 自定义属性
  9. 自定义进度条
  10. 关于Android中的各种Dialog