Android 四大组件启动

service:

startService启动过程分析 - Gityuan博客 | 袁辉辉的技术博客

在整个startService过程,从进程角度看服务启动过程

  • **Process A进程:**是指调用startService命令所在的进程,也就是启动服务的发起端进程,比如点击桌面App图标,此处Process A便是Launcher所在进程。
  • **system_server进程:**系统进程,是java framework框架的核心载体,里面运行了大量的系统服务,比如这里提供ApplicationThreadProxy(简称ATP),ActivityManagerService(简称AMS),这个两个服务都运行在system_server进程的不同线程中,由于ATP和AMS都是基于IBinder接口,都是binder线程,binder线程的创建与销毁都是由binder驱动来决定的,每个进程binder线程个数的上限为16。
  • Zygote进程: 是由init进程孵化而来的,用于创建Java层进程的母体,所有的Java层进程都是由Zygote进程孵化而来;
  • **Remote Service进程:**远程服务所在进程,是由Zygote进程孵化而来的用于运行Remote服务的进程。主线程主要负责Activity/Service等组件的生命周期以及UI相关操作都运行在这个线程; 另外,每个App进程中至少会有两个binder线程 ApplicationThread(简称AT)和ActivityManagerProxy(简称AMP),当然还有其他线程,这里不是重点就不提了。

图中涉及3种IPC通信方式:BinderSocket以及Handler,在图中分别用3种不同的颜色来代表这3种通信方式。一般来说,同一进程内的线程间通信采用的是 Handler消息队列机制,不同进程间的通信采用的是binder机制,另外与Zygote进程通信采用的Socket

启动流程:

  1. Process A进程采用Binder IPC向system_server进程发起startService请求;
  2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  3. zygote进程fork出新的子进程Remote Service进程;
  4. Remote Service进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
  5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向remote Service进程发送scheduleCreateService请求;
  6. Remote Service进程的binder线程在收到请求后,通过handler向主线程发送CREATE_SERVICE消息;
  7. 主线程在收到Message后,通过发射机制创建目标Service,并回调Service.onCreate()方法。

到此,服务便正式启动完成。当创建的是本地服务或者服务所属进程已创建时,则无需经过上述步骤2、3,直接创建服务即可。

startService的生命周期为onCreate, onStartCommand, onDestroy,流程如下图

相关推荐
折翅鵬1 小时前
Android史诗级网络优化实践总结
android·网络
赏金术士3 小时前
Android 项目模块化与 Feature 组件实践
android·kotlin·模块化
summerkissyou19877 小时前
Android-UI-获取屏幕尺寸的方法
android·ui
用户86022504674727 小时前
Kotlin 函数式编程入门与实践指南
android
最爱睡觉睡觉睡觉8 小时前
CSS → Flutter 对照手册
android·前端
xingpanvip9 小时前
星盘接口开发文档:马盘次限盘接口指南
android·开发语言·python·php·lua
用户261904985615710 小时前
JUnit4 完整配置流程
android
用户261904985615710 小时前
JaCoCo 完整配置流程
android
QING61810 小时前
Android面试 —— 八股文之app启动流程
android·面试·app
海鸥-w10 小时前
python(fastapi) 实现更新,新增,删除接口
android·python·fastapi