前言
AMS是系统的引导服务,应用进程的启动、切换和调度、四大组件的启动和管理都需要AMS的支持。Android应用各个组件都是通过AMS调度,Android进程也是AMS创建,Android应用程序启动之前先启动进程,然后启动对应的Activity
AMS框架
从Launcher开始
应用启动可以通过adb启动,可以通过其他应用启动(包括Launcher),也可以通过监听广播启动。一般启动一个Android应用都是从Launcher开始,通过点击桌面图标启动一个应用程序。
- 点击Launcher启动图标,执行Activity的startActivityForResults
Activity.java
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
...
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);...
...
}
- startActivityForResults中Instrumentation对象执行execStartActivity,其中注意mMainThread.getApplicationThread()这个参数,这个是所启动这个Activity应用里面的ApplicationThread,继承IApplicationThread.Stub,显然这是一个用于跨进程通讯的类.其中ApplicationThread是服务端,它传输到AMS,那么AMS对于ApplicationThread就是客户端.因为Binder是客户服务模式,只能从客户端主动请求,传入对于binder到AMS客户让AMS能够主动与应用交互,
- execStartActivity中通过ActivityManger与ActivityManagerService跨进程通讯
Instrumentation.java
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, String resultWho,
Intent intent, int requestCode, Bundle options, UserHandle user) {
IApplicationThread whoThread = (IApplicationThread) contextThread; //1
...
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
int result = ActivityManager.getService() //2
.startActivityAsUser(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, resultWho,
requestCode, 0, null, options, user.getIdentifier());
checkStartActivityResult(result, intent);