前言
2022年的第一篇分享文章,整整一周,利用晚上下班时间梳理了桌面点击APP到打开的流程,可以说看似简简单单的一个操作,里边的过程相当复杂,各种进程间通信等等,下面我们一起看看整个流程是怎么样的。
正文
我们先通过一张图来看整个流程的一个概览:
startActivity
桌面点击app到打开,涉及了三个进程,分别如下:
Launcher进程:它是一个Activity,可以把桌面看成是一个app,里边有多个啊、其他app的入口,当点击app图标时,就会去启动对应的app,并且跳转至页面。
SystemServer进程:在Android系统中有着重要的作用,由Zygote进程fork出来,许多重要的服务,都是在此进程开启的,例如ActivityManagerService、InputManagerService和WindowManagerService等等。
APP进程:我们要启动的app的进程。
startActivity
首先我们从startActivity开始,startActivity最终会调用startActivityForResult:
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
if (mParent == null) {
options = transferSpringboardActivityOptions(options);
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options);
//...
} else {
//...
}
}
在这里我们先了解一下Instrumentation,每个Activity都会持有一个Instrumentation引用,整个进程只会有一个Instrumentation的实例,它主要是完成对Application和Activity初始化和生命周期的工具类。
我们可以看到,里边调用了mInstrumentation的execStartActivity方法,其中的核心代码如下:
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
//...
try {
//...
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getBasePackageName(), who.getAttributionTag