在Android AMS(一) App启动过程之Task,进程创建流程中我们讲到了Process.start,在这里会通过zygote启动进程,通过反射调用ActivityThread的main函数

    public static void main(String[] args) {        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");        // 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());        // Make sure TrustedCertificateStore looks in the right place for CA certificates        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());        TrustedCertificateStore.setDefaultUserDirectory(configDir);        Process.setArgV0("");        Looper.prepareMainLooper();        ActivityThread thread = new ActivityThread();        //false 表示启动的非system 进程        thread.attach(false);        if (sMainThreadHandler == null) {            sMainThreadHandler = thread.getHandler();        }        if (false) {            Looper.myLooper().setMessageLogging(new                    LogPrinter(Log.DEBUG, "ActivityThread"));        }        // End of event ActivityThreadMain.        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        Looper.loop();        throw new RuntimeException("Main thread loop unexpectedly exited");    }

new ActivityThread()然后调用其attach方法,这里传入的是false,代表启动的进程不是system server

ActivityThread.java-->attach()

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());            final IActivityManager mgr = ActivityManager.getService();            try {                // add systrace tag for bug 661753                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "attachApplication");                mgr.attachApplication(mAppThread);            } catch (RemoteException ex) {                throw ex.rethrowFromSystemServer();            } finally {                // add systrace tag for bug 661753                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);            }            ......        }        ......    }

AMS-->attachApplication()

    @Override    public 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) {         // Find the application record that is being attached...  either via        // the pid if we are running in multiple processes, or just pull the        // next app record if we are emulating process with anonymous threads.        ProcessRecord app;        //根据pid查找对应的ProcessRecord对象        if (pid != MY_PID && pid >= 0) {            synchronized (mPidsSelfLocked) {                app = mPidsSelfLocked.get(pid);            }        } else {            app = null;        }         //如果进程由AMS启动,则它在AMS中一定有对应的ProcessRecord        //此处app为null,则表示AMS没有该进程的记录,故需要kill掉此异常进程        if (app == null) {            Slog.w(TAG, "No pending application record for pid " + pid                    + " (IApplicationThread " + thread + "); dropping process");            EventLog.writeEvent(EventLogTags.AM_DROP_PROCESS, pid);            if (pid > 0 && pid != MY_PID) {                Process.killProcessQuiet(pid);                //TODO: killProcessGroup(app.info.uid, pid);            } else {                try {                    thread.scheduleExit();                } catch (Exception e) {                    // Ignore exceptions.                }            }            return false;        }   ......        // See if the top visible activity is waiting to run in this process...        if (normalMode) {            try {                //启动Activity                if (mStackSupervisor.attachApplicationLocked(app)) {                    didSomething = true;                }            } catch (Exception e) {                Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);                badApp = true;            }        }    ......}

ActivityStackSupervisor.java-->attachApplicationLocked()

    boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {        final String processName = app.processName;        boolean didSomething = false;        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {            ArrayList stacks = mActivityDisplays.valueAt(displayNdx).mStacks;            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {                final ActivityStack stack = stacks.get(stackNdx);                if (!isFocusedStack(stack)) {                    continue;                }                stack.getAllRunningVisibleActivitiesLocked(mTmpActivityList);                final ActivityRecord top = stack.topRunningActivityLocked();                final int size = mTmpActivityList.size();                for (int i = 0; i < size; i++) {                    final ActivityRecord activity = mTmpActivityList.get(i);                    if (activity.app == null && app.uid == activity.info.applicationInfo.uid                            && processName.equals(activity.processName)) {                        try {                            if (realStartActivityLocked(activity, app,                                    top == activity /* andResume */, true /* checkConfig */)) {                                didSomething = true;                            }                        } catch (RemoteException e) {                            Slog.w(TAG, "Exception in new application when starting activity "                                    + top.intent.getComponent().flattenToShortString(), e);                            throw e;                        }                    }                }            }        }        // SPRD:bug782972, ensure the top running activity of focused stack is resumed.        if (mService.mBooted && mFocusedStack.mResumedActivity == null) {            resumeFocusedStackTopActivityLocked();        }        if (!didSomething) {            ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);        }        return didSomething;    }

ActivityStackSupervisor.java-->realStartActivityLocked函数

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,            boolean andResume, boolean checkConfig) throws RemoteException {            ......            //通知应用进程启动Activity            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,                    System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),                    new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,                    task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,                    newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);            ......}

realStartActivityLocked的主要作用是通知应用进程启动Activity

ActivityThread.java-->scheduleLaunchActivity(),这里的参数token就是new ActivityRecord生成的appWindowToken

        public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,                int procState, Bundle state, PersistableBundle persistentState,                List pendingResults, List pendingNewIntents,                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {            updateProcessState(procState, false);            ActivityClientRecord r = new ActivityClientRecord();            r.token = token;            r.ident = ident;            r.intent = intent;            r.referrer = referrer;            r.voiceInteractor = voiceInteractor;            r.activityInfo = info;            r.compatInfo = compatInfo;            r.state = state;            r.persistentState = persistentState;            r.pendingResults = pendingResults;            r.pendingIntents = pendingNewIntents;            r.startsNotResumed = notResumed;            r.isForward = isForward;            r.profilerInfo = profilerInfo;            r.overrideConfig = overrideConfig;            updatePendingConfiguration(curConfig);            sendMessage(H.LAUNCH_ACTIVITY, r);        }

发送LAUNCH_ACTIVITY,看下接收的地方做了什么

                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, "LAUNCH_ACTIVITY");                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

ActivityThread.java-->handleLaunchActivity()

    private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {        // If we are getting ready to gc after going to the background, well        // we are back active so skip it.        unscheduleGcIdler();        mSomeActivitiesChanged = true;        if (r.profilerInfo != null) {            mProfiler.setProfiler(r.profilerInfo);            mProfiler.startProfiling();        }        // Make sure we are running with the most recent config.        handleConfigurationChanged(null, null);        if (localLOGV) Slog.v(            TAG, "Handling launch of " + r);        // Initialize before creating the activity        if (!ThreadedRenderer.sRendererDisabled) {            GraphicsEnvironment.earlyInitEGL();        }        WindowManagerGlobal.initialize();        //创建一个Activity        Activity a = performLaunchActivity(r, customIntent);        if (a != null) {            r.createdConfig = new Configuration(mConfiguration);            reportSizeConfigurations(r);            Bundle oldState = r.state;            // add systrace tag for bug 661753            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "handleResumeActivity");            //调用resume方法            handleResumeActivity(r.token, false, r.isForward,                    !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);            // add systrace tag for bug 661753            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);            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.                performPauseActivityIfNeeded(r, reason);                // 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;                }            }        } else {            // If there was an error, for any reason, tell the activity manager to stop us.            try {                ActivityManager.getService()                    .finishActivity(r.token, Activity.RESULT_CANCELED, null,                            Activity.DONT_FINISH_TASK_WITH_ACTIVITY);            } catch (RemoteException ex) {                throw ex.rethrowFromSystemServer();            }        }    }

ActivityThread.java-->performLaunchActivity()

 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {    ......    if (activity != null) {        //得到对应的Context        Context appContext = createBaseContextForActivity(r, activity);        Activity activity = null;        try {            java.lang.ClassLoader cl = appContext.getClassLoader();            //newActivity            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 {            // add systrace tag for bug 661753            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "makeApplication");            //makeApplication            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) {                CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());                Configuration config = new Configuration(mCompatConfiguration);                if (r.overrideConfig != null) {                    // add systrace tag for bug 661753                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "updateFrom");                    config.updateFrom(r.overrideConfig);                    // add systrace tag for bug 661753                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                }                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "                        + r.activityInfo.name + " with config " + config);                Window window = null;                if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {                    window = r.mPendingRemoveWindow;                    r.mPendingRemoveWindow = null;                    r.mPendingRemoveWindowManager = null;                }                appContext.setOuterContext(activity);                // add systrace tag for bug 661753                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activity attach");                //设置Activity的主要变量,例如mMainThread                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, window, r.configCallback);                // add systrace tag for bug 661753                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                if (customIntent != null) {                    activity.mIntent = customIntent;                }                r.lastNonConfigurationInstances = null;                checkAndBlockForNetworkAccess();                activity.mStartedActivity = false;                int theme = r.activityInfo.getThemeResource();                if (theme != 0) {                    // add systrace tag for bug 661753                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activity setTheme");                    activity.setTheme(theme);                    // add systrace tag for bug 661753                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                }                activity.mCalled = false;                //调用Activity的onCreate函数                // add systrace tag for bug 661753                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "callActivityOnCreate");                if (r.isPersistable()) {                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);                } else {                    mInstrumentation.callActivityOnCreate(activity, r.state);                }                // add systrace tag for bug 661753                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                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的onStart函数                    // add systrace tag for bug 661753                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "performStart");                    activity.performStart();                    // add systrace tag for bug 661753                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    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);            }        } finally {            // add systrace tag for bug 661753            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        }        // add systrace tag for bug 661753        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        return activity;}

performLaunchActivity()主要作用是调用createBaseContextForActivity()创建context,然后通过newActivity()得到一个Activity,再通过makeApplication()得到Application,然后调用callActivityOnCreate(),onCreate之后再performStart()

先看下Activity.java-->attach()

    final void attach(Context context, ActivityThread aThread,            Instrumentation instr, IBinder token, int ident,            Application application, Intent intent, ActivityInfo info,            CharSequence title, Activity parent, String id,            NonConfigurationInstances lastNonConfigurationInstances,            Configuration config, String referrer, IVoiceInteractor voiceInteractor,            Window window, ActivityConfigCallback activityConfigCallback) {        attachBaseContext(context);        mFragments.attachHost(null /*parent*/);        mWindow = new PhoneWindow(this, window, activityConfigCallback);        mWindow.setWindowControllerCallback(this);        mWindow.setCallback(this);        mWindow.setOnWindowDismissedCallback(this);        mWindow.getLayoutInflater().setPrivateFactory(this);        if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {            mWindow.setSoftInputMode(info.softInputMode);        }        if (info.uiOptions != 0) {            mWindow.setUiOptions(info.uiOptions);        }        mUiThread = Thread.currentThread();        mMainThread = aThread;        mInstrumentation = instr;        mToken = token;        mIdent = ident;        mApplication = application;        mIntent = intent;        mReferrer = referrer;        mComponent = intent.getComponent();        mActivityInfo = info;        mTitle = title;        mParent = parent;        mEmbeddedID = id;        mLastNonConfigurationInstances = lastNonConfigurationInstances;        if (voiceInteractor != null) {            if (lastNonConfigurationInstances != null) {                mVoiceInteractor = lastNonConfigurationInstances.voiceInteractor;            } else {                mVoiceInteractor = new VoiceInteractor(voiceInteractor, this, this,                        Looper.myLooper());            }        }        mWindow.setWindowManager(                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),                mToken, mComponent.flattenToString(),                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);        if (mParent != null) {            mWindow.setContainer(mParent.getWindow());        }        mWindowManager = mWindow.getWindowManager();        mCurrentConfig = config;        mWindow.setColorMode(info.colorMode);    }

可以看出在Activity.java的attach()中会给activitynew出PhoneWindow,并且通过setWindowManager给window关联WMS,window有了然后就是调用Instrumentation .java-->callActivityOnCreate()时activityd到onCreate状态

    public void callActivityOnCreate(Activity activity, Bundle icicle,            PersistableBundle persistentState) {        prePerformCreate(activity);        // add systrace tag for bug 661753        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "performCreate with 3 args");        activity.performCreate(icicle, persistentState);        // add systrace tag for bug 661753        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        postPerformCreate(activity);    }

Activity.java-->performCreate()

    final void performCreate(Bundle icicle, PersistableBundle persistentState) {        mCanEnterPictureInPicture = true;        restoreHasCurrentPermissionRequest(icicle);        if (persistentState != null) {            onCreate(icicle, persistentState);        } else {            onCreate(icicle);        }        mActivityTransitionState.readState(icicle);        mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(                com.android.internal.R.styleable.Window_windowNoDisplay, false);        mFragments.dispatchActivityCreated();        mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());    }

Activity.java-->onCreate()

    @MainThread    @CallSuper    protected void onCreate(@Nullable Bundle savedInstanceState) {        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);        if (mLastNonConfigurationInstances != null) {            mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders);        }        if (mActivityInfo.parentActivityName != null) {            if (mActionBar == null) {                mEnableDefaultActionBarUp = true;            } else {                mActionBar.setDefaultDisplayHomeAsUpEnabled(true);            }        }        if (savedInstanceState != null) {            mAutoFillResetNeeded = savedInstanceState.getBoolean(AUTOFILL_RESET_NEEDED, false);            mLastAutofillId = savedInstanceState.getInt(LAST_AUTOFILL_ID,                    View.LAST_APP_AUTOFILL_ID);            if (mAutoFillResetNeeded) {                getAutofillManager().onCreate(savedInstanceState);            }            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null                    ? mLastNonConfigurationInstances.fragments : null);        }        mFragments.dispatchCreate();        getApplication().dispatchActivityCreated(this, savedInstanceState);        if (mVoiceInteractor != null) {            mVoiceInteractor.attachActivity(this);        }        mRestoredFromBundle = savedInstanceState != null;        mCalled = true;    }

 

更多相关文章

  1. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  2. Android培训班(39)
  3. Android(安卓)4.2短信小记
  4. PowerManagerService sensor
  5. Android(安卓)Dagger2学习
  6. 将 Android(安卓)项目迁移至 Kotlin Coroutines
  7. Android保活/拉活(一)教程检索
  8. C语言函数的递归(上)
  9. Windows下编译使用Android(安卓)NDK,调用SO文件

随机推荐

  1. Android中文API(144) —— JsonWriter
  2. Android(安卓)Http协议访问网络实例(3种)
  3. Android EditView
  4. Android读取Word文档
  5. android 开机直接运行app并当做手机桌面
  6. Android中GPS定位的简单应用
  7. AIR Native Extension的使用(Android)一
  8. android源码下载方式
  9. Android Porting Environment Set
  10. Android调用.NET Webservice报org.ksoap2