在启动 Activity 时,总是直接调用 startActivity() 函数,网络总会查到说 Activity/Service 等四大组件都是运行在主线程的,一直有些误解。看了些文章,希望记录一下自己的理解和心得。
当调用 startActivity() 后,会与 ActivityServiceManager(AMS)进行交互,直到调用 startSpecificActivityLocked() 函数。由其判断该 Activity 所属进程是否已经启动,若启动,则在此进程中直接启动该组件;否则,通过 startProcessLocked() 调用启动进程流程。
由 AMS 与 Zygote 进行交互(LocalSocket),使其 fork 出 APP 的子进程。当子进程创建成功后,将通过反射调用 ActivityThread 类,使其加载到该 APP 进程中进行运行,管理着应用程序进程中主线程的执行,调度 Activity/Service/Broadcast 和其它操作。
因此,每个 APP 在没有特殊设置的情况下,都对应一个进程,而 ActivityThread 将作为其中的主线程出现,并管理需要启动的 Activity 等四大组件。
PS:Android中的LocalSocket是基于UNIX-domain Socket的,UNIX-domain Socket是在Socket的基础上衍生出来的一种IPC通信机制,因此LocalSocket解决的是同一台主机上不同进程间互相通信的问题。其相对于网络通信使用的socket不需要经过网络协议栈,不需要打包拆包、计算校验,自然的执行效率也高。
本文参考
原文链接:https://blog.csdn.net/qq_30993595/article/details/82747738