`

Android Launcher 分析【转】

阅读更多

http://blog.csdn.net/fengkehuan/archive/2011/02/24/6205980.aspx

1. Launcher的启动过程

从网络上找了一段关于Launcher的启动过程的文章,作为学习Launcher的背景知识:

Linux kernel启动以后会通过app_main进程来初始化android Runtime Java运行环境,而zygoteAndroid的第一个进程。所有的android的应用以及大部分系统服务都是通过zygote fork出来的子进程(我现在看到的只有native的service manager不是zygote fork出来的)。在system server中启动的若干系统服务中与我们启动进程相关的就是Acitivity Manager
  当systerm server启动好所有服务以后,系统就进入”system ready”状态,这个时候Activity Manager就登场了。Activity Manager光看代码行就知道是一个重量级的服务,它主要管理Activity之间的跳转,以及进程的生命周期。当Activity Manager发现系统已经启动好以后它就会发出一个intent:

  1. Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);  
  2. intent.setComponent(mTopComponent);  
  3. if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {  
  4.     intent.addCategory(Intent.CATEGORY_HOME);  
  5. }  


通过这个category类型为home的intent,Activity Manager就会通过:
 

  1. startActivityLocked(null, intent, nullnull, 0, aInfo,  
  2.  nullnull, 0, 0, 0, falsefalse);  

启动Home进程了。而这个启动Home进程的过程实际上还是去通过zygote fork出的一个子进程。

 

 

因此只要在manifest中具备这样的intent-filter都可以在开机的时候作为Home启动:

  1. <intent-filter>  
  2. <action android:name="android.intent.action.MAIN" />  
  3. <category android:name="android.intent.category.HOME"/>  
  4. <category android:name="android.intent.category.DEFAULT" />  
  5. </intent-filter>  


多个home之间的switch会在开始的时候有个选择,至于这个选择好像是package manager来实现的,没有仔细研究过。

 

2.UI结构

通过launcher/Res/Layout-land/launcher.xml分析可以得到主屏幕的UI结构:

 

整个homescreen是一个包含三个child view的FrameLayout(com.android.launcher.DragLayer)。


第一个child就是桌面com.android.launcher.Workspace。这个桌面又包含三个child。每个child就对应一个桌面。这就是你在Android上看到的三个桌面。每个桌面上可以放置下列对象:应用快捷方式,appwidget和folder。


第二个child是一个SlidingDrawer控件,这个控件由两个子控件组成。一个是com.android.launcher.HandleView,就是Android桌面下方的把手,当点击这个把手时,另一个子控件,com.android.launcher.AllAppsGridView就会弹出,这个子控件列出系统中当前安装的所有类型为category.launcher的Activity。


第三个child是com.android.launcher.DeleteZone。当用户在桌面上长按一个widget时,把手位置就会出现一个垃圾桶形状的控件,就是这个控件。

3.应用程序代码分析

Launcher中的AndroidManifest.xml可以看出整个Launcher的代码结构。

首先,是一些权限的声明。例如:

  1. <uses-permission android:name="android.permission.CALL_PHONE" />  
  2. <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />  
 

 

这部分可以略过;

其次,Application的构成,如上图:

 

(1)LauncherHomeScreenActivity


  1. <intent-filter>  
  2.  <action android:name="android.intent.action.MAIN" />  
  3.  <category android:name="android.intent.category.HOME"/>  
  4.  <category android:name="android.intent.category.DEFAULT" />  
  5. <category android:name="android.intent.category.MONKEY" /> </intent-filter>  

 

上面这段代码就标志着它是开机启动后HomeActivity。通过Launcher.javaonCreat()的分析我们可以大致把握屏幕的主要活动:

 

分享到:
评论

相关推荐

    安卓Android源码——安卓Android Launcher 桌面分页滑动代码.rar

    下面,我们将深入探讨Android Launcher桌面分页滑动的相关知识点。 1. **Android UI框架**:在Android中,用户界面主要由View和 ViewGroup 组成。View是基本的UI元素,如按钮、文本框等,而ViewGroup则是布局容器,...

    android Launcher源码详解

    本文将对 Launcher 的源码进行深入分析,探讨其运行机制和设计思想。 一、Launcher 的整体结构 Launcher 的整体结构可以通过查看 Launcher.xml 布局文件和使用 hierarchyviewer 布局查看工具来了解。从 hierarchy...

    Android Launcher3源码

    通过分析`Launcher3`的源码,我们可以深入理解Android系统桌面的工作原理,了解如何定制自己的启动器。 1. **项目结构** `Launcher3`源码结构分为几个主要部分:UI组件、数据模型、后台服务、偏好设置和资源文件。...

    android Launcher2.2源码

    1. **Launcher结构分析** Launcher由多个关键组件构成,包括Activity、Service、BroadcastReceiver以及ContentProvider。其中,主Activity是整个应用的核心,它负责加载并显示桌面图标和应用抽屉。源码中的`...

    android Launcher2文件夾功能分析

    **Android Launcher2 文件夹功能分析** 在Android操作系统中,Launcher是用户界面的核心组成部分,它扮演着桌面的角色,允许用户启动应用程序、创建快捷方式以及管理主屏幕上的图标布局。`Launcher2`是Android早期...

    android2.3 launcher分析

    ### Android 2.3 Launcher分析 #### 架构概述 Android 2.3 版本中的Launcher采用的是经典的MVC(Model-View-Controller)架构模式。这种模式将应用程序分为三个核心部分:模型(Model)、视图(View)以及控制器...

    android launcher2源码

    源码分析可以帮助我们理解Android系统的启动过程、应用程序的管理方式以及UI布局和交互逻辑。 1. **启动流程**: 当设备启动时,Launcher2作为系统的一部分被加载。源码中`com.android.launcher2.Launcher`类是...

    android2.3 launcher分析三

    【Android 2.3 Launcher 分析】 Android 2.3 的 Launcher 是用户界面的核心部分,它作为设备的主要入口,提供用户访问应用程序、小部件和设置的界面。在深入分析之前,我们先了解一下 Launcher 的基本架构。 **...

    Android高级应用源码-Android Launcher 源码修改可编译.zip

    《深入解析Android Launcher源码:实现可编译的高级应用》 在移动操作系统的世界中,Android以其开源性和灵活性深受开发者喜爱。本资料包提供的是一个经过修改,可编译的Android Launcher源码,旨在帮助开发者深入...

    android Launcher添加widget源码

    通过分析JYCLauncher的源码,我们可以深入了解Android自定义Launcher中添加Widget的细节,以及如何实现动态添加功能。这不仅可以帮助开发者理解Android系统的内部工作原理,还能为开发具有独特特性的Launcher应用...

    Android应用源码之Android Launcher 桌面分页滑动代码.zip

    这个"Android应用源码之Android Launcher 桌面分页滑动代码"压缩包,显然是为了帮助开发者深入理解Android Launcher的实现原理,特别是关于桌面分页滑动的部分。下面将详细解析这个主题。 一、Android Launcher概述...

    android手把手教你开发launcher(AndroidStudio版)

    Android Studio是官方推荐的Android应用开发环境,它提供了强大的代码编辑、调试、性能分析以及应用打包功能。在Launcher应用的开发过程中,Android Studio不仅可以帮助开发者快速搭建项目结构,还可以利用其内置的...

    Android11 Launcher3

    - **源代码分析**:Launcher3的源代码是开源的,开发者可以从GitHub上的"Launcher3-master"项目获取,通过阅读和理解源码,可以深入学习Android启动器的实现细节。 - **调试工具**:使用Android Studio的调试...

    Launcher3_androidlauncher_android开发_

    二、Launcher3 架构分析 1. **Activity与Fragment**:Launcher3由多个Activity和Fragment组成,每个主屏幕对应一个Fragment。Activity负责整体管理,Fragment则承载具体的桌面视图。 2. **数据存储**:Launcher3...

    Android-launcher源码全面分析

    Android-launcher源码全面分析 一 Launcher默认界面配置(default workspace) 2 1 界面默认配置文件 2 2 LauncherProvider java的loadFavorites分析 3 二 Icon修改 界面布局调整 壁纸设置 5 1 图标大小和标题大小 5...

    Android Launcher 源码

    Android Launcher 是Android操作系统中的核心组件之一,它是用户与设备交互的入口,负责显示应用程序的图标、小部件和其他桌面元素。源码分析可以帮助开发者深入理解Android系统的工作原理,从而提升应用开发的能力...

    android launcher 分析修改、定制记录

    基于原生launcher做定制,做了3个项目了,这里有些经验与大家分享一下,顺便混点分。里边的大部分内容是通用的具有参考价值,小部分内容是我所涉及的项目特定的。

    android2.3 launcher分析一

    android2.3 launcher分析一

    android2.3 launcher分析二

    ### Android 2.3 Launcher分析之桌面组件与默认配置 #### 概述 本文将深入探讨Android 2.3版本中的Launcher系统,并重点分析LiveFolder的功能及其如何与Launcher交互,以及Launcher默认界面配置的方式和方法。 ##...

Global site tag (gtag.js) - Google Analytics

 

  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3. //把xml文件的内容实例化到View中  
  4.         mInflater = getLayoutInflater();  
  5. //监听应用程序控件改变事件  
  6.         mAppWidgetManager = AppWidgetManager.getInstance(this);  
  7.         mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);  
  8.         mAppWidgetHost.startListening();  
  9. // 用于调试?      
  10.         if (PROFILE_STARTUP) {  
  11.             android.os.Debug.startMethodTracing("/sdcard/launcher");  
  12.         }  
  13.   //监听locale,mcc,mnc是否改变,如果改变,则重写新配置  
  14.       //mcc:mobile country code(国家代码China 460); mnc:mobile network code(网络代码)  
  15.         checkForLocaleChange();  
  16.        /*This allows such applications to have a virtual wallpaper that is larger than the physical screen, matching the size of their workspace.*/  
  17.         setWallpaperDimension();  
  18. //显示主屏幕UI元素,workspace,slidingdrawer(handleview and appgridview),deletezone  
  19.         setContentView(R.layout.launcher);  
  20. //Finds all the views we need and configure them properly.  
  21. //完成workspace,slidingdrawer,deletezone的各种事件操作和监听  
  22.         setupViews();  
  23. //Registers various intent receivers.  
  24. //允许其他应用对本应用的操作  
  25.         registerIntentReceivers();  
  26. //Registers various content observers.  
  27. //例如,注册一个内容观察者跟踪喜爱的应用程序  
  28.         registerContentObservers();  
  29. //重新保存前一个状态(目的??)  
  30.         mSavedState = savedInstanceState;  
  31.         restoreState(mSavedState);  
  32. //调试?  
  33.         if (PROFILE_STARTUP) {  
  34.             android.os.Debug.stopMethodTracing();  
  35.         }  
  36. //Loads the list of installed applications in mApplications.  
  37.         if (!mRestoring) {  
  38.             startLoaders();  
  39.         }