《Android 开发艺术探索》Activity工作过程阅读笔记


首先抛出一张图片,是我自己画的。后面有看不懂的,或者转迷糊的,可以来看看这张图

startActivity有很多种重载方法,但是最后都是调用了startActivityForResult方法。这点大家可以在activity源码中得到验证。这里我们就来看一下startActivityForResult的源码。

    public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {        if (mParent == null) {        //只需关注这里        //此处的ApplicationThread为AppThread的一个内部类。            Instrumentation.ActivityResult ar =                mInstrumentation.execStartActivity(                    this, mMainThread.getApplicationThread(), mToken, this,                    intent, requestCode, options);            if (ar != null) {                mMainThread.sendActivityResult(                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),                    ar.getResultData());            }            if (requestCode >= 0) {                // If this start is requesting a result, we can avoid making                // the activity visible until the result is received.  Setting                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the                // activity hidden during this time, to avoid flickering.                // This can only be done when a result is requested because                // that guarantees we will get information back when the                // activity is finished, no matter what happens to it.                mStartedActivity = true;            }            cancelInputsAndStartExitTransition(options);            // TODO Consider clearing/flushing other event sources and events for child windows.        } else {        //这里是ActivityGroup,用于在一个界面中嵌入多个activity。已经被废弃,被fragment替代。            if (options != null) {                mParent.startActivityFromChild(this, intent, requestCode, options);            } else {                // Note we want to go through this method for compatibility with                // existing applications that may have overridden it.                mParent.startActivityFromChild(this, intent, requestCode);            }        }    }

上面代码很明显就能看出真正启动acitivity的代码是execStartActivity。所以我们来看execStartActivity的代码

    public ActivityResult execStartActivity(            Context who, IBinder contextThread, IBinder token, Activity target,            Intent intent, int requestCode, Bundle options) {        IApplicationThread whoThread = (IApplicationThread) contextThread;        Uri referrer = target != null ? target.onProvideReferrer() : null;        if (referrer != null) {            intent.putExtra(Intent.EXTRA_REFERRER, referrer);        }        if (mActivityMonitors != null) {            synchronized (mSync) {                final int N = mActivityMonitors.size();                for (int i=0; i= 0 ? am.getResult() : null;                        }                        break;                    }                }            }        }        try {            intent.migrateExtraStreamToClipData();            intent.prepareToLeaveProcess();            //最后启动activity的代码在这里            int result = ActivityManagerNative.getDefault()                .startActivity(whoThread, who.getBasePackageName(), intent,                        intent.resolveTypeIfNeeded(who.getContentResolver()),                        token, target != null ? target.mEmbeddedID : null,                        requestCode, 0, null, options);            checkStartActivityResult(result, intent);        } catch (RemoteException e) {            throw new RuntimeException("Failure from system", e);        }        return null;    }

上面可以看到最终的启动代码是ActivityManagerNative.getDefault().startActivity。而getDefault的代码如下

    static public IActivityManager getDefault() {        return gDefault.get();    }        private static final Singleton gDefault = new Singleton() {        protected IActivityManager create() {        //这里大家看了有木有非常熟悉?其实就是和aidl通讯一毛一样。如果不清楚的朋友,        //可以看看我上一篇讲aidl的文章            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;        }    };    public abstract class Singleton {    private T mInstance;    protected abstract T create();    public final T get() {        synchronized (this) {            if (mInstance == null) {                mInstance = create();            }            return mInstance;        }    }}

这里可以看到getDefault是一个标准的单例模式(这里不禁抱怨一句,这么好用的单例模式,为啥子不暴露出来让我用,每次都让我自己手写,嘤嘤嘤)。然后根据书上说,这里最后获取的是ams(ActivityManagerService),ams继承自ActivityManagerNative,而ActivityManagerNative 继承自Binder,同时实现了IActivityManager方法。而Binder实现了IBinder接口。所以从本质上来说,AMS和ActivityManagerNative都是Binder的子类。所以这里我们看到ActivityManagerNative的很多方法都异常的眼熟,简直和AIDL通讯中一毛一样。

注意 :上面的代码可以看到最终ActivityManagerNative.getDefault() 获得的是一个IActivityManager的对象。而AMS继承自ActivityManagerNative,而ActivityMnagaerNative 实现了IActivityManager。所以AMS是这个IActivityManager的具体实现。所以最后消息肯定会传递到AMS中去,根据我们在前面Binder中看到的知识,

不过我们回头再看一下Instrumentation中的在执行完启动activity以后调用的checkStartActivityResult语句。从名称上判断好像是在检测activity的启动结果

    public static void checkStartActivityResult(int res, Object intent) {        if (res >= ActivityManager.START_SUCCESS) {            return;        }        switch (res) {            case ActivityManager.START_INTENT_NOT_RESOLVED:            case ActivityManager.START_CLASS_NOT_FOUND:                if (intent instanceof Intent && ((Intent)intent).getComponent() != null)                    throw new ActivityNotFoundException(                            "Unable to find explicit activity class "                            + ((Intent)intent).getComponent().toShortString()                            + "; have you declared this activity in your AndroidManifest.xml?");                throw new ActivityNotFoundException(                        "No Activity found to handle " + intent);            case ActivityManager.START_PERMISSION_DENIED:                throw new SecurityException("Not allowed to start activity "                        + intent);            case ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT:                throw new AndroidRuntimeException(                        "FORWARD_RESULT_FLAG used while also requesting a result");            case ActivityManager.START_NOT_ACTIVITY:                throw new IllegalArgumentException(                        "PendingIntent is not an activity");            case ActivityManager.START_NOT_VOICE_COMPATIBLE:                throw new SecurityException(                        "Starting under voice control not allowed for: " + intent);            case ActivityManager.START_VOICE_NOT_ACTIVE_SESSION:                throw new IllegalStateException(                        "Session calling startVoiceActivity does not match active session");            case ActivityManager.START_VOICE_HIDDEN_SESSION:                throw new IllegalStateException(                        "Cannot start voice activity on a hidden session");            case ActivityManager.START_CANCELED:                throw new AndroidRuntimeException("Activity could not be started for "                        + intent);            default:                throw new AndroidRuntimeException("Unknown error code "                        + res + " when starting " + intent);        }    }

事实就是如同我们预料的一样,这里就是检测activity的启动结果,然后分别抛出不同的异常。
按照书上所说,startActivity 最终会抛给AMS。但是根据我查看代码,发现了,并没有抛给AMS,而是直接抛给了ActivityManagaerNative的内部代理类,ActivityManagerProxy。所以接下来我们看下ActivityManagerProxy里面的代码

 public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,            String resolvedType, IBinder resultTo, String resultWho, int requestCode,            int startFlags, String profileFile,            ParcelFileDescriptor profileFd, Bundle options) throws RemoteException {        Parcel data = Parcel.obtain();        Parcel reply = Parcel.obtain();        data.writeInterfaceToken(IActivityManager.descriptor);        data.writeStrongBinder(caller != null ? caller.asBinder() : null);        data.writeString(callingPackage);        intent.writeToParcel(data, 0);        data.writeString(resolvedType);        data.writeStrongBinder(resultTo);        data.writeString(resultWho);        data.writeInt(requestCode);        data.writeInt(startFlags);        data.writeString(profileFile);        if (profileFd != null) {            data.writeInt(1);            profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);        } else {            data.writeInt(0);        }        if (options != null) {            data.writeInt(1);            options.writeToParcel(data, 0);        } else {            data.writeInt(0);        }        mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);        reply.readException();        int result = reply.readInt();        reply.recycle();        data.recycle();        return result;    }

这里的代码就是和aidl通讯的代码几乎一模一样了,进过系统底层的操作,我们最终会在ontransact中获取到我们传递过去的数据。
但是这里需要注意的一点就是,最终在ontransact中接受数据的进程,并不是我们自己应用程序的进程,而是AMS的进程,所以这里也就是如同书上所说的一样,最后将启动服务又抛给了AMS。
但是AMS是ActiviryManagerNative的子类,也并没有重写onTransact方法,所以最终我们还是来看下ActivityManagerNative中的onTransact方法的代码

/***注意,注意,这里已经运行在AMS所在的系统进程中了,不要像我一样傻傻的在应用程序中debug了,如果需要*debug查看源码的话,记得选择system_process来debug。**/    @Override    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)            throws RemoteException {        switch (code) {        case START_ACTIVITY_TRANSACTION:        {            data.enforceInterface(IActivityManager.descriptor);            IBinder b = data.readStrongBinder();            IApplicationThread app = ApplicationThreadNative.asInterface(b);            String callingPackage = data.readString();            Intent intent = Intent.CREATOR.createFromParcel(data);            String resolvedType = data.readString();            IBinder resultTo = data.readStrongBinder();            String resultWho = data.readString();            int requestCode = data.readInt();            int startFlags = data.readInt();            ProfilerInfo profilerInfo = data.readInt() != 0                    ? ProfilerInfo.CREATOR.createFromParcel(data) : null;            Bundle options = data.readInt() != 0                    ? Bundle.CREATOR.createFromParcel(data) : null;                    //重点是在这里,这里调用的就是AMS中的方法。            int result = startActivity(app, callingPackage, intent, resolvedType,                    resultTo, resultWho, requestCode, startFlags, profilerInfo, options);            reply.writeNoException();            reply.writeInt(result);            return true;        }        //....        }        return super.onTransact(code, data, reply, flags);    }

最后终于如书中描述一样,转到了AMS中的startActivity

    @Override    public final int startActivity(IApplicationThread caller, String callingPackage,            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,            int startFlags, ProfilerInfo profilerInfo, Bundle options) {        return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,            resultWho, requestCode, startFlags, profilerInfo, options,            UserHandle.getCallingUserId());    }    @Override    public final int startActivityAsUser(IApplicationThread caller, String callingPackage,            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,            int startFlags, ProfilerInfo profilerInfo, Bundle options, int userId) {        enforceNotIsolatedCaller("startActivity");        userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,                false, ALLOW_FULL_ONLY, "startActivity", null);        // TODO: Switch to user app stacks here.        return mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent,                resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,                profilerInfo, null, null, options, false, userId, null, null);    }

这里又将启动activity的重任交到了mStackSupervisor的startActivityMayWait方法中。startActivityMayWait中的代码比较多,这里我就不贴了。在这里最主要又调用startActivityLocked方法。在startActivityLocked中又调用了startActivityUncheckedLocked方法。之后又调用了targetStack.resumeTopActivityLocked。targetStack是ActivityStack的实例

    final boolean resumeTopActivityLocked(ActivityRecord prev) {        return resumeTopActivityLocked(prev, null);    }    final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {        if (mStackSupervisor.inResumeTopActivity) {            // Don't even start recursing.            return false;        }        boolean result = false;        try {            // Protect against recursion.            mStackSupervisor.inResumeTopActivity = true;            if (mService.mLockScreenShown == ActivityManagerService.LOCK_SCREEN_LEAVING) {                mService.mLockScreenShown = ActivityManagerService.LOCK_SCREEN_HIDDEN;                mService.updateSleepIfNeededLocked();            }            result = resumeTopActivityInnerLocked(prev, options);        } finally {            mStackSupervisor.inResumeTopActivity = false;        }        return result;    }

然后 很明显,又调用了resumeTopActivityInnerLocked方法,resumeTopActivityInnerLocked实在代码量也太大了,我们只需要知道resumeTopActivityInnerLocked中又调用了mStackSupervisor.startSpecificActivityLocked方法。

    void startSpecificActivityLocked(ActivityRecord r,            boolean andResume, boolean checkConfig) {        // Is this activity's application already running?        ProcessRecord app = mService.getProcessRecordLocked(r.processName,                r.info.applicationInfo.uid, true);        r.task.stack.setLaunchTime(r);        if (app != null && app.thread != null) {            try {                if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0                        || !"android".equals(r.info.packageName)) {                    // Don't add this if it is a platform component that is marked                    // to run in multiple processes, because this is actually                    // part of the framework so doesn't make sense to track as a                    // separate apk in the process.                    app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,                            mService.mProcessStats);                }                //真正调用的方法在这里                realStartActivityLocked(r, app, andResume, checkConfig);                return;            } catch (RemoteException e) {                Slog.w(TAG, "Exception when starting activity "                        + r.intent.getComponent().flattenToShortString(), e);            }            // If a dead object exception was thrown -- fall through to            // restart the application.        }        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,                "activity", r.intent.getComponent(), false, false, true);    }

而在realStartActivityLocked中最重要的语句,就是下面的这段话。

 app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,                    System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),                    new Configuration(stack.mOverrideConfig), r.compat, r.launchedFromPackage,                    task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,                    newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);

这里的thread要求实现接口IApplicationThread。这里我们去看看ApplicationThreadNative,ApplicationThreadNative继承自Binder并实现了IApplicationThread。
而ActivityThread.ApplicationThread 则继承了抽象类ApplicationThreadNative。所以ActivityThread.ApplicationThread是IApplicationThread接口的最终实现,所以最终app.thread.scheduleLaunchActivity调用的就是ActivityThread.ApplicationThread的方法。
由于ActivityThread.ApplicationThread继承自ApplicationThreadNative,并且并没有复写scheduleLaunchActivity方法,所以我们去看下ApplicationThreadNative中的scheduleLaunchActivity方法。

    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) throws RemoteException {        Parcel data = Parcel.obtain();        data.writeInterfaceToken(IApplicationThread.descriptor);        intent.writeToParcel(data, 0);        data.writeStrongBinder(token);        data.writeInt(ident);        info.writeToParcel(data, 0);        curConfig.writeToParcel(data, 0);        if (overrideConfig != null) {            data.writeInt(1);            overrideConfig.writeToParcel(data, 0);        } else {            data.writeInt(0);        }        compatInfo.writeToParcel(data, 0);        data.writeString(referrer);        data.writeStrongBinder(voiceInteractor != null ? voiceInteractor.asBinder() : null);        data.writeInt(procState);        data.writeBundle(state);        data.writePersistableBundle(persistentState);        data.writeTypedList(pendingResults);        data.writeTypedList(pendingNewIntents);        data.writeInt(notResumed ? 1 : 0);        data.writeInt(isForward ? 1 : 0);        if (profilerInfo != null) {            data.writeInt(1);            profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);        } else {            data.writeInt(0);        }        //这是最终通过binder,又把消息传递到应用进程了        mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null,                IBinder.FLAG_ONEWAY);        data.recycle();    }

有了binder的知识,和上面的经验,我们现在只需要去onTransact方法,中找到SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION的代码就行

//注意,这里其实已经是运行在应用自己的进程了,而不是系统的进程        case SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION:        {            data.enforceInterface(IApplicationThread.descriptor);            Intent intent = Intent.CREATOR.createFromParcel(data);            IBinder b = data.readStrongBinder();            int ident = data.readInt();            ActivityInfo info = ActivityInfo.CREATOR.createFromParcel(data);            Configuration curConfig = Configuration.CREATOR.createFromParcel(data);            Configuration overrideConfig = null;            if (data.readInt() != 0) {                overrideConfig = Configuration.CREATOR.createFromParcel(data);            }            CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);            String referrer = data.readString();            IVoiceInteractor voiceInteractor = IVoiceInteractor.Stub.asInterface(                    data.readStrongBinder());            int procState = data.readInt();            Bundle state = data.readBundle();            PersistableBundle persistentState = data.readPersistableBundle();            List ri = data.createTypedArrayList(ResultInfo.CREATOR);            List pi = data.createTypedArrayList(ReferrerIntent.CREATOR);            boolean notResumed = data.readInt() != 0;            boolean isForward = data.readInt() != 0;            ProfilerInfo profilerInfo = data.readInt() != 0                    ? ProfilerInfo.CREATOR.createFromParcel(data) : null;                    //这里最终调用了ActivityThread.ApplicationThread 中的方法            scheduleLaunchActivity(intent, b, ident, info, curConfig, overrideConfig, compatInfo,                    referrer, voiceInteractor, procState, state, persistentState, ri, pi,                    notResumed, isForward, profilerInfo);            return true;        }
 @Override        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);//这里其实就是给了一个叫mH的handler发了一个消息            sendMessage(H.LAUNCH_ACTIVITY, r);        }    private void sendMessage(int what, Object obj) {        sendMessage(what, obj, 0, 0, false);    }    private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {        if (DEBUG_MESSAGES) Slog.v(            TAG, "SCHEDULE " + what + " " + mH.codeToString(what)            + ": " + arg1 + " / " + obj);        Message msg = Message.obtain();        msg.what = what;        msg.obj = obj;        msg.arg1 = arg1;        msg.arg2 = arg2;        if (async) {            msg.setAsynchronous(true);        }        mH.sendMessage(msg);    }

然后来看看,这个叫H的handler对于消息的处理。

public void handleMessage(Message msg) {            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));            switch (msg.what) {                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;                //....                }                //....                }

很明显调用了handleLaunchActivity方法.

    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;            //调用了Activity的resume            handleResumeActivity(r.token, false, r.isForward,                    !r.activity.mFinished && !r.startsNotResumed);                    //...        }         //....
    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {        // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");//******************************************************这里获取的是待启动Activity的组件信息**************************************//        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);        }//**********************************************通过mInstrumentation的newActivity的方法使用类加载器创建Activity对象**************************************//        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 {        //通过makeApplication来尝试创建Application            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                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);                  //初始化重要数据,并建立context和activity的关联                 //此处还会完成window的创建,并建立和window的关联                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;                //此处调用oncreate方法                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.activity = activity;                r.stopped = true;                if (!r.activity.mFinished) {                //此处调用了activity的onstart()方法。                    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);        }         //....        return activity;    }
public Application makeApplication(boolean forceDefaultAppClass,            Instrumentation instrumentation) {        if (mApplication != null) {        //如果application已经存在,就不在创建,直接返回            return mApplication;        }        Application app = null;        String appClass = mApplicationInfo.className;        if (forceDefaultAppClass || (appClass == null)) {            appClass = "android.app.Application";        }        try {            java.lang.ClassLoader cl = getClassLoader();            if (!mPackageName.equals("android")) {                initializeJavaContextClassLoader();            }            ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);            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 {            //这里调用了Application的oncreate方法                instrumentation.callApplicationOnCreate(app);            } catch (Exception e) {                if (!instrumentation.onException(app, e)) {                    throw new RuntimeException(                        "Unable to create application " + app.getClass().getName()                        + ": " + e.toString(), e);                }            }        }        // Rewrite the R 'constants' for all library apks.        SparseArray packageIdentifiers = getAssets(mActivityThread)                .getAssignedPackageIdentifiers();        final int N = packageIdentifiers.size();        for (int i = 0; i < N; i++) {            final int id = packageIdentifiers.keyAt(i);            if (id == 0x01 || id == 0x7f) {                continue;            }            rewriteRValues(getClassLoader(), packageIdentifiers.valueAt(i), id);        }        return app;    }

可以看到在handleLaunchActivity.performLaunchActivity() 中,创建了activity,并且调用了activity中的oncreate和onStart方法。

那么我们接下来查看执行了onresume方法的handleLaunchActivity.handleResumeActivity 方法

    final void handleResumeActivity(IBinder token,            boolean clearHide, boolean isForward, boolean reallyResume) {        // If we are getting ready to gc after going to the background, well        // we are back active so skip it.        unscheduleGcIdler();        mSomeActivitiesChanged = true;        // TODO Push resumeArgs into the activity for consideration        //此处会去执行onresume方法        ActivityClientRecord r = performResumeActivity(token, clearHide);        if (r != null) {            final Activity a = r.activity;            //.....            if (r.window == null && !a.mFinished && willBeVisible) {                r.window = r.activity.getWindow();                View decor = r.window.getDecorView();                decor.setVisibility(View.INVISIBLE);                ViewManager wm = a.getWindowManager();                WindowManager.LayoutParams l = r.window.getAttributes();                a.mDecor = decor;                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;                l.softInputMode |= forwardBit;                if (a.mVisibleFromClient) {                    a.mWindowAdded = true;                    //这里将decorView 添加到phoneWindow中                    wm.addView(decor, l);                }            // If the window has already been added, but during resume            // we started another activity, then don't yet make the            // window visible.            } else if (!willBeVisible) {                if (localLOGV) Slog.v(                    TAG, "Launch " + r + " mStartedActivity set");                r.hideForNow = true;            }            //......        }     }

通过上面的代码,我们可以发现,在onresume执行之后,整个界面才将decorView 添加到phoneWindow中,才开始整个界面的测量和绘制。

所以,我们在onCreate ,onStart , onResume中 去获取view 的宽高,都是无法获取到的。因为整个界面都还没有绑定到phoneWindow 中。

接下来,我们继续深究performResumeActivity 方法

    public final ActivityClientRecord performResumeActivity(IBinder token,            boolean clearHide) {        ActivityClientRecord r = mActivities.get(token);        if (r != null && !r.activity.mFinished) {//...                //这里调用activity中的performResume                r.activity.performResume();           //.....            }        }        return r;    }

我们继续看activity中的performResume

    final void performResume() {    //这里会判断是否调用onRestart        performRestart();        mFragments.execPendingActions();        mLastNonConfigurationInstances = null;        mCalled = false;        // mResumed is set by the instrumentation        //这里和前面的onStart生命周期一样,都是被mInstrumentation调用。这里调用onresume。        mInstrumentation.callActivityOnResume(this);   //...        // Now really resume, and install the current status bar and menu.        mCalled = false;        mFragments.dispatchResume();        mFragments.execPendingActions();        onPostResume();    }
    public void callActivityOnResume(Activity activity) {        activity.mResumed = true;        activity.onResume();                if (mActivityMonitors != null) {            synchronized (mSync) {                final int N = mActivityMonitors.size();                for (int i=0; i

通过上面的代码, 我们可以发现,restart方法,如果被调用的话,是在resume方法之前。

更多相关文章

  1. Android事件总线(二)EventBus3.0源码解析
  2. Android(安卓)UI—仿微信底部导航栏布局
  3. Android进阶(三)ButterKnife源码解析
  4. android代码中打开系统设置界面 .
  5. Android(安卓)电话涉及到的几个类备注
  6. 小游戏Mixed Color源代码分享
  7. 【Android】: 部分注意事项
  8. ListView去掉默认点击效果
  9. Android活动进出场动画

随机推荐

  1. Android(安卓)EditText inputType属性
  2. 更简单的学习Android事件分发
  3. 如何提高Android的性能
  4. android中圆角的bug
  5. 从Android中Activity之间的通信说开来
  6. Android(安卓)TextView的滑动
  7. Android(安卓)Studio打不开的问题
  8. Android启动过程分析(1)
  9. android 线程优先级设置
  10. TextView 最多显示2行,每行最多8个字,多余