首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >android之app启动流程(一)

android之app启动流程(一)

作者头像
李小白是一只喵
发布2020-12-14 16:29:13
发布2020-12-14 16:29:13
1.2K00
代码可运行
举报
文章被收录于专栏:算法微时光算法微时光
运行总次数:0
代码可运行

安卓应用的启动流程

直观上的操作: 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文件中有以下配置:

代码语言:javascript
代码运行次数:0
运行
复制
<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。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安卓应用的启动流程
  • 基础知识
    • android桌面的active
    • 点击桌面图标后,系统的相关动作
  • App启动分析
    • 响应点击事件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档