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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学历认证报告弄丢了怎么办 想读大专没考上怎么办 学信网身份证被注册了怎么办 学信网手机号换了密保忘了怎么办 学信网手机号改了密保忘了怎么办 学信网手机号忘了密保也忘了怎么办 学信网账号被注销了怎么办 原味奶酪太难吃怎么办 cma年费太贵了怎么办 会计证3年没年检怎么办 幼师面试没有什么特长怎么办 电子学历注册表过期了怎么办 学信网查不到电子注册登记表怎么办 学历证书电子注册备案表过期怎么办 举报人对处理结果不满意怎么办 亚马逊账号申诉后余额怎么办 怎么办北京市工会会员互助服务卡 国家发改委录用公示后怎么办 慕课的账号忘了怎么办 清华同方无线鼠标没反应怎么办 全日制专硕考上公务员了怎么办 超出了期刊编辑部审稿时间怎么办 教师晋职称毕业证丢了怎么办 下属部门一直不交材料怎么办 简书投稿被拒绝怎么办 论文引用文献为0怎么办 小米屏幕录制卸载了怎么办 用edius剪的视频卡顿怎么办 微店手机号换号登不进去了怎么办 微信加人被限制怎么办 微信与电脑同步怎么办 微信号盗了红包怎么办 微信被别人登录冻结了怎么办? 微信账号被冻结了怎么办 我微信冻结了怎么办 微信账号冻结了怎么办 微信被冻结里面的钱怎么办 微信账户冻结了怎么办 微信公众号忘记密码怎么办 网课没有刷完怎么办 形势与政策挂了怎么办