Android应用程序启动过程源代码分析

前文简要介绍了Android应用程序的Activity的启动过程。在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity的启动过程,本文将详细分析应用程序框架层的源代码,了解Android应用程序的启动过程。

在上一篇文章Android应用程序的Activity启动过程简要介绍和学习计划中,我们举例子说明了启动Android应用程序中的Activity的两种情景,其中,在手机屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来。这种启动方式的特点是会启动一个新的进程来加载相应的Activity。这里,我们继续以这个例子为例来说明Android应用程序的启动过程,即MainActivity的启动过程。

MainActivity的启动过程如下图所示:

Android应用程序启动过程源代码分析

下面详细分析每一步是如何实现的。

Step 1. Launcher.startActivitySafely

在Android系统中,应用程序是由Launcher启动起来的,其实,Launcher本身也是一个应用程序,其它的应用程序安装后,就会Launcher的界面上出现一个相应的图标,点击这个图标时,Launcher就会对应的应用程序启动起来。

Launcher的源代码工程在packages/apps/Launcher2目录下,负责启动其它应用程序的源代码实现在src/com/android/launcher2/Launcher.java文件中:

  1. /** 
  2. * Default launcher application. 
  3. */  
  4. public final class Launcher extends Activity  
  5.         implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {  
  6.   
  7.     ......  
  8.   
  9.     /** 
  10.     * Launches the intent referred by the clicked shortcut. 
  11.     * 
  12.     * @param v The view representing the clicked shortcut. 
  13.     */  
  14.     public void onClick(View v) {  
  15.         Object tag = v.getTag();  
  16.         if (tag instanceof ShortcutInfo) {  
  17.             // Open shortcut   
  18.             final Intent intent = ((ShortcutInfo) tag).intent;  
  19.             int[] pos = new int[2];  
  20.             v.getLocationOnScreen(pos);  
  21.             intent.setSourceBounds(new Rect(pos[0], pos[1],  
  22.                 pos[0] + v.getWidth(), pos[1] + v.getHeight()));  
  23.             startActivitySafely(intent, tag);  
  24.         } else if (tag instanceof FolderInfo) {  
  25.             ......  
  26.         } else if (v == mHandleView) {  
  27.             ......  
  28.         }  
  29.     }  
  30.   
  31.     void startActivitySafely(Intent intent, Object tag) {  
  32.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  33.         try {  
  34.             startActivity(intent);  
  35.         } catch (ActivityNotFoundException e) {  
  36.             ......  
  37.         } catch (SecurityException e) {  
  38.             ......  
  39.         }  
  40.     }  
  41.   
  42.     ......  
  43.   
  44. }  

相关推荐