Activity启动过程详解

注:只是说明启动activity的过程(ActivityThread如何与ActivityManagerService简称AmS进行进程间通信调用全过程),不解析android从zygote(受精卵)到整个系统服务的启动

具体来讲,启动activity的方式有以下几种:

  1. 在应用程序中startActivity()或startActivityForResult()方法启动指定activity
  2. 在HOME(桌面)程序中单击应用图标,启动新的activity
  3. 按"BACK"键结束当前activity,自动启动上一个activity
  4. 长按“Home”键,显示出当前任务列表,从中选择一个启动。

先分析第2种方式

android的HOMe桌面程序(launcher)是android系统启动的第一个应用程序,其他的应用程序安装后,会在launcher上创建一个快捷图标,我们点击桌面上的快捷图标就会启动相应的app

桌面程序Launcher.java(源码基于4.2.2,我没有下载4.2.2,参考网上源码)

在android4.0\packages\apps\Launcher2\src\com\android\launcher2

当点击一个应用图标时会执行一连串流程

-》Launcher.onClick(View v)单击app图标

-》Launcher.startActivitySafely(v, intent, tag)这里比4.0多的一个参数,可能性能优化吧

-》Launcher.startActivity(v, intent, tag)

-》Activity.startActivity(intent, opts.toBundle())

-》Activity.startActivityForResult(intent, -1, options);

到这里直接跳转到第一个问题上来了(直接分析第一个就可以解决第二个)分析点击android桌面app图标启动应用程序的过程

第4种方式---长按“Home”键,显示出当前任务列表,从中选择一个启动

流程:

 public static final int KEYCODE_HOME            = 3;PhoneWindowManager.interceptKeyBeforeDispatching()处理长按home事件showRecentAppsDialog();//弹出近期任务的对话框 RecentApplicationsDialog.onclick.getContext().startActivity(intent);//到这里流程就相同了

这个调用的其实也是第1种的startActivity()。所以1,2,4可以用相同处理流程解析,在后面接绍第1中方式处理流程-----fly

android长按home键源码分析以及模拟长按home事件--弹出近期任务

第3种方式(原理与第1种大致相同)

假设一个app,ActivityA启动ActivityB,然后ActivityB按下"BACK"键其实执行的是activity的finish()方法

简单流程:

ActivityB.finish()
Activity.finish()
ActivityManagerNative.getDefault().finishActivity()
ActivityManagerService.finishActivity()
ActivityStack.requestFinishActivityLocked()
ActivityStack.finishActivityLocked()
ActivityStack.startPausingLocked() 

ActivityB向AmS发送finish()请求

// If the activity is PAUSING, we will complete the finish once
// it is done pausing; else we can just directly finish it here.

上面解释。AmS会先会在ActivityStack.finishActivityLocked()方法中检查我们要finish的activity的状态是否处于pause状态,如果是将直接执行finish操作,否则,必须先执行startPausingLocked()---这里终点是resume恢复上一个ActivityA,将A显示在前台窗口

IApplicationThread.schedulePauseActivity()
ActivityThread.schedulePauseActivity()
ActivityThread.sendMessage()
ActivityThread.H.sendMessage()
ActivityThread.H.handleMessage()
ActivityThread.handlePauseActivity()
ActivityThread.performPauseActivity()
Instrumentation.callActivityOnPause()
Activity.performPause()
Activity.onPause()
ActivityManagerNative.getDefault().activityPaused()
ActivityManagerService.activityPaused()
ActivityStack.activityPausedLocked()
ActivityStack.completePauseLocked() 

接上面,AmS通知当前ActivityB进入Paused状态,当ActivityB进入paused状态后即Activity.onPause()方法执行完后,通知AmS我已经执行完pause操作。于是AmS就准备要在ActivityB所在的进程和任务中恢复ActivityA了;

ActivityStack.resumeTopActivityLocked()
ActivityStack.resumeTopInnerLocked()
IApplicationThread.scheduleResumeActivity()
ActivityThread.scheduleResumeActivity()
ActivityThread.sendMessage()
ActivityTherad.H.sendMessage()
ActivityThread.H.handleMessage()
ActivityThread.H.handleResumeActivity()
Activity.performResume()
Activity.performRestart()
Instrumentation.callActivityOnRestart()
Activity.onRestart()
Activity.performStart()
Instrumentation.callActivityOnStart()
Activity.onStart()
Instrumentation.callActivityOnResume()
Activity.onResume() 

到这里activityA已经启动起来了,但是ActivityB还没有被finish掉,在ActivityThread.H.handleResumeActivity中会

调用Looper.myQueue().addIdleHandler(new Idler()) 这个方法实现ActivityB的最终销毁操作

Looper.myQueue().addIdleHandler(new Idler())
ActivityManagerNative.getDefault().activityIdle()
ActivityManagerService.activityIdle()
ActivityStackSupervisor.activityIdleInternalLocked()
ActivityStack.destroyActivityLocked()
IApplicationThread.scheduleDestoryActivity()
ActivityThread.scheduleDestoryActivity()
ActivityThread.sendMessage()
ActivityThread.H.sendMessage()
ActivityThread.H.handleMessage()
ActivityThread.handleDestoryActivity()
ActivityThread.performDestoryActivity()
Activity.performStop()
Instrumentation.callActivityOnStop()
Activity.onStop()
Instrumentation.callActivityOnDestory()
Activity.performDestory()
Acitivity.onDestory()
ActivityManagerNative.getDefault().activityDestoryed()
ActivityManagerService.activityDestoryed()
ActivityStack.activityDestoryedLocked() 

这就是finish()的全部流程了(具体与WindowsManagerService的交互以后再补充)

具体细节请fly------ Android源码解析之(十五)-->Activity销毁流程

第1种方式--ActivityA启动ActivityB为例

从startActivity()开始分析。

简单流程(有时间完整过一遍源码)

 1 Activity.startActivity
 2 Activity.startActivityForResult
 3 Instrumentation.execStartActivity
 4 ActivityManagerProxy.startActivity
 5 ActivityManagerService.startActivity
 6 ActivityStack.startActivityMayWait
 7 ActivityStack.startActivityLocked
 8 ActivityStack.startActivityUncheckedLocked
 9 ActivityStack.resumeTopActivityLocked
10 ActivityStack.startPausingLocked
11 ApplicationThreadProxy.schedulePauseActivity
12 ApplicationThread.schedulePauseActivity
13 ActivityThread.queueOrSendMessage
14 H.handleMessage
15 ActivityThread.handlePauseActivity
16 ActivityManagerProxy.activityPaused
17 ActivityManagerService.activityPaused
18 ActivityStack.activityPaused
19 ActivityStack.completePauseLocked
20 ActivityStack.resumeTopActivityLokced
21 ActivityStack.startSpecificActivityLocked
22 ActivityStack.realStartActivityLocked
23 ApplicationThreadProxy.scheduleLaunchActivity
24 ApplicationThread.scheduleLaunchActivity
25 ActivityThread.queueOrSendMessage
26 H.handleMessage
27 ActivityThread.handleLaunchActivity
28 ActivityThread.performLaunchActivity
29 AcitiviyB.onCreate

Android应用程序内部启动Activity过程(startActivity)的源代码分析

要查看ActivityManagerNative.java,ActivityManagerProxy.java,ActivityManagerService,还有binder关系看一张图就可以了

从图中可以看出代理类:使用ActivityManagerProxy代理类,来代理ActivityManagerNative类的子类ActivityManagerService;

所以执行请求都是传递到ActivityManagerService进行处理

Android学习——ActivityManager与Proxy模式的运用

时间: 2024-09-30 07:03:24

Activity启动过程详解的相关文章

计算机启动过程详解

计算机启动过程详解打开电源启动机器几乎是电脑爱好者每天必做的事情,面对屏幕上出现的一幅幅启动画面,我们一点儿也不会感到陌生,但是,计算机在显示这些启动画面时都做了些什么工作呢?相信有的朋友还不是很清楚,本文就来介绍一下从打开电源到出现Windows的蓝天白云时,计算机到底都干了些什么事情.  首先让我们来了解一些基本概念.第一个是大家非常熟悉的BIOS(基本输入输出系统),BIOS是直接与硬件打交道的底层代码,它为操作系统提供了控制硬件设备的基本功能.BIOS包括有系统BIOS(即常说的主板BI

Linux(RHEL6)启动过程详解

Linux(红帽RHEL6)启动过程详解: RHEL的一个重要和强大的方面是它是开源的,并且系统的启动过程是用户可配置的.用户可以自由的配置启动过程的许多方面,包括可以指定启动时运行的程序.同样的,系统关机时所要终止的进程也是可以进行组织和配置的,即使这个过程的自定义很少被需要. 理解系统的启动和关机过程是如何实现的不仅可以允许自定义,而且也可以更容易的处理与系统的启动或者关机相关的故障.  1.启动过程  以下是启动过程的几个基本阶段:   ① 系统加载并允许boot loader.此过程的细

VxWorks启动过程详解(下)

上一节主要是从映像的分类和各种映像的大致加载流程上看VxWorks的启动过程,这一节让我们从函数级看一下VxWorks的启动过程: 1. Boot Image + Loadable Images: 下面是具体的流程图: 其中第一阶段的执行流程使用的是上图的左边的源文件中的那些函数(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot);第二阶段执行流程使用的是上图中右边源文件中的那些函数(sysInit-&

VxWorks启动过程详解(上)

vxworks有三种映像: VxWorks Image的文件类型有三种 Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM ROM-based Images(压缩/没有压缩):即将Image直接烧入ROM,运行时将Image拷入RAM中运行. ROM-Resident Images:Image的指令部分驻留在ROM中运行,仅将数据段部分拷入RAM. 注意这里说的三种映像都是包含真正操作系统VxWorks的映像,其中后两种可以直接启动并运行起来,但是第一种不行,它必须

solaris启动过程详解

在Sparc平台下,Solaris系统中有一个类似PC BIOS的芯片程序(EEPROM OpenBoot)负责识别分区.文 件系统和加载内核,在Solaris 2.6之后的版本中,默认的内核文件存放在/platform/`arch`/kernel/unix 位置,`arch`指令是指明系统的硬件体系,目前一般是i86pc(Intel IA32)或sun4u(Sun UntraSparc). 在Intel体系中,因为没有eeprom firmware,所以系统提供了一个模拟eeprom的引导程序

cocos2dx 启动过程详解一:渲染

今天来看一下cocos2d-x的整体启动过程: cocos2d-x 在各个平台的实现代码是一样的,只要针对不同平台做相应的配置就可以了. 一.启动前奏 现在来看一下在ios平台下的相关结构: 打开源代码自带工程,你会看到一个main文件,这里main里面有一个main函数,这是程序的入口函数.在这里他回加载AppController,进入这个类,这里有ios平台华景初始化代码,但是最先执行的如下: // cocos2d application instance static AppDelegat

cocos2dx 启动过程详解二:内存管理和回调

在上一篇的第二部分中,我们有一句代码待解释的: // Draw the Scene void CCDirector::drawScene(void) { -- //tick before glClear: issue #533 if (! m_bPaused) //暂停 { m_pScheduler->update(m_fDeltaTime);   //待会会解释这里的内容 } -- } 这里是一个update函数,经常会写像this->schedule(schedule_selector(X

Fabric网络环境启动过程详解

这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程 fabric网络环境启动过程详解 上一节我们讲到 fabric网络环境的启动测试,主要是使用 ./network_setup.sh up 这个命令,所以fabric网络环境启动的重点就在network_setup.sh这个文件中.接下来我们就分析一下network_setup.sh这个文件network_setup.sh其中包括两个部分,一个

转-Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=26042 1)BIOS自检2)启动Grub/Lilo3)加载内核4)执行init进程5)通过/etc/inittab文件进行初始化6)登陆Linux 1)BIOS自检   a)POST(Power On Self Test),对硬件进行检测   计算机在通电后首先由BIOS进行自检,即所谓的POST(Power On Self Test),对硬件进行检测   依据BIO