Android View 之 onDraw 深入介绍

1.Draw绘制过程

1.1 View的绘制过程遵循步骤

  • View的绘制过程遵循如下几步:
    • ①绘制背景 background.draw(canvas)
    • ②绘制自己(onDraw)
    • ③绘制Children(dispatchDraw)
阅读更多

Android View 之 onMeasure 深入介绍

01.Measure流程分析

  • 顾名思义,就是测量每个控件的大小。调用measure()方法,进行一些逻辑处理,然后调用onMeasure()方法,在其中调用setMeasuredDimension()设定View的宽高信息,完成View的测量操作。

    1
    2
    public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
    }
阅读更多

Android View 之 onLayout 深入分析

01.Layout流程

  • 测量完View大小后,就需要将View布局在Window中,View的布局主要通过确定上下左右四个点来确定的。

    • 其中布局也是自上而下,不同的是ViewGroup先在layout()中确定自己的布局,然后在onLayout()方法中再调用子View的layout()方法,让子View布局。在Measure过程中,ViewGroup一般是先测量子View的大小,然后再确定自身的大小。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public void layout(int l, int t, int r, int b) {  

    // 当前视图的四个顶点
    int oldL = mLeft;
    int oldT = mTop;
    int oldB = mBottom;
    int oldR = mRight;

    // setFrame() / setOpticalFrame():确定View自身的位置
    // 即初始化四个顶点的值,然后判断当前View大小和位置是否发生了变化并返回
    boolean changed = isLayoutModeOptical(mParent) ?
    setOpticalFrame(l, t, r, b) : setFrame(l, t, r, b);

    //如果视图的大小和位置发生变化,会调用onLayout()
    if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) {

    // onLayout():确定该View所有的子View在父容器的位置
    onLayout(changed, l, t, r, b);
    ...

    }
阅读更多

Android View 绘制流程

01.View绘制的流程框架

  • 如图所示
    • img
  • View的绘制是从上往下一层层迭代下来的。DecorView–>ViewGroup(—>ViewGroup)–>View ,按照这个流程从上往下,依次measure(测量),layout(布局),draw(绘制)。
阅读更多

Android Aidl 通信案例

01.aidl通信业务需求

  • aidl多进程通信应用
    • 服务端:某app;客户端:app调试工具。
    • 注意:aidl多进程通信是指两个独立app之间的通信……
  • 打开app调试工具(客户端)
    • 可以通过绑定服务端某app的service,获取到公司app的信息,比如渠道,版本号,签名,打包时间,token等属性
    • 通过app调试工具,可以通过aidl接口中的方法设置属性,设置成功后,查看某app是否设置属性成功
阅读更多

Android Aidl 基础介绍

01.什么是AIDL

  • AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务端和客户端通信接口的一种描述语言,可以拿来生成用于 IPC 的代码。从某种意义上说 AIDL 其实是一个模板,因为在使用过程中,实际起作用的并不是 AIDL 文件,而是据此而生成的一个 IInterface 的实例代码,AIDL 其实是为了避免我们重复编写代码而出现的一个模板
  • AIDL文件以 .aidl 为后缀名
阅读更多

Android IPC 之 Messenger

01.Messenger基本概述

  • 除了使用 AIDL 进行 IPC 外,我们还可以使用 Messenger 来替代 AIDL。通过在 Message 对象中放入需要传递的对象,利用 Messenger 在不同进程间传递 Message 对象,就可以方便地进行进程间通信了

  • Messenger 是一种轻量级的 IPC 方案,底层实现依然是 AIDL,通过 Messenger 的两个构造方法就可以看出来

    1
    2
    3
    4
    5
    6
    7
    public Messenger(Handler target) {
    mTarget = target.getIMessenger();
    }

    public Messenger(IBinder target) {
    mTarget = IMessenger.Stub.asInterface(target);
    }
阅读更多

Android IPC 之线程进程

01.前沿介绍

  • 默认情况下,Android 系统中同一应用的所有组件均运行在相同的进程和线程(称为主线程)中,新启动的应用组件会创建进程或者在已存在的进程中启动并使用相同的执行线程。
  • 但是,也可以安排应用中的组件在单独的进程中运行,并为任何进程创建额外的线程

02.Android中如何控件进程

阅读更多

Android IPC 之序列化

01.什么是IPC

  • IPC(Inter-Process Communication)的含义即为进程间通信或者翻译为跨进程通信,是指两个进程之间进行数据交换的过程。
  • 一般情况下,在 Android系统中一个应用就只享有一个进程,在最简单的情况下一个进程可以只包含有一个线程(当然,一般情况下是不可能的),即主线程,也称为 UI 线程
  • 有时候应用因为某些原因需要采用多进程模式,此时如果要在应用内的不同进程间进行通信,就需要使用到 IPC 机制。或者是两个不同的应用需要进行数据交换,此时也一样需要依靠 Android 系统提供的 IPC 方案
阅读更多

Android IPC 通信方式介绍

01.使用Intent

  • 1.Activity,Service,Receiver 都支持在 Intent 中传递 Bundle 数据,而 Bundle 实现了 Parcelable 接口,可以在不同的进程间进行传输。
  • 2.在一个进程中启动了另一个进程的 Activity,Service 和 Receiver ,可以在 Bundle 中附加要传递的数据通过 Intent 发送出去。

02.使用文件共享

阅读更多