android 技术梳理

Android 进阶解密读书笔记3

2021-01-25  本文已影响0人  jkwen

四大组件之 Activity 启动流程

想要启动应用的 Activity 首先得要保证该应用的进程已经启动。

Launcher 发起
即当用户点击桌面上的应用图标时,实际就是调用了 Launcher 的 startActivitySafely 方法。该方法主要作用就是设置将要启动的 Activity 的启动方式 Intent.FLAG_ACTIVITY_NEW_TASK

转至 Instrumentation
Instrumentation 类的作用是帮我们关注着系统与应用的交互。接下来就会通过 Instrumentation 对象调用 execStartActivity 方法。在这个方法中会去获取 AMS 的代理对象,通过代理来执行 AMS 中的方法。

public ActivityResult execStartActivity(Context who, IBinder contextThread, 
IBinder token, Activity target,Intent intent, int requestCode, Bundle options) {
    //省略...
    try {
        intent.migrateExtraStreamToClipData();
        intent.prepareToLeaveProcess(who);
        //通过这步可知调用的是 AMS 的 startActivity 方法
        int result = ActivityManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
            checkStartActivityResult(result, intent);
    } catch() {
        //省略...
    }
    //省略...
}

这样一来启动 Activity 的响应就从用户点击到了 AMS 这里了,我们继续往下。

AMS 的 startActivity
AMS 的 startActivity 方法其实并没有做什么,而是调用了 startActivityAsUser 主要做了用户权限的判断,看看是否可以正常调用继续往下走。

转至 ActivityStarter
权限校验通过后,接着会调用 ActivityStarter 对象的 startActivityMayWaitstartActivityLocked 方法。关于 ActivityStarter,类注释是这么说的,指明怎样及何时启动 Activity,是一个控制器类。那么大致思路是经过它 Activity 就确定了启动参数以及启动时机。

ActivityStackSupervisor 和 ActivityStack
经过几层调用后,就会来到 ActivityStackSupervisor,并调用 ActivityStackSupervisor 对象的 resumeFocusedStackTopActivityLocked 方法,中间再通过 ActivityStack 对象方法的调用,最终又回到 ActivityStackSupervisor 中,调用 startSpecificActivityLocked 方法。

void startSpecificActivityLocked(ActivityRecord r,boolean andResume, 
    boolean checkConfig) {
    // Is this activity's application already running?
    //这句很关键,通过 AMS 判断应用程序进程是否已就绪
    ProcessRecord app = mService.getProcessRecordLocked(r.processName,
                r.info.applicationInfo.uid, true);
    //省略...
    if (app != null && app.thread != null) {
        //省略...
        //这里接下去就会跳转到应用程序进程中执行 Activity 的启动
        realStartActivityLocked(r, app, andResume, checkConfig);
        return;
        //省略...
    }
    //这里熟悉吗?不就是我们之前在看启动应用程序进程的入口么
    mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
                "activity", r.intent.getComponent(), false, false, true);
}

到这里,AMS 的使命差不多就完成了,接下去就要交给应用程序进程来处理了。

ActivityThread
前面说到,realStartActivityLocked 方法内会切换到应用程序进程,其实就是切到了 ActivityThread 里。在 ActivityThread 会通过 H 类来进行发送消息处理,通过处理 LAUNCH_ACTIVITY 消息最终一步步的就调到了 Activity 类的 onCreate 方法,也就是我们平时说的 Activity 生命周期的第一个方法。

上一篇下一篇

猜你喜欢

热点阅读