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进程。
打开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]
点击桌面图标后,系统的相关动作
流程如下:
- 呈现Android桌面视图(View)
- 点击View上某个应用图标
- 产生点击事件
- 点击事件被响应
- 通知Android系统的某个/某些进程
- Android系统执行某些操作
- 启动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。