Activity启动流程笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity启动流程笔记相关的知识,希望对你有一定的参考价值。
参考技术A 普通Activity的启动就是通过调用startActivity方法启动一个新的Activity,总体流程如下图:其中涉及到了两个进程,一个是App进程和AMS进程。整体的步骤是:
1.启动者Activity向Instrumentation请求启动目标的Activity。
2. Instrumentation通过AMS在App进程的IBinder接口(IActivityManager)访问AMS,此时App进程会阻塞等待AMS的调用返回,采用的跨进程通信技术是AIDL。
3.AMS会进行一系列的验证工作,如判断目标Activity实例是否存在、启动模式是什么、有没有在AndroidManifest中注册等等。
4.当AMS验证结束后会通过ClinentLifeCycleManager发送事物给App进程,利用App进程在AMS进程的IBinder接口(IApplicationThread)访问App进程ApplicationThread,采用的跨进程通信方式是AIDL。
5.ApplicationThread是ActivityThread的内部类,当ApplicationThread接受到来自AMS的事务后,会将事务直接转交给ActivityThread处理。
6.ActivityThread通过Instrumentation利用类加载器(反射)进行实例的创建,同时利用Instrumentation回调目标Activity的生命周期。
介绍几个关键的类:
Instrumentation:Instrumentation 是 Activity 与外界联系的类(不是 Activity 本身的类都统称为外界)。目标 Activity 通过 Instrumentation 来请求启动,ActivityThread 通过 Instrumentation 来创建 Activity 和回调 Activity 的生命周期。
ActivityThread:每个应用程序只有一个唯一实例,负责对 Activity 创建的管理。ActivityThread 的内部类 ApplicationThread 只负责 App 进程和 AMS 进程的通信,将来自 AMS 的事务交给 ActivityThread 处理。
AMS,全称 ActivityManagerService,系统级服务,负责管理四大组件。
根Actvity就是我们点击手机桌面图标时,应用程序启动的第一个Activity。启动根Activity的流程其实和启动普通Activity的流程类似,只是启动根Activity时需要新建一个App进程。总体流程如下图:
其中涉及到四个进程分别是:Launcher进程、AMS进程、App进程、Zygote进程。
1.点击桌面图标后,Launcher进程访问AMS进程请求启动目标Activity,采用的跨进程方式是AIDL。
2 AMS进程访问Zygote进程请求启动一个新的进程。采用的跨进程方式是Socket。
3 Zygote进程通过调用fork函数创建一个App进程。
4 App进程创建完成后,App进程访问AMS进程进行通知,采用的跨进程方式是AIDL。
5 AMS进程收到来自App进程的通知后,将启动Activity的操作封装成事务,并将封装好的事务发送给App进程。
6 App进程接受到来自AMS进程的事务后,根据事务创建目标Activity,并回调目标Activity的生命周期。
本文主要是用来记录自己的学习笔记,看原文请移步: Activity 启动流程
Activity 学习笔记02-生命周期
Activity 简介
Activity类是Android应用的关键组件,而Activity的启动和组合方式则是该平台应用模型的基本组成部分。它是一种可以包含用户界面的组件。
Android Activity 生命周期的状态和事件流程图如下:
Acvitity 生命周期的7个回调函数
一个Activity在其生命周期中会经历多种状态,您可以使用如下7个回调来处理状态之间的转换。具体说明如下:
- onCreate()
此回调必须实现,它会在系统第一次创建您的Activity时触发。应该在此方法中完成Activity的初始化操作,比如加载布局、绑定事件。
onCreate()完成后,下一个回调是onStart() - onStart()
onCreate()退出后,Acvitity将进入“已启动”状态,并对用户可见。此回调包含Activity进入前台与用户进行互动之前的最后准备工作 - onResume
系统会在Activity开始与用户互动之前调用此回调。此时,该Activity位于Activity堆栈的顶部,并且处于活动状态,并会捕获所有用户输入。应用的大部分核心功能都是在onResume()方法中实现。onResume()与onPause()是相对应的 - onPause
当Activity失去焦点并进入“Paused”状态时,系统就会调用onPause()。例如,当用户点击【Back】或者【最近使用的应用】按钮时,就会出现此状态。当系统为您的Activity调用onPause()时,从技术上来说,这意味着您的Activity仍然部分可见,但大多数情况下,这表明用户正在离开该Activity。该Activity很快将进入“Stopped”或者“Resumed”状态
如果用户希望界面继续更新,则处于“Stopped”状态的Activity也可以继续更新界面。
注意:不应使用onPause来保存应用或者用户数据、进行网络呼叫或者执行数据库事务。
onPause()执行完毕后,下一个回调为onStop()或者onResume(),具体取决于Activity进入“已暂停”状态后发生的情况 - onStop
当Activity 对用户不再可见时,系统会调用onStop()。出现这种情况的原因可能是Activity被销毁,新的Activity启动,或者现有的Activity正在进入“已恢复”状态并覆盖了已停止的Actiivty。
当处于“已停止”状态的Activity即将重启时,系统就会调用此回调。onRestart()就会从Activity停止时的状态恢复Activity。此回调的后面总是跟着onStart()。 - onDestroy()
系统会在销毁Activity之前调用此回调。此回调是Activity接收的最后一个回调。通常,实现onDestroy是为了确保销毁Activity或者包含该进程时释放该Activity的所有资源
以上7个方法除了onRestart()方法,其他都是两两相对的,从而可以将Activity分为三个生命周期 - 完整生存期。Activity在onCreate()和onDestroy()方法经历的生存期,一般情况下,Activity会在onCreate()方法中完成各种初始化操作,onDestroy()方法中完成释放内存的操作
- 可见生存期。Activity在onStart()方法和onStop()方法之间所经历的就是可见生存期。Activity对于用户总是可见的,即便有可能无法和用户进行交互
- 前台生存期。Activity在onResume()方法和onPause()方法经历的生存期,Activity总是处于运行状态,此时的Activity是可以和用户进行交互的。
实战
代码请同步到gitlab中
学习参考材料
- android- developers Activity
- 第一行代码-Android (第三版)
以上是关于Activity启动流程笔记的主要内容,如果未能解决你的问题,请参考以下文章
Framework源码面试六部曲:1.activity启动流程
深入理解Activity启动流程–Activity Task的调度算法