Android应用启动过程
Android应用启动过程是一个涉及多个系统组件和底层框架的复杂过程。本文将尽量以简化的方式阐述Android应用启动过程的各个关键阶段,我会从最简单明了的流程图和伪代码了解大概的过程;
先看流程图:
一、Android应用启动过程
- 启动器(Launcher)发起启动请求:用户点击应用图标后,启动器通过
startActivity()方法发起启动请求。 - ActivityManagerService处理启动请求:请求传递给AMS,它负责检查合法性等。
- 创建新的Task和ActivityRecord:AMS创建Task和ActivityRecord来跟踪管理Activity状态。这一步在我的另外一篇文章描述 Activity启动流程 中有介绍到,感兴趣可以去看看;
- 调度Activity启动:AMS将启动请求加入消息队列,由主线程处理。
- 启动应用进程:如果应用进程未运行,AMS通过Zygote进程创建新进程。
- 创建Activity实例:新进程启动后,创建Application和Activity实例,并调用生命周期方法。
- 创建和显示Activity界面:
onResume()方法被调用,Activity界面创建并显示。 - 完成启动:Activity界面显示后,启动过程结束,应用开始运行。
伪代码结合流程图,基本是一目了然。
// 伪代码:Android应用启动过程
// 伪代码主流程
public static void main(String[] args) {
Launcher launcher = new Launcher();
String packageName = "com.example.myapp";
startApp(launcher, packageName);
// 后续流程由系统自动处理
}
// 启动器(Launcher)发起启动请求
void startApp(Launcher launcher, String packageName) {
Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName));
launcher.startActivity(intent);
}
// ActivityManagerService处理启动请求
void handleStartActivity(ActivityManagerService AMS, Intent intent) {
if (AMS.isIntentValid(intent)) {
AMS.createTaskAndActivityRecord(intent);
AMS.scheduleActivityStart();
}
}
// 创建新的Task和ActivityRecord
void createTaskAndActivityRecord(ActivityManagerService AMS, Intent intent) {
Task task = new Task();
ActivityRecord activityRecord = new ActivityRecord(intent);
AMS.addTask(task);
AMS.addActivityRecord(task, activityRecord);
}
// 调度Activity启动
void scheduleActivityStart(ActivityManagerService AMS) {
AMS.addToMessageQueue(activityRecord);
}
// 主线程处理消息队列中的启动请求
void handleMessageQueue(ActivityManagerService AMS) {
while (AMS.hasMessagesInQueue()) {
ActivityRecord activityRecord = AMS.getNextActivityRecord();
AMS.startApplicationProcess(activityRecord);
}
}
// 启动应用进程
void startApplicationProcess(ActivityManagerService AMS, ActivityRecord activityRecord) {
if (!AMS.isAppProcessRunning(activityRecord)) {
ZygoteProcess.startNewAppProcess(activityRecord);
}
AMS.createActivityInstance(activityRecord);
}
// 创建Activity实例
void createActivityInstance(ActivityManagerService AMS, ActivityRecord activityRecord) {
Application app = new Application();
Activity activity = new Activity();
activity.onCreate();
activity.onStart();
activity.onResume();
}
// 创建和显示Activity界面
void createAndShowActivityUI(Activity activity) {
// 设置布局、初始化视图等
activity.setContentView(R.layout.main);
// 处理用户输入等
activity.updateUI();
}
// 完成启动
void completeStart(Activity activity) {
// Activity界面显示完成
activity.isRunning = true;
// 用户可以与应用互动
}
二、关于应用启动过程中各个角色的介绍
- Zygote进程:所有应用进程的父进程,预加载Android框架类和资源,快速创建新进程。
- ActivityManagerService(AMS):管理系统中的应用进程和Activity,包括生命周期管理。
- System Server进程:启动和管理系统服务,如AMS、WMS、PMS等。
- Binder机制:Android系统中的跨进程通信机制,基于对象的通信,使用代理模式。
计划是下一篇再完整的讲讲Zygote进程和Binder的一些特殊联系,如果需要请关注点赞,我会尽快更新~
以后每两天之内更新一道Android常见的面试题,以自己的角度去通俗简单易懂形式去说,不深入源码但讲基本原理,以伪代码为核心;如果你比较想问什么问题,可以评论。