startativity - > sta

    binder 进程通信
    binder 是android 特有的一种进程通信机制 将用户态的内存映射到内核态 ,只需要一次数据传输 就可以 不过要要经过序列化

    首先用户端发起一个binder 请求 ,往data 中写入数据,然后调用transcent发送到服务端 . 服务端收到这个信息后,调用ontramct 处理这个数据,然后网reply
    写入数据,返回到客户端 ,然后唤醒客户端.

    创建aidl 文件 ,然后实现这个接口.
    我们通常会在服务端创建一个service ,然后在onbinder 方法 ,在这个类中创建这个内部类.然后 返回asbinder ,然后客户端 startservice
    然后在connect 中 获取到这个 ibinder 然后asinterface ,让 客户端持有这个接口,调用服务端对应的方法.
    服务端主动调用客户端的方法 .通过设置回调的方式,让服务端主动调用客户端的,但是服务端需要用remoteCallbacks 来管理这个接口
    死亡代理

    startativity >startativityfor result imstion startativity .到服务端 ,然后 验证当前的intent请求 ,第二步,确认 当前是否有在前台展示activity
    第三部把当前的activity 走onpause
    然后确认当前 要启动的activity 的进程是否存在,如果不存在的 通过zotre的fork ,创建一个进行,然后通过反射执行ActivityThread 的main方法
    创建applicationThread 冰盒 Activity 绑定,同时创建looper
    并进行循环
    然后 activity 通过调用本地方法的发送消息的方式创建activity 的,看了一下是通过类加载
    然后 makeapplication的方式
    回调oncreate 然后setcontent
    onstart 然后 onresume 通知 activitymangerservice
    然后这个时候 viewrootimpl add view requestlayout 然后view onmeasue onlayout ondraw
    然后 Framedisplaycallback
    onvsync 然后接受到这个型号后,判断当前是否跳桢,然后开始下一桢的扫描

    window 对应一个surface 然后surface 的lock 获取到一个canvas 对象 .然后通过 在canvas 绘制,通过skia 进行删格化操作 ,或者通过opengl
    删格化操作 ,然后把数据写入离屏缓存区

    localthread
    数据因为共享才会出现 多线程问题 ,以当前线程为对象 存储数据 每一个线程可以创建自己的looper 和 queue 然后存储在这里 ,然后
    如果你要穿件一个 持有子线程 looper 的 hander 的话
    你需要 使用handler thread ,然后 当你掉调用gethandler 内部会调用 wait 方式 , 同一把锁
    然后 线程到 创建完looper 后 ,natifyall 释放这个锁

    if father.拦截
    father.ontouchevent
    else{
    child. dispatch
    }

    拦截
    father 栏
    down 不拦
    move 分情况放
    up 不拦

    request拦截 false
    然后 分情况 请求 父亲拦截

    线程池
    复用线程
    管理

    任务队列 拒绝策略 异常 ,直接丢弃 不异常 ,丢弃最前面一个 新起线程

    内存 使用native 内存 申请大内存 , 使用多进程
    内存策略 . lrucache , 内存泄露 线程 内部类动画 被静态对象持有 数据库关闭

    attach
    windowmanager 和 activity 绑定

    oncreate setcontentview
    创建decorview ,然后把view 绑定到decorview 上去

    onresume
    创建viewrootimpl 然后创建 ,然后创建displayframecallback 准备垂直同步
    windowmanager 和decorview绑定
    然后requestlayout

    requestLayout方法,他只调用measure()和layout()过程, invalidate()会调用draw()。