Activity的启动过程。
我们知道,在Android系统启动时,第一个启动起来的进程就是zygote进程,然后由zygote启动SystemServer,再然后就是启动例如ActivityManagerService、WindowManagerService等系统核心服务,这些服务承载着整个Android系统与客户端程序交互的重担。zygote除了启动系统服务与进程之外,普通的用户进程也由zygote进程fork而来,当一个应用进程启动起来后,就会加载用户在AndroidManifest.xml中配置的默认加载的Activity。此时加载的入口是ActivityThread.main(String[] args)方法,这个方法就是类似于C语言中的main方法一样,是整个应用程序的入口。在ActivityThread.main(String[] args)这个方法中,主要的功能就是创建Application和创建Activity,并且调用Activity的一些生命周期函数,例如onCreate、onResume等。
首先分析下activityThread。AcitivityManager产生的新进程就是在main函数开始的:
activityThread程序入口这里这Looper就是大家常说的,activity主线程不需要手动去初始化,因为这里已经做好了准备并且去轮询了。同时初始化了一些运行的环境,日志信息和一些标志位信息等操作。
attach部分代码参数为false,表明这不是系统进程,是给普通应用程序用使用的进程。
addFirstDrawHandler回调方法确认虚拟机是否正常。
android.ddm.DdmHandleAppName.setAppName设置app名字和id,看起来和DDMS相关。
RuntimeInit.setApplicationObject将ApplicationThread对象传递给RuntimeInit保存,setApplicationObject是一个静态方法,且RuntimeInit中方法多为静态方法.
mgr = ActivityManager.getService() 用来获得IActivityManager的一个实例和底层沟通(方法在ams里面)。mgr .attachApplication(mAppThread),ApplicationThread mAppThread 不是一个Thread,而是一个Binder,负责与远程的ActivityManagerService进行交互。
private class ApplicationThread extends IApplicationThread.Stub {
public final void schedulePauseActivity(){}
public final void scheduleStopActivity(IBinder token, boolean showWindow, int configChanges)
。。。。。。
}
attachApplicationLocked启动activityBinderInternal.addGcWatcher()添加一个gc观察者,主要是观察是否快达到heap的上限,当已用内存超过最大内存的3/4,则请求释放内存空间。DropBox.setReporter,添加dropbox日志到libcore;
启动进程流程http://gityuan.com/2016/03/26/app-process-create/
网友评论