AndroidActivity 是如何启动的?
Activity的生命周期是如何调用的?

在Android中有一个ActivityThread类,这个可以看成是app的主线程类,在Java中我们启动程序的入口是 main()方法,在Android中,APP启动时,会调用ctivityThread中的main()方法。

  public static void main(String[] args) {        Trace.traceBegin(64L, "ActivityThreadMain");        CloseGuard.setEnabled(false);        Environment.initForCurrentUser();        EventLogger.setReporter(new ActivityThread.EventLoggingReporter(null));        File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());        TrustedCertificateStore.setDefaultUserDirectory(configDir);        Process.setArgV0("");        Looper.prepareMainLooper();        ActivityThread thread = new ActivityThread();        thread.attach(false);        if (sMainThreadHandler == null) {            sMainThreadHandler = thread.getHandler();        }        Trace.traceEnd(64L);        Looper.loop();        throw new RuntimeException("Main thread loop unexpectedly exited");    }复制代码

这里重点看两点:

  1. Looper.prepareMainLooper();
    Looper.loop();
    开启一个Looper,进行消息轮询。负责发送消息。
  2. 创建一个ActivityThread 并调用了attach()方法。
ActivityThread thread = new ActivityThread();thread.attach(false);复制代码

attach()

private void attach(boolean system) {            ...            final IActivityManager mgr = ActivityManager.getService();            try {                mgr.attachApplication(this.mAppThread);            } catch (RemoteException var5) {                throw var5.rethrowFromSystemServer();            }            ...        }复制代码

这里我们只看关键代码,通过ActivityManager.getService(),生成一个IActivityManager的对象,我们接下来看

ActivityManager.getService()

 public static IActivityManager getService() {        return (IActivityManager)IActivityManagerSingleton.get();    }        private static final Singleton IActivityManagerSingleton = new Singleton() {        protected IActivityManager create() {            IBinder b = ServiceManager.getService("activity");            IActivityManager am = Stub.asInterface(b);            return am;        }    };复制代码

这里我们看到通过ServiceManager.getService()生成一个Binder,然后通过binder接口通讯。最后将生成的ActivityManager返回出去,ActivityManager是由系统服务所调用管理,并且通过在binder接口当中进行调用。
接着我们看attach()中的attachApplication(this.mAppThread); 这里的mAppThread是: final ActivityThread.ApplicationThread mAppThread = new ActivityThread.ApplicationThread(null); 再看一下ApplicationThread 这是一个ActivityThread的内部类。

    private class ApplicationThread extends android.app.IApplicationThread.Stub {        ...        }public interface IApplicationThread extends IInterface {    void schedulePauseActivity(IBinder var1, boolean var2, boolean var3, int var4, boolean var5) throws RemoteException;    void scheduleStopActivity(IBinder var1, boolean var2, int var3) throws RemoteException;    void scheduleWindowVisibility(IBinder var1, boolean var2) throws RemoteException;    void scheduleResumeActivity(IBinder var1, int var2, boolean var3, Bundle var4) throws RemoteException;    void scheduleSendResult(IBinder var1, List var2) throws RemoteException;    void scheduleLaunchActivity(Intent var1, IBinder var2, int var3, ActivityInfo var4, Configuration var5, Configuration var6, CompatibilityInfo var7, String var8, IVoiceInteractor var9, int var10, Bundle var11, PersistableBundle var12, List var13, List var14, boolean var15, boolean var16, ProfilerInfo var17) throws RemoteException;    void scheduleNewIntent(List var1, IBinder var2, boolean var3) throws RemoteException;    void scheduleDestroyActivity(IBinder var1, boolean var2, int var3) throws RemoteException;    void scheduleReceiver(Intent var1, ActivityInfo var2, CompatibilityInfo var3, int var4, String var5, Bundle var6, boolean var7, int var8, int var9) throws RemoteException;    void scheduleCreateService(IBinder var1, ServiceInfo var2, CompatibilityInfo var3, int var4) throws RemoteException;    void scheduleStopService(IBinder var1) throws RemoteException;    void bindApplication(String var1, ApplicationInfo var2, List var3, ComponentName var4, ProfilerInfo var5, Bundle var6, IInstrumentationWatcher var7, IUiAutomationConnection var8, int var9, boolean var10, boolean var11, boolean var12, boolean var13, Configuration var14, CompatibilityInfo var15, Map var16, Bundle var17, String var18) throws RemoteException;    void scheduleExit() throws RemoteException;    void scheduleConfigurationChanged(Configuration var1) throws RemoteException;    void scheduleServiceArgs(IBinder var1, ParceledListSlice var2) throws RemoteException;    void updateTimeZone() throws RemoteException;    void processInBackground() throws RemoteException;    void scheduleBindService(IBinder var1, Intent var2, boolean var3, int var4) throws RemoteException;    void scheduleUnbindService(IBinder var1, Intent var2) throws RemoteException;    void dumpService(ParcelFileDescriptor var1, IBinder var2, String[] var3) throws RemoteException;    void scheduleRegisteredReceiver(IIntentReceiver var1, Intent var2, int var3, String var4, Bundle var5, boolean var6, boolean var7, int var8, int var9) throws RemoteException;    void scheduleLowMemory() throws RemoteException;    void scheduleActivityConfigurationChanged(IBinder var1, Configuration var2) throws RemoteException;    void scheduleActivityMovedToDisplay(IBinder var1, int var2, Configuration var3) throws RemoteException;    void scheduleRelaunchActivity(IBinder var1, List var2, List var3, int var4, boolean var5, Configuration var6, Configuration var7, boolean var8) throws RemoteException;    void scheduleSleeping(IBinder var1, boolean var2) throws RemoteException;    void profilerControl(boolean var1, ProfilerInfo var2, int var3) throws RemoteException;    void setSchedulingGroup(int var1) throws RemoteException;    void scheduleCreateBackupAgent(ApplicationInfo var1, CompatibilityInfo var2, int var3) throws RemoteException;    void scheduleDestroyBackupAgent(ApplicationInfo var1, CompatibilityInfo var2) throws RemoteException;    void scheduleOnNewActivityOptions(IBinder var1, Bundle var2) throws RemoteException;    void scheduleSuicide() throws RemoteException;    void dispatchPackageBroadcast(int var1, String[] var2) throws RemoteException;    void scheduleCrash(String var1) throws RemoteException;    void dumpHeap(boolean var1, boolean var2, boolean var3, String var4, ParcelFileDescriptor var5) throws RemoteException;    void dumpActivity(ParcelFileDescriptor var1, IBinder var2, String var3, String[] var4) throws RemoteException;    void clearDnsCache() throws RemoteException;    void setHttpProxy(String var1, String var2, String var3, Uri var4) throws RemoteException;    void setCoreSettings(Bundle var1) throws RemoteException;    void updatePackageCompatibilityInfo(String var1, CompatibilityInfo var2) throws RemoteException;    void scheduleTrimMemory(int var1) throws RemoteException;    void dumpMemInfo(ParcelFileDescriptor var1, MemoryInfo var2, boolean var3, boolean var4, boolean var5, boolean var6, boolean var7, String[] var8) throws RemoteException;    void dumpGfxInfo(ParcelFileDescriptor var1, String[] var2) throws RemoteException;    void dumpProvider(ParcelFileDescriptor var1, IBinder var2, String[] var3) throws RemoteException;    void dumpDbInfo(ParcelFileDescriptor var1, String[] var2) throws RemoteException;    void unstableProviderDied(IBinder var1) throws RemoteException;    void requestAssistContextExtras(IBinder var1, IBinder var2, int var3, int var4, int var5) throws RemoteException;    void scheduleTranslucentConversionComplete(IBinder var1, boolean var2) throws RemoteException;    void setProcessState(int var1) throws RemoteException;    void scheduleInstallProvider(ProviderInfo var1) throws RemoteException;    void updateTimePrefs(int var1) throws RemoteException;    void scheduleEnterAnimationComplete(IBinder var1) throws RemoteException;    void notifyCleartextNetwork(byte[] var1) throws RemoteException;    void startBinderTracking() throws RemoteException;    void stopBinderTrackingAndDump(ParcelFileDescriptor var1) throws RemoteException;    void scheduleMultiWindowModeChanged(IBinder var1, boolean var2, Configuration var3) throws RemoteException;    void schedulePictureInPictureModeChanged(IBinder var1, boolean var2, Configuration var3) throws RemoteException;    void scheduleLocalVoiceInteractionStarted(IBinder var1, IVoiceInteractor var2) throws RemoteException;    void handleTrustStorageUpdate() throws RemoteException;    void attachAgent(String var1) throws RemoteException;    void scheduleApplicationInfoChanged(ApplicationInfo var1) throws RemoteException;    void setNetworkBlockSeq(long var1) throws RemoteException;public abstract static class Stub extends Binder implements IApplicationThread {复制代码

可以看到ApplicationThread继承自IApplicationThread.Stub,来实现管理activity生命周期的类。 attachApplication在这里的作用其实实际上是ActivityThread通过attach获取到,然后将applciationThread将其关联,把activity相关信息存储在applciationThread里面,apllicationThread的类为activity的各种状态做了相对应的准备工作。


当我们打开ApplicationThread中我们会看到一堆的schedle方法,这些方法的名称其实就可以给我们表明,代表的是在执行Activity的某种状态时调用的计划执行方法

这时我们会看到一个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) {            this.updateProcessState(procState, false);            ActivityThread.ActivityClientRecord r = new ActivityThread.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;            this.updatePendingConfiguration(curConfig);            ActivityThread.this.sendMessage(H.LAUNCH_ACTIVITY, r);        }                    private class H extends Handler {        public static final int LAUNCH_ACTIVITY = 100;复制代码

最后我们看见ActivityThread.this.sendMessage(100, r);通过handler发送了一个消息 LAUNCH_ACTIVITY 这里就是启动activity了 我们看handleMessage()的 handleLaunchActivity()方法

 public void handleMessage(Message msg) {            ActivityThread.ActivityClientRecord r;            SomeArgs args;            switch(msg.what) {            case 100:                Trace.traceBegin(64L, "activityStart");                r = (ActivityThread.ActivityClientRecord)msg.obj;                r.packageInfo = ActivityThread.this.getPackageInfoNoCheck(r.activityInfo.applicationInfo, r.compatInfo);                ActivityThread.this.handleLaunchActivity(r, (Intent)null, "LAUNCH_ACTIVITY");                Trace.traceEnd(64L);                break;                ...              }              }       private void handleLaunchActivity(ActivityThread.ActivityClientRecord r, Intent customIntent, String reason) {        this.unscheduleGcIdler();        this.mSomeActivitiesChanged = true;        if (r.profilerInfo != null) {            this.mProfiler.setProfiler(r.profilerInfo);            this.mProfiler.startProfiling();        }        this.handleConfigurationChanged((Configuration)null, (CompatibilityInfo)null);        if (!ThreadedRenderer.sRendererDisabled) {            GraphicsEnvironment.earlyInitEGL();        }        WindowManagerGlobal.initialize();        Activity a = this.performLaunchActivity(r, customIntent);        if (a != null) {            r.createdConfig = new Configuration(this.mConfiguration);            this.reportSizeConfigurations(r);            Bundle oldState = r.state;            this.handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);            if (!r.activity.mFinished && r.startsNotResumed) {                this.performPauseActivityIfNeeded(r, reason);                if (r.isPreHoneycomb()) {                    r.state = oldState;                }            }        } else {            try {                ActivityManager.getService().finishActivity(r.token, 0, (Intent)null, 0);            } catch (RemoteException var6) {                throw var6.rethrowFromSystemServer();            }        }    }复制代码

上面我们看到Activity a = this.performLaunchActivity(r, customIntent);

    private Activity performLaunchActivity(ActivityThread.ActivityClientRecord r, Intent customIntent) {        ...        Activity activity = null;        try {            ClassLoader cl = appContext.getClassLoader();            activity = this.mInstrumentation.newActivity(cl, component.getClassName(), r.intent);        ...        }        try {          ...                activity.mCalled = false;                if (r.isPersistable()) {                    this.mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);                } else {                    this.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) {                            this.mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state, r.persistentState);                        }                    } else if (r.state != null) {                        this.mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);                    }                }                if (!r.activity.mFinished) {                    activity.mCalled = false;                    if (r.isPersistable()) {                        this.mInstrumentation.callActivityOnPostCreate(activity, r.state, r.persistentState);                    } else {                        this.mInstrumentation.callActivityOnPostCreate(activity, r.state);                    }                    if (!activity.mCalled) {                        throw new SuperNotCalledException("Activity " + r.intent.getComponent().toShortString() + " did not call through to super.onPostCreate()");                    }                }            }            ...        }        return activity;    }复制代码

到此我们看到,根据不同情况来调用activity不同的生命周期的方法。

总结:

Application运行的过程当中,对于Activity的操作,状态转变,其实实际上是通过Handler消息机制来完成的,

Application当中只管去发, 由消息机制负责调用,因为在main方法当中我门的Looper轮训器是一直在进行轮训的

而当我们在加载Activity的时候,当中调用了一个performLaunchActivity()方法,在这个中间我发现了我们onCreate的调用痕迹。

参考:原文传送门,感谢BarryKerwin 老师。留做笔记使用。

转载于:https://juejin.im/post/5b1f75e7f265da6e2a08bd46

更多相关文章

  1. 《第一行代码--Android》学习笔记--第一章:开始起航:思路
  2. android有用代码片段(1)
  3. android视频截屏&手机录屏实现代码
  4. Android Activity启动和退出过程中onResume()方法的回调
  5. Android混淆代码
  6. andorid跳过系统API获取以太网IP,网关,DNS,MAC的方法
  7. 【Android】关联source code的方法
  8. Android热修复原理(一)热修复框架对比和代码修复

随机推荐

  1. Android(安卓)创建与解析XML(一)---- SAX方
  2. Android:触摸移动的悬浮窗口
  3. Android线程模型(Painless Threading) ---
  4. android上消息推送的实现
  5. TableLayout中stretchColumns、shrinkCol
  6. android ListView分页加载
  7. 社区开放任务指南-3209-HTML5在Android上
  8. Android中TextView的内容展示不全的问题
  9. 使用QtCreator加速Android(安卓)NDK开发
  10. Android在开发中的实用技巧之Parcelable