android应用的启动流程
来源:互联网 发布:良辰好景知几何 编辑:程序博客网 时间:2024/05/16 03:40
本文转自:http://blog.csdn.net/kevin_hcy/archive/2011/03/31/6292023.aspx
1. 说明
应用的启动过程通常是通过startActivity函数,无论是在应用中调其它应用还是在桌面(桌面是Launcher应用)上点击,最终都将通过这个函数启动进程或者界面,下面以分析代码的方式,介绍它具体的工作过程
2. 过程
1) packages/apps/Launcher2/src/com/android/launcher.java
在应用或桌面上启动应用,例如桌面应用的启动由于中调用函数流程startActivitySafely() -> startActivity()
2) frameworks/base/core/java/android/app/Activity.java:startActivity()
Activity.java继承了Context.java,并实现了它的startActivity() -> startActivityForResult() -> execStartActivity()
3) frameworks/base/core/java/android/app/Instrumentation.java:execStartActivity()
execStartActivity利用IntentFilter得到具体Activity,并调用了更下层的startActivity
4) frameworks/base/core/java/android/app/ActivityManagerNative.java
ActivityManagerProxy.startActivity()
IBinder.transact(….); //mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
// 此句代码很重要,它会把以上所有数据,跨进程传递给ActivityManagerService类中onTrasact 方法处理。
// 调用父类ActivityManagerNative中的onTrasact()方法
它通过Binder的方式与ActivityManagerService.java通讯,并发送启动请求
5) frameworks/base/core/java/android/os/Binder.java:execTransact()
Binder消息转递的实现,用于用户应用与后台服务的通讯
6) frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
onTransact();
startActivity() -> startActivityMayWait() - >startActivityLocked()->resumeTopActivityLocked()->startSpecificActivityLocked()->startProcessLocked ()
开启新线程
7) frameworks/base/core/java/android/os/Process.java的函数start为入口 调用 startViaZygote -》zygoteSendArgsAndGetPid,通过socket发给zygote进程
8) frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java
告知虚拟机新建进程,此时会将要建立的进程名,用户名,组名一并传给虚拟机,以建立进程
通过调用Runonce 调用folkAndSpecialize 使用Native 函数Dalvik_dalvik_system_Zygote_forkAndSpecialize(dalvik/vm/native/dalvik_system_Zygote.c)
9) dalvik/libcore/dalvik/src/main/java/dalvik/system/Zygote.java
虚拟机处理
10) dalvik/vm/native/dalvik_system_Zygote.c (forkAndSpecializeCommon)
虚拟机处理
至此建立了andorid应用程序跑的进程,后面将执行此进程,新进程从android.app.ActivityThread.main开始运行。这里就是一般意义上的程序入口点,类似于C的main函数
thread.attach(false); // frameworks/base/core/java/android/app/ActivityThread.java
attachApplication(); // frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
--------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 = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
// 通过反射构造出Activity对象
activity.attach();// 调用Activity的attach() 方法, 此方法比较重要,主要创建Activity中的Window及
// WindowManager , 等会儿具体分析
以下会逐渐调用Activity中生命周期的方法
mInstrumentation.callActivityOnCreate(activity, r.state); // 调用Activity中的onCreate方法
activity.performStart() ; // 调用
mInstrumentation.callActivityOnRestoreInstanceState(activity,r.state);
mInstrumentation.callActivityOnPostCreate(activity,r.state);
mActivitys.put(r.token,r); // 压入栈
}
--------------handleResumeActivity: 开始调用onResume() 方法,
--------------performResumeActivity(); // 调用onResume()方法
performResumeActivity () {
....
r.activity.performResume(); // 调用Activity中的onResume方法
.....
}
到此为止,整个Activity已经创建,启动了,但是他还什么都没有显示,因为没有显示在屏幕上,
handleResumeActivity() {
--r.window.getDecorView(); //开始把DecorView添加进Window
--wm.addView(decor, l);
}
(11)消息循环:Looper.loop(); @ // frameworks/base/core/java/android/os/Looper.java的loop()函数
public static final void loop() {
......
msg.target.dispatchMessage(msg); //对应frameworks/base/core/java/android/os/handler.java的dispatchMessage
......
}
dispatchMessage调用ActivityThread 里面重载的handleMessage函数
- android应用的启动流程
- android应用的启动流程
- android应用的启动流程
- android应用的启动流程
- Android应用启动的流程
- Android应用的启动流程
- Android应用的启动流程
- android应用启动流程
- Android应用启动流程
- Android 应用启动流程
- android 应用的启动流程分析
- Android的应用(APP)启动详细流程
- 分析Android中应用的启动流程
- 分析Android中应用的启动流程
- Android的应用(APP)启动详细流程
- android应用的启动流程原理
- 应用的启动流程
- Android 应用进程启动流程
- 趣味c程序
- 使用 google-perftools 剖析程序性能瓶颈
- C语言之strlen函数
- hdu 2097
- android架构分析
- android应用的启动流程
- Flex 旋转非常详细的讲解
- C++中四种类型转换方式
- Linux 点滴-1
- 分页--SQL分页+EF分页+新闻分页
- Ado使用PutCollect更改记录Update时出错
- Win7下自己手动安装超级终端
- 给IT人士的27个箴言
- linux exec族六个函数的区别总结