美文网首页android 技术梳理
Android 进阶解密读书笔记3

Android 进阶解密读书笔记3

作者: jkwen | 来源:发表于2021-01-25 23:44 被阅读0次

    四大组件之 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 生命周期的第一个方法。

    相关文章

      网友评论

        本文标题:Android 进阶解密读书笔记3

        本文链接:https://www.haomeiwen.com/subject/ryrwzktx.html