Activity的启动方式,严格来说有两种形式。第一种是在Android应用中启动,第二种是从Launcher中点击应用快捷图标启动。Android应用中Activity启动流程,在上篇博文Activity启动流程源码分析(应用中)已介绍过了,想了解的同学,可以看看一下。本篇博文将会介绍从Launcher中启动Activity具体流程。
在开始介绍之前,我们需要了解一些概念,如:
- ActivityThread: 应用的启动入口类,当应用启动,会首先执行其main方法,开启主线程消息循环机制。
- ApplicationThread: ActivityThread的内部类,主要与系统进程AMS通信,从而对应用进程的具体Activity操作进行管理。
- Instrumentation: ActivityThread的属性变量,主要辅助ActivityThread类调用Activity的生命周期相关方法。
- ActivityManagerService(AMS): Activity管理系统服务类,主要是对所有的Activity进行管理。
- ActivityStack: Activity任务栈,AMS的属性变量,AMS中Activtiy的实际管理者。
一、什么是Launcher?
通俗的来说,就是我们正常解锁后,进入的第一个界面,即桌面(HomeScreen)。Launcher本身就是一个app,它主要作用是用来显示widget和管理手机上其他应用软件app。通过查看源码,我们知道Android系统会内置一些系统应用,如Launcher,联系人、照相机等,并且在Android系统启动后,会自动启动Launcher,让用户可以通过Launcher启动其他应用。
二、Launcher中启动应用源码分析
Launcher中启动应用,也即是Launcher中启动Activity,因为每个应用都是由多个Activities组成的。下面我们就从Launcher源码开始分析:
在创建应用快捷图标的时候,都会给应用快捷图标View设置监听事件setOnClickListener(this),从这监听事件的设定,我们也就知道Launcher类实现了View.OnTouchListener接口,所以我们来看看Onclick()方法
点击应用快捷图标,就会执行onClick(),然后就会调用startActivitySafely方法,我们继续来看此方法
这里就开始startActivity了,我们继续看这方法
前面说了,Launcher本身就是一个应用,通过阅读源码知道,Launcher类也是继承于Activity,到这里,startActivity()也就是和我们上篇博文Activity启动流程源码分析(应用中)中startActivity是一样的,具体流程也是相同的,唯一不同的是在startSpecificActivityLocked()时,Launcher启动的Activity没有进程,需要新建应用进程
。让我们来看看startSpecificActivityLocked()源码
因为从Launcher启动的Activity进程不存在,所以就会执行mService.startProcessLocked()来新建进程,其中mService为ActivityManagerService,我们来看看具体代码:
在创建进程记录后,就会执行startProcessLocked(app, hostingType, hostingNameStr)来创建进程,我们继续
这里Process.start()进程启动传入了ActivityThread类,我们知道ActivityThread类是应用的入口类,所以这里开始正式启动快捷图标的应用。关于Android应用程序的入口,我已写过一篇博文Android应用程序入口源码解析,想了解的同学可以看看。让我们继续来看看Process中的start方法
startViaZygote()从方法名中,我们知开始通过Zygote启动进程,我们继续看
我们继续看zygoteSendArgsAndGetResult()方法
到这里就会执行Zygote的一些原生方法,通过对Zygote的机制的了解,我们知道Zygote会fork自身进程来创建应用进程,进而执行ActivityThread的main方法,初始化相关应用参数,我们来看看ActivityThread的main方法
通过博文Android消息机制源码解析(Handler)知,Android的消息循环机制就是这个时候创建的,这里我们着重需要来看看ActivityThead的attach方法
这里通过Binder跨进程通信机制调用了ActivityManagerService中的attachApplication()方法,我们继续
我们继续看attachApplicationLocked()方法
注释1处,在Android应用程序入口源码解析中,已经分析过,这里主要就是通过Binder跨进程通信,创建应用Application,执行Application的attachBaseContext和onCreate方法,两方法也为应用程序的开发入口。注释2处,调用了ActivitStack中realStartActivityLocked()方法,主要就是启动Activity,也即我们从Launcher点击应用快捷图标应用的入口Activity,在博文Activity启动流程源码分析(应用中)中,已经介绍过剩余的Activity的启动流程,这里就不再介绍了。想了解的同学,可以看一下上篇博文。
到这里,从Launcher中启动Activity的流程就讲解完了。最后再附上Activity启动流程图:
注:源码采用android-4.1.1_r1版本,建议下载源码然后自己走一遍流程,这样更能加深理解。