Android 进程和线程及消息机制笔记

498 阅读2分钟

概念

进程(Process)是程序的一个运行实例,线程是CPU调度的基本单位。
一个程序的主入口一般都是main函数,它所做的工作有两个:

  • 初始化
    比如Windows环境通常要创建窗口,像系统申请资源等
  • 进入死循环
    并在循环中处理各种事件,直到进程退出。

Android进程

Activity和Service应用程序的主线程都是ActivityThread,启动新的activity时,Binder线程数量发生了变化。

Handler

Handler.dispatchMessage分发流程
→Message.callback(Runnable 对象)是否为空
在不为空的情况下将优先通过callback来处理
→Handler.mCallback 是否为空
在不为空的情况下,调用 mCallback.handleMessage
→如果前两个对象都不存在,才调用Handler.handleMessage。

Message

Android系统会维护一个全局的message池。当用Message时,可以通过obtain直接获得,而不是自行创建。Message是享元模式的一个实践案例

	// 从对象池中取出对象
	public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }
    
    // 回收的时候添加到对象池
    void recycleUnchecked() {
        // Mark the message as in use while it remains in the recycled object pool.
        // Clear out all other details.
        flags = FLAG_IN_USE;
        what = 0;
        arg1 = 0;
        arg2 = 0;
        obj = null;
        replyTo = null;
        sendingUid = -1;
        when = 0;
        target = null;
        callback = null;
        data = null;

        synchronized (sPoolSync) {
            if (sPoolSize < MAX_POOL_SIZE) {
                next = sPool;
                sPool = this;
                sPoolSize++;
            }
        }
    }

MessageQueue

  • 新建队列 由其构造函数和本地方法nativeInit组成。
  • 元素入队 enqueueMesage(Message msg,long when)
  • 元素出队 next( ) 当没有Message时会进入阻塞状态
  • 删除元素 removeMessages(Handler h,int what,Object object);
  • 销毁队列 nativeDestroy

looper

Looper.prepare() 创建了Looper对象,并通过ThreadLocal(一个模板类)与当前线程就行了绑定
Handler构造函数会通过ThreadLocal获取Loop对象,并通过loop获取MessageQueue
一个线程可以设置多个ThreadLocal,一个ThreadLocal可以作为多个线程的TheadLocalMap的Key
通过loop()开启无线循环,当MessageQueue阻塞时,它也就阻塞了

UI主线程--ActivityThread

其他线程可以通过getMainLooper()获取到主线程的Looper, sMainThreadHandler(H对象)处理主线程中的各种消息

//main函数的经典模型伪用代码
main()  
{
	initialize();//初始化操作
    CreateWindow();//创建窗口
    ShowWindow();//显示窗口
    while(GetMessage())// 不断执行消息,直到收到退出的消息
    {
    	TranslateMessage();// 对消息进行必要的前期处理
        DispatchMessage();// 分配消息给相应元素进行处理
    }
}
  • 创建处理消息的环境
  • 循环处理消息
    消息是推动整个系统动起来的基础

Thread

线程的几种状态

  • new 线程已经创建,但还没有start
  • runnable 处于可运行状态一切就绪
  • blocked 处于阻塞状态
  • waiting 处于等待状态
  • timed_waiting 等待特定的时间
  • 终止运行

参考
《深入理解Android内核设计思想》
《Android源码设计模式解析与实战》