美文网首页
android之app启动流程(一)

android之app启动流程(一)

作者: Lee_5566 | 来源:发表于2020-12-10 11:51 被阅读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文件中有以下配置:

    <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。

    相关文章

      网友评论

          本文标题:android之app启动流程(一)

          本文链接:https://www.haomeiwen.com/subject/ffyxiktx.html