android应用的启动流程

来源:互联网 发布:旅游软件监管单位 编辑:程序博客网 时间:2024/05/22 12:00

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函数


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xieyan0811/archive/2010/12/17/6083010.aspx