每日小点 - 浅谈Android中主线程,进程,线程,Looper

相信大家开发过程也经常听过主线程,进程,线程等术语。那么这些术语在android中又是怎么运作的呢。

1,线程,进程基本定义:进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
通俗些,我们数据访问正常是以进程为单位的(常规下跨进程的数据是无法访问,除非采用跨进程通信方式),而线程则是cpu调度的基本,记录运行时方法栈等等信息。

2,android中的主线程:大家都知道,主线程一般是用于处理Ui绘制;
那么疑问来了(1)主线程既然也是是线程,那么在进程内能否创建多个呢?
                    (2)主线程与我们创建的组件(Activity, Service)是否是一 一对应的关系?
                    (3)主线程怎么运行时能一直保持,普通线程执行完之后不就结束了吗?

 循着问题:我们来探讨一下
(1)android中进程与主线程的关系:  android的进程都是由zygote孵化的,基于虚拟机运行的。应用中如果我们不申明进程的话,那么应用默认只会有一个进程(进程名:默认包名);


我们简单看下启动进程时刻的部分代码(至于activity跳转过程就不多说了,网上有启动流程分;我们看Ams中startProcessLocked)
每日小点 - 浅谈Android中主线程,进程,线程,Looper

启动进程的时候传入了一个ActivityThread,而它就是我们意义上的主线程,进程启动的时候,会通过创建ActivtyThread,并调用其main方法,开启主线程。因此,我们知道主线程和进程是一一对应的关系。


(2)组件Activity等与主线程关系(以单进程为例分析)

设想:我们应用启动时候会创建一个进程(另外会创建一个ActivityThread主线程),在主线程内我们调用打开进程内其他的Activity组件的时候,并不会重新创建进程,因此只会保持一个ActivityThread主线程。

(activty启动简述:首先前一个activity会先变成pause状态,然后新的activity去启动,启动时判断新activty所属进程有没有创建,没有创建则创建进程启动,而创建了就直接创建)

startSpecificActivityLocked:
每日小点 - 浅谈Android中主线程,进程,线程,Looper

realStartActivityLocked:


每日小点 - 浅谈Android中主线程,进程,线程,Looper

每日小点 - 浅谈Android中主线程,进程,线程,Looper


好了,我们看见直接调用app内部启动activity了,并没有创建ActivityThread,最终启动时调用ActivityThread中的启动(Activity真是创建及生命周期回掉实际是由ActivityThread管理的)

(3)主线程为啥一直执行没有结束?
主线程启动实际是ActivityThread调用main方法入口调用,因此我们了解下main入口做了什么

main:
每日小点 - 浅谈Android中主线程,进程,线程,Looper


好啦,这个时候我们看到了,原来有Looper,而且还是mainLooper。 looper实现一个对消息队列的循环。而mainLooper则专门处理每次绘制等ui操作消息了。

3,补充Looper:

Looper实现一个循环,而Looper内部实际有一个MessageQueue去每次读取消息处理。消息如何发送到MessageQueue就通过Handler了。因此Handler只要向正确的Looper就可以发送消息了。

很多情况我们在子线程中创建Handler,会发现报错(大致意思:不能在没有Looper.Prepare的线程中调用);Looper创建实际是跟线程一一对应的,而handler发送消息必须依赖消息队列(Looper中含有),因此想要在子线程中创建handler就务必搭建子线程的消息队列环境(Looper.prepare())