分类: 嵌入式
2011-06-15 21:57:17
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函数
转自: http://blog.csdn.net/xieyan0811/archive/2010/12/17/6083010.aspx
tianbianfei2011-07-15 13:14:08
楼主您好,本人刚学android,不知道android为什么签名啊?签名都有哪些作用?麻烦楼主到http://doumiw.com/market/community/t!showTopic.do?topicId=24这个网址帮着解答一下,行吗?谢谢了!