APP的启动流程梳理

前言

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
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值