android之app启动流程(一)

2020-12-10  本文已影响0人  Lee_5566

安卓应用的启动流程

直观上的操作:
Android系统桌面->点击应用图标->启动App
不过在内部还是要进行许多工作的。先来了解下基础知识。

基础知识

启动进程相关
进程 介绍
Launcher进程 整个App启动流程的起点,负责接收用户点击屏幕事件,它其实就是一个Activity,里面实现了点击事件,长按事件,触摸等事件,可以这么理解,把Launcher想象成一个总的Activity,屏幕上各种App的Icon就是这个Activity的button,当点击Icon时,会从Launcher跳转到其他页面。
SystemServer进程 这个进程在整个的Android进程中是非常重要的一个,地位和Zygote等同,它是属于Application Framework层的,Android中的所有服务,例如AMS, WindowsManager, PackageManagerService等等都是由这个SystemServer fork出来的。
App进程 你要启动的App所运行的进程。
涉及的启动类
类名 介绍
ActivityManagerService (AMS)AMS是Android中最核心的服务之一,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要,它本身也是一个Binder的实现类。
Instrumentation 监控应用程序和系统的交互。
ActivityThread 应用的入口类,通过调用main方法,开启消息循环队列。ActivityThread所在的线程被称为主线程。
ApplicationThread ApplicationThread提供Binder通讯接口,AMS则通过代理调用此App进程的本地方法。
ActivityManagerProxy AMS服务在当前进程的代理类,负责与AMS通信。
ApplicationThreadProxy ApplicationThread在AMS服务中的代理类,负责与ApplicationThread通信。

android桌面的active

使用adb shell dumpsys activity activities命令查看下当前系统中有哪些active。
其中我们可以看到一个叫做launcher的类,这个就是上面描述的Launcher进程。

无标题.png
打开opengrop,查看[]Launcher源码(http://androidxref.com/2.3.6/xref/packages/apps/Launcher2/src/com/android/launcher2/Launcher.java)
image.png
可以看到这个类是继承于active类的。

代码版本:* 2011-09-02 - New Index: [Gingerbread - 2.3.6]

点击桌面图标后,系统的相关动作

流程如下:

  1. 呈现Android桌面视图(View)
  2. 点击View上某个应用图标
  3. 产生点击事件
  4. 点击事件被响应
  5. 通知Android系统的某个/某些进程
  6. Android系统执行某些操作
  7. 启动App。

App启动分析

响应点击事件

android源码中对点击事件的处理:


image.png

基本的逻辑如下:
==>产生点击事件
==>判断产生点击事件的View的Tag是ShortcutInfo(即启动应用的快捷方式)
==>如果是,就会取得ShortcutInfo中保存的Intent(这个Intent指向我们要启动的App)
==>执行startActivity方法

所以,Launcher响应我们产生的点击事件后,实际上就是启动一个新的Activity。

在App开发时,每个App都需要有一个“MainActivity”,这个Activity必须在AndroidManifest.xml文件中有以下配置:

<intent-filter>    
    <action android:name="android.intent.action.MAIN" />    
    <category android:name="android.intent.category.LAUNCHER" />    
</intent-filter>

AndroidManifest.xml中,将Activity的Action指定为android.intent.action.MAIN,会使Activity在一个新的Task中启动(Task是一个Activity栈)。

将category指定为android.intent.category.LAUNCHER,表示通过Intent启动此Activity时,只接受category为LAUNCHER的Intent。

上一篇下一篇

猜你喜欢

热点阅读