首页 > 编程知识 正文

app运行流程图,Android移动应用基础教程

时间:2023-05-05 13:09:22 阅读:139058 作者:2408

我们平时在手机桌面上点击APP图标就可以启动APP。 在用户看来,这个过程看起来很简单,但其背后隐藏着什么玄机呢? 我认为在安卓开发多年后,即使启动APP,也有必要认真分析变成了什么样的流程。

1. android app流程基础理论

1.1每个Android App都位于独立的空间中,运行在独立的进程中,具有自己的VM,意味着系统被分配了唯一的用户ID。

1.2 Android App由许多不同的组件组成,这些组件还可以启动其他App的组件。 因此,Android App没有像程序入口那样的main ()方法。

Android进程与Linux进程相同。 默认情况下,每个apk都在自己的Linux进程中运行。 此外,缺省进程只有一个线程。 这个主线程有一个Looper实例,它通过调用Looper.loop ()从消息队列中检索消息来进行响应

那么,这个过程是什么时候开始的呢?

简而言之,进程将在需要时启动。 无论何时,当用户或其他组件调用你的apk的任何组件时,如果你的apk没有运行,系统将为此创建并启动新的进程。 通常,这个过程会持续运行,直到被系统杀死。

重要的是,流程是根据需要制定的。

2 .启动进程

关于Android的APP应用程序的说明,在android guide中有以下内容。

按预设, everyapplicationrunsinitsownlinuxprocess.androidstartstheprocesswhenanyoftheapplication’scomponentsneeedtobexexecution thened olongerneedorwhenthesystemmustrecovermemoryforotherapplications。

缺省情况下,所有Android APP都在他自己的linux进程中执行。 android操作系统在此Android APP中的组件需要运行时启动此APP进程,如果此APP进程中没有运行该组件,或者系统因其他APP而无法运行因此,如果需要启动此APP应用程序的四个组件之一,请首先启动此APP应用程序(如果尚未启动此APP应用程序的进程)。

用户单击home APP图标启动APP时:

851999-a9c2c456c9f91596.jpg

Click事件调用开始活动(intent ),并通过绑定IPC机制最终调用活动管理服务。 此服务执行以下操作:

第一步是使用PackageManager的resolveIntent ()收集此intent对象的指向信息。

点位信息存储在internet对象中。

下一个重要步骤是使用grantUriPermissionLocked ()方法验证用户是否具有调用intent对象指向的Activity的足够权限。

如果有权限,ActivityManagerService将检查目标activity并在新的任务中启动。

现在是检查此进程中是否存在ProcessRecord的时候了。

如果ProcessRecord为空,则ActivityManagerService将创建用于实例化目标activity的新进程。

2.1创建流程

ActivityManagerService调用startProcessLocked ()方法来创建新的进程。 此方法通过上述套接字通道将参数传递给Zygote进程. Zygote孵化本身,并调用ZygoteInit.main )方法实例化activivaty

然后,ActivityThread将依次调用Looper.prepareLoop ()和Looper.loop () )以打开消息吉鲁。

流程图为以下:

851999-b6b5dacf9d1488f9.jpg

2.2绑定APP

下一步是将流程与指定的Application绑定在一起。 可以通过从上一节的ActivityThread对象调用bindApplication ()方法来完成此操作。 此方法将BIND_APPLICATION消息发送到消息队列,并最终通过handleBindApplication

流程是下一个:

851999-32893aa

f343caeac.jpg

2.3 启动Activity

经过前两个步骤之后, 系统已经拥有了该application的进程. 后面的调用顺序就是普通的从一个已经存在的进程中启动一个新进程的activity了.

实际调用方法是realStartActivity(), 它会调用application线程对象中的sheduleLaunchActivity()发送一个LAUNCH_ACTIVITY消息到消息队列中, 通过 handleLaunchActivity()来处理该消息.

假设点击的是一个视频浏览的App, 其流程如下:

851999-9f76d2f18051881c.jpg

在其他博客上看到对于启动流程的总结,感觉比较通俗易懂

大家都知道 Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,当我开机的时候init进程就会fork出一个Android的第一个新的进程Zygote,中文翻译过来要”受精卵”,一个很有意识的名字。为什么这么说呢,当我们Zygote进程跑起来后,Android为了实现实现资源共用和更快的启动速度,通过Zygote进程直接去fork出一些子进程,这就是为什么要”受精卵”的原因,也就是我们的app全部都是基于Zygote上的 ,没有Zygote就没有我们,当Zygote初始化完成之后,首先会fork它的第一个子进程SystemServer,这个类非常的重要,为什么这么说呢?因为系统里面重要的服务都是在这个进程里面开启的,比如ActivityManagerService、PackageManagerService、WindowManagerService等等,有木有觉得似曾相识当SystemServer跑起来后,这些重要的服务也会随之创建,系统初始化完成之后我们就会进到系统桌面->Launcher,其实Launcher也是一个app,它继承自Activity,当我们点击桌面上的app后,系统就会为我们的app创建一个进程,然后启动我们App的第一个类ActivityThread其实说到底我们的app就是一个main函数,也就是启动了ActivityThread.main()。我们重点来看下这个类

参考文档

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。