Android—launcher 启动流程

Posted Gjson

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android—launcher 启动流程相关的知识,希望对你有一定的参考价值。


Launcher应用程序在启动过程中会通过PackageManagerService服务请求查询系统所有的已安装应用的包名,图标和应用名称等信息,然后填充到Launcher中的Adapter中,这样点击某一项应用图标的时候就可以根据该图标的包名和启动Activity的类名初始化Intent对象,然后调用startActivity(Intent)启动相关的应用程序了。

其实android中应用进程可以通过许多方式启动,比如启动一个Activity,启动一个Service,启动一个ContentProvider或者是一个BroadcastReceiver,也就是说我们可以通过启动四大组件的方式启动应用进程,在应用进程没有启动的时候,如果我们通过启动这些组件,这时候系统会判断当前这些组件所需要的应用进程是否已经启动,若没有的话,则会启动应用进程。

Launcher也是一个应用、有自己所属的运行进程,点击一个图标,开启一个新的应用。

分析从点击图标到新的应用的Activity执行onCreate的执行流程.注意学习Binder机制

Laucher启动一个新的应用

  1. 无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口;
  2. ActivityManagerService调用ActivityStack.startActivityMayWait来做准备要启动的Activity的相关信息;
  3. ActivityStack通知ApplicationThread要进行Activity启动调度了,这里的ApplicationThread代表的是调用ActivityManagerService.startActivity接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是Launcher了,而对于通过在Activity内部调用startActivity的情景来说,这个进程就是这个Activity所在的进程了;
  4. ApplicationThread不执行真正的启动操作,它通过调用ActivityManagerService.activityPaused接口进入到ActivityManagerService进程中,看看是否需要创建新的进程来启动Activity;
  5. 对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中进行启动;
  6. ActivityManagerServic调用ApplicationThread.scheduleLaunchActivity接口,通知相应的进程执行启动Activity的操作;
  7. ApplicationThread把这个启动Activity的操作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。

详细流程

  1. Launcher 通过 Binder进程间通信机制通知 ActivityManagerService,它要启动一个Activity;
  2. ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
  3. Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;
  4. ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
  5. ActivityManagerService 通过 Binder 进程间通信机制通知 ActivityThread, 现在一切准备就绪,它可以真正执行Activity的启动操作了。

ActivityThread:ActivityThread类有一个main方法,它是应用程序的入口,每启动一个应用进程,都会创建ActivityThread与之对应的实例,是应用程序的UI线程,Android进程启动时会建立消息循环。

ApplicationThread & ApplicatinThreadNative:ApplicationThread用来实现AMS(ActivityManagerService)与AT(ActivityThread)之间的交互。在AMS需要管理相关Application中的Activity的生命周期时,通过ApplicationThread与AT通讯,ApplicationThreadNative是ApplicationThread在客户端的实现(binder机制)。

ApplicationThreadProxy:ApplicationThreadProxy是ApplicationThread在服务器端的代理。负责和服务器端的ApplicatingThreadNative通讯。 AMS就是通过该代理与ActivityThread进行通信的(binder机制)。

Activity & Intrumentation:Activity是应用程序真正做事情的类,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用(也就是说mInstrumentation是Activity类的成员变量,前文图解中也有说明)。
Instrumentation用来监控应用程序和系统的交互,可以理解为应用进程的管家,AT要创建或暂停某个Activity时,都需要通过Instrumentation。 通俗的理解,Instrumentation 与AT的区别,前者像是一个“家庭”里的“管家”,后者是负责创建这个“家庭”,并负责对外打交道,比如接收AMS的通知等。

以上是关于Android—launcher 启动流程的主要内容,如果未能解决你的问题,请参考以下文章

Android—launcher 启动流程

Android—launcher 启动流程

Android 中应用程序Activity的冷启动流程

从launcher程序启动App流程分析

android7.x Launcher3源码解析---workspace和allapps加载流程

android7.x Launcher3源代码解析---workspace和allapps载入流程