ActivityThreadMain

android.app.ActivityThread#main
1、创建MainLooper
2、创建出来ActivityThread实例 并调用其 attach方法

 ActivityThread thread = new ActivityThread();
 thread.attach(false);

3、默认值为 false,意味着 普通应用进程。
SystemServer 或一些系统级服务进程会把它置为 true,表示 这是系统线程,不是普通应用进程

boolean mSystemThread = false;

4、把ApplicationThread传给 ActivityMangerService(AMS)它的主要租用就是:因为它也是一个Binder,当AMS把任务结果给当前应用时需要借助 ApplicationThread

  RuntimeInit.setApplicationObject(mAppThread.asBinder());
            final IActivityManager mgr = ActivityManagerNative.getDefault();  //返回的是ActivityManagerProxy
            try {
                mgr.attachApplication(mAppThread);
            } catch (RemoteException ex) {
                // Ignore
            }

android.app.ActivityManagerProxy#attachApplication


image.png

com.android.server.am.ActivityManagerService#onTransact


image.png

image.png

com.android.server.am.ActivityManagerService#attachApplication (记这里是跑到了AMS不是在 ActivityManagerProxy)
com.android.server.am.ActivityManagerService#attachApplicationLocked
image.png

到这里基本上大家都能看得懂了,Handler机制嘛
image.png

image.png

android.app.ActivityThread#handleBindApplication
主要作用把Application创建出来,并回调其onCreate方法,加载apk信息,安装应用中的ContentProvider
严苛模式的判断?
那么问题来了,在安卓的各个版本上 网络请求在主线程一定会崩溃吗?

 /**
         * For apps targetting SDK Honeycomb or later, we don't allow
         * network usage on the main event loop / UI thread.
         *
         * Note to those grepping:  this is what ultimately throws
         * NetworkOnMainThreadException ...
         */
        if (data.appInfo.targetSdkVersion > 9) {
            StrictMode.enableDeathOnNetwork();
        }

image.png

android.app.Instrumentation#callApplicationOnCreate
为什么说ContentProvider执行在Application.onCreate之前,看下面截图就知道了
正常情况下 restrictedBackupMode = false为false,如果 Backup/Restore 模式 则会走
image.png

Application创建后 apk info加载后开始启动MainActivity (注意在AMS的 attachApplicationLocked 里是包含handleBindApplication的逻辑的)
image.png

C:/Developer/Sdk/sources/android-23/com/android/server/am/ActivityStackSupervisor.java:611
image.png

image.png

上面的app.thread,就是在ActivityThread 中传入的 ApplicationThread
image.png

image.png

android.app.ActivityThread.ApplicationThread#scheduleLaunchActivity
然后在ActivityThread的内部类的Handler接收消息处理
android.app.ActivityThread#handleLaunchActivity
android.app.ActivityThread#performLaunchActivity
这个方法的作用:
1、创建Activity Acitivty.attch与Application绑定
2、通过 mInstrumentation 最终回调Activity的onCreate

流程是:
android.app.Instrumentation#callActivityOnCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle)
android.app.Instrumentation#callActivityOnCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle)
android.app.Activity#performCreate(android.os.Bundle)
android.app.Activity#onCreate(android.os.Bundle) (最终回调Activity的onCreate方法)

 if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }

这是Activity的onCreate,onStart的回调,attach除外

Activity a = performLaunchActivity(r, customIntent);
image.png

然后后续的onResume ,onPause


image.png

让人懵逼的地方是 onCreate、onStart、onResume、onPause都可以找得到,但 onStop onDestory找不到了?


image.png

在一个Activity被Resume之前把之前的Activity stop 或Destory掉
image.png

com.android.server.am.ActivityManagerService#activityIdle

com.android.server.am.ActivityStackSupervisor#activityIdleInternalLocked


image.png

com.android.server.am.ActivityStack#stopActivityLocked
image.png

最终总结一下:

com.android.internal.os.ZygoteConnection#handleChildProc
com.android.internal.os.RuntimeInit#zygoteInit
com.android.internal.os.RuntimeInit#applicationInit
com.android.internal.os.RuntimeInit#invokeStaticMain
com.android.internal.os.ZygoteInit.MethodAndArgsCaller#run
ActivityThread.main
创建MainLooper
实例化 ActivityThread
android.app.ActivityThread#attach
1、给 sCurrentActivityThread赋值就是main方法中new出来的ActivityThread
2、mgr是 ActivityManagerProxy类型(App进程),它持有了 mRemote这个AMS在Binder驱动中的代码对象

final IActivityManager mgr = ActivityManagerNative.getDefault();
            try {
                mgr.attachApplication(mAppThread);
            } catch (RemoteException ex) {
                // Ignore
            }

android.app.ActivityManagerProxy#attachApplication 通过 mRemote这个AMS的驱动中的代码对象发送数据

public void attachApplication(IApplicationThread app) throws RemoteException
    {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeStrongBinder(app.asBinder());
        mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
    }

AMS的onTransact中调用了super.onTransact又传回了 android.app.ActivityManagerNative#onTransact
其实当前的this已经变成了AMS,所以这里要注意一下


image.png

进入AMS的attatchApplication

 @Override
    public final void attachApplication(IApplicationThread thread) {
        synchronized (this) {
            int callingPid = Binder.getCallingPid();
            final long origId = Binder.clearCallingIdentity();
            attachApplicationLocked(thread, callingPid);
            Binder.restoreCallingIdentity(origId);
        }
    }

com.android.server.am.ActivityManagerService#attachApplicationLocked*
1、关键代码,在这里借助了 ApplicationThread又回到了App进程了

  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());
            updateLruProcessLocked(app, false, null);

android.app.ActivityThread.ApplicationThread#bindApplication


image.png

通过Handler机制


image.png

android.app.ActivityThread#handleBindApplication
创建出application,同时安装内容提供者,并回调Application的onCreate

2、关键代码

 // See if the top visible activity is waiting to run in this process...
        if (normalMode) {
            try {
                if (mStackSupervisor.attachApplicationLocked(app)) {
                    didSomething = true;
                }
            } catch (Exception e) {
                Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
                badApp = true;
            }
        }

com.android.server.am.ActivityStackSupervisor#attachApplicationLocked
com.android.server.am.ActivityStackSupervisor#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);

最终还会调到ApplicationThread.scheduleLaunchActivity
android.app.ActivityThread#handleLaunchActivity
android.app.ActivityThread#performLaunchActivity (attach、onCreate,onStart,onResume)
基中在onResume前,有onStop和onDestory的逻辑


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容