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

com.android.server.am.ActivityManagerService#onTransact


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

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


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();
}

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

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

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


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


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);

然后后续的onResume ,onPause

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

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

com.android.server.am.ActivityManagerService#activityIdle
com.android.server.am.ActivityStackSupervisor#activityIdleInternalLocked

com.android.server.am.ActivityStack#stopActivityLocked

最终总结一下:
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,所以这里要注意一下

进入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

通过Handler机制

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的逻辑
