1. 说明
应用的启动过程通常是通过startActivity函数,无论是在应用中调其它应用还是在桌面(桌面是Launcher应用)上点击,最终都将通过这个函数启动进程或者界面,下面以分析代码的方式,介绍它具体的工作过程
2. 过程
1) packages/apps/Launcher2/src/com/android/
在应用或桌面上启动应用,例如桌面应用的启动由于中调用函数流程startActivitySafely() -> startActivity()
2) frameworks/base/core/java/android/app/:startActivity()
继承了,并实现了它的startActivity() -> startActivityForResult() -> execStartActivity()
3) frameworks/base/core/java/android/app/:execStartActivity()
execStartActivity利用IntentFilter得到具体Activity,并调用了更下层的startActivity
4) frameworks/base/core/java/android/app/
()
(….); //(START_ACTIVITY_TRANSACTION, data, reply, 0);
// 此句代码很重要,它会把以上所有数据,跨进程传递给ActivityManagerService类中onTrasact 方法处理。
// 调用父类ActivityManagerNative中的onTrasact()方法
它通过Binder的方式与通讯,并发送启动请求
5) frameworks/base/core/java/android/os/:execTransact()
Binder消息转递的实现,用于用户应用与后台服务的通讯
6) frameworks/base/services/java/com/android/server/am/
onTransact();
startActivity() -> startActivityMayWait() - >startActivityLocked()->resumeTopActivityLocked()->startSpecificActivityLocked()->startProcessLocked ()
开启新线程
7) frameworks/base/core/java/android/os/的函数start为入口 调用 startViaZygote -》zygoteSendArgsAndGetPid,通过socket发给zygote进程
8) frameworks/base/core/java/com/android/internal/os/
告知虚拟机新建进程,此时会将要建立的进程名,用户名,组名一并传给虚拟机,以建立进程
通过调用Runonce 调用folkAndSpecialize 使用Native 函数Dalvik_dalvik_system_Zygote_forkAndSpecialize(dalvik/vm/native/dalvik_system_Zygote.c)
9) dalvik/libcore/dalvik/src/main/java/dalvik/system/
虚拟机处理
10) dalvik/vm/native/dalvik_system_Zygote.c (forkAndSpecializeCommon)
虚拟机处理
至此建立了andorid应用程序跑的进程,后面将执行此进程,新进程从开始运行。这里就是一般意义上的程序入口点,类似于C的main函数
(false); // frameworks/base/core/java/android/app/
attachApplication(); // frameworks/base/services/java/com/android/server/am/
--------realStartActivityLocked() @ActivityManagerService // 此方法是进入真正启动一个Activity流程
--------scheduleLaunchActivity () @ActivityThread @ApplicationThread // 此方法进入到
ApplicationThreadNative提供的服务,也就是到ActivityThread的内部类ApplicationThread类中,
scheduleLaunchActivity方法定义如下:
scheduleLaunchActivity (Intent intent, IBinder token, int ident......) {
ActivityRecord r = new ActivityRecord() ; // 为此Activity定义一个客户端实例
....
queueOrSendMessage(H.LAUNCH_ACTIVITY, r); // 把启动Activity的消息传给一个内部类(H)来处理
// H类是一个Handler,
}
--------------handleLaunchActivity @ ActivityThread
--------------performLaunchActivity @ActivityThread // 此方法开始具体创建Activity,并调用其生命周期
此方法定义如下 :
private final Activity performLauchActivity(ActivityRecord r, Intent customIntent) {
.....
activity = (cl, (), );
// 通过反射构造出Activity对象
();// 调用Activity的attach() 方法, 此方法比较重要,主要创建Activity中的Window及
// WindowManager , 等会儿具体分析
以下会逐渐调用Activity中生命周期的方法
(activity, ); // 调用Activity中的onCreate方法
() ; // 调用
(activity,);
(activity,);
(,r); // 压入栈
}
--------------handleResumeActivity: 开始调用onResume() 方法,
--------------performResumeActivity(); // 调用onResume()方法
performResumeActivity () {
....
(); // 调用Activity中的onResume方法
.....
}
到此为止,整个Activity已经创建,启动了,但是他还什么都没有显示,因为没有显示在屏幕上,
handleResumeActivity() {
--(); //开始把DecorView添加进Window
--(decor, l);
}
(11)消息循环:(); @ // frameworks/base/core/java/android/os/的loop()函数
public static final void loop() {
......
(msg); //对应frameworks/base/core/java/android/os/的dispatchMessage
......
}
dispatchMessage调用ActivityThread 里面重载的handleMessage函数
本文来自****博客,转载请标明出处:/xieyan0811/archive/2010/12/17/