• Activity启动过程


    --摘自《Android进阶解密》

    根Activity启动过程中会涉及4个进程,分别是Zygote进程、Launcher进程、AMS所在进程(SystemServer进程)、应用程序进程,关系图如下

    其中步骤2采用的是Socket通信,步骤1和4采用的是Binder通信

    如果是普通Activity启动过程会涉及两个进程:AMS所在进程和应用程序进程

    启动过程

    第一步:Launcher请求AMS过程

    1)Android8.0之前是通过ActivityManagerNative的getDefault来获取AMS的代理对象的,现在这个逻辑封装到了ActivityManager中而不是ActivityManagerNative中

    2)Android8.0之前并没有采用AIDL,而是采用了类似AIDL的形式,用AMS的代理对象ActivityManagerProxy来与AMS进行进程间通信,Android8.0去除了ActivityManagerNative的内部类ActivityManagerProxy,代替它的是IActivityManager,它是AMS在本地的代理。

    第二步:AMS到ApplicationThread的调用过程

    1)UserHandle.getCallingUserId(),这个方法会获得调用者的UserId,AMS根据这个UserId来确定调用者的权限

    2)TaskRecord代表启动的Activity所在的栈

    3)ActivityRecord用于描述一个Activity,用来记录一个Activity的所有信息

    4)ApplicationThread继承了IApplicationThread.Stub,是AMS所在进程(SystemServer进程)和应用程序进程的通信桥梁

    第三步:ActivityThread启动Activity的过程

    1)ApplicationThread是ActivityThread的内部类

    2)H,它是ActivityThread的内部类并继承自Handler,是应用程序进程中主线程的消息管理类。因为ApplicationThread是一个Binder,它的调用逻辑运行在Binder线程池中,所以这里需要用H将代码的逻辑切换到主线程中

    3)应用程序进程要启动Activity时需要将该Activity所属的APK加载进来,而LoadedApk就是用来描述已加载的APK文件的

    欢迎关注的微信公众号:安卓圈

  • 相关阅读:
    浏览器输入一个url到整个页面显示出来经历了哪些过程?
    ajax
    为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
    jQuery中ready方法的实现
    this+call、apply、bind的区别与使用
    内存泄漏、垃圾回收机制、哪些情况会导致内存泄漏
    浏览器同源策略和跨域方法
    node.js
    JS原型、原型链、构造函数、实例与继承
    JS常用操作节点的方法
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10175729.html
Copyright © 2020-2023  润新知