进程 process: 程序的 1 个运行实例,
用以 区别 程序 这个静态的概念
线程 thread: 是 cpu 调度的基本单位

1> Android 中 process/thread 概念

应用程序的 主入口 一般都是 main 函数
main 函数的工作:
(1) 初始化
ex: windows 环境下的创建窗口, 向系统申请资源等
(2) 进入死循环
并在 循环中处理各种事件, 直到进程退出
这种模型是 “以事件为 驱动” 的软件系统的必然结果

Android 中
Activity 和 Service 应用程序的 主线程 都是 ActivityThread

同 1 程序包里的 2 个Activity 默认运行于 同一个进程中

Android 提供特殊的方式 让不是同 1 个包里的组件 也可以运行于相同的进程中
优势: 它们可以非常方便地 进行资源共享, 而不用经过 进程间通信
[1] 针对 个别组件
可以在 AndroidMainfest.xml 文件的 4大组件都支持,可以根据需要添加 标签中加入 android:process 属性来表明这一组件想要运行在哪个进程空间

[2] 针对 整个程序包
可以直接在 标签中加入 android:process 属性来指明 想要依存的进程环境

结论:

  1. <1> 4 大组件 不是 程序(进程)的全部, 而只是它的零件组成
  2. <2> 应用程序启动后, 将创建 ActivityThread
  3. <3> 1 个包中的组件 将运行在 相同的进程空间中
  4. <4> 不同包 的组件可以通过 一定方式 运行在同一个 进程空间
  5. <5> 1 Activity 应用启动后 至少会有 3 个线程, 1 个主线程 2 Binder 线程

2> H/M/R/L 四大金刚

handlerMessageQueueRunnableLooper
4大金刚.png
Runnable 和 Message 可以被 压入某个 MessageQueue 中, 形成 1 个集合

值得注意的是: 一般情况某种类型的 MessageQueue 只允许保存相同类型的 Object 实际上 源码中 需要相对 Runnable 进行 相应转换

Looper 循环的做某事

在图中, 它不断的 从 MessageQueue 中取出 1 个 item,
然后 传给 Handle 处理, 如此循环往复
如果 队列为空, 它会进入休眠
Handle 真正的 处理事务 的地方 ( 真大佬 )
它利用自身的 处理机制, 对传入的 各种 Object 进行对应的 处理并 产生最终结果

即: Looper 不断获取 MessageQueue 中的 1 个 Message ,然后由 Handle 来处理

说明:
所有的 应用层框架都在 framework

<1> Handle

path: framework/base/core/java/android/os/Handle.java
具体可以 参考 (参见我的知识库—Android 源代码编译) 下载的 源码

  1. public class Handler {
  2. /*
  3. * Set this flag to true to detect anonymous, local or member classes
  4. * that extend this Handler class and that are not static. These kind
  5. * of classes can potentially create leaks.
  6. */
  7. private static final boolean FIND_POTENTIAL_LEAKS = false;
  8. private static final String TAG = "Handler";
  9. private static Handler MAIN_THREAD_HANDLER = null;
  10. final MessageQueue mQueue;
  11. final Looper mLooper;
  12. final CallBbace mCallback;
  13. /**
  14. * Callback interface you can use when instantiating a Handler to avoid
  15. * having to implement your own subclass of Handler.
  16. */

对应关系.png
每个 thread 只对应 1 个 looper
每个 looper 只对应 1 个 messageQueue
每个 messageQueue 中有 N 个 message
每个 message 中对多指定 1 个 Handle 来处理
所以:
thread 和 Handle 是 1对多 关系

Handle 作用:

  1. <1> 处理 message
  2. <2> 将某个 messgae 压入 messageQueue

实现 第一个 功能 的相关函数声明如下:
public void dispatchMessage( Message msg ); // 对 Message 进行分发
public void handleMessage( Message msg); //对 Message 处理

注: 如果文章对你有帮助请点赞支持呀//!
有问题可联系博主: snowzhang183@126.com