Android6.0 AMS启动Activity(一) 启动Activity两种方式
来源:互联网 发布:义隆单片机 编辑:程序博客网 时间:2024/05/23 01:57
原文:http://blog.csdn.net/luoshengyang/article/details/6685853
在Android系统中,有两种操作会引发Activity的启动:
一种用户点击应用程序图标时,Launcher会为我们启动应用程序的主Activity;
而另一种当应用程序的默认Activity启动起来后,它又可以在内部通过调用startActvity接口启动新的Activity,依此类推,每一个Activity都可以在内部启动新的Activity。通过这种连锁反应,按需启动Activity,从而完成应用程序的功能。
无论是通过点击应用程序图标来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都要借助于应用程序框架层的ActivityManagerService服务进程。
Android应用程序框架层中的ActivityManagerService启动Activity的过程大致如下图所示:
在这个图中,ActivityManagerService和ActivityStack位于同一个进程中,而ApplicationThread和ActivityThread位于另一个进程中。其中,ActivityManagerService是负责管理Activity的生命周期的,ActivityManagerService还借助ActivityStack是来把所有的Activity按照后进先出的顺序放在一个堆栈中;对于每一个应用程序来说,都有一个ActivityThread来表示应用程序的主进程,而每一个ActivityThread都包含有一个ApplicationThread实例,它是一个Binder对象,负责和其它进程进行通信。
下面简要介绍一下启动的过程:
Step 1. 无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口;
Step 2. ActivityManagerService调用ActivityStack.startActivityMayWait来做准备要启动的Activity的相关信息;
Step 3. ActivityStack通知ApplicationThread要进行Activity启动调度了,这里的ApplicationThread代表的是调用ActivityManagerService.startActivity接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是Launcher了,而对于通过在Activity内部调用startActivity的情景来说,这个进程就是这个Activity所在的进程了;
Step 4. ApplicationThread不执行真正的启动操作,它通过调用ActivityManagerService.activityPaused接口进入到ActivityManagerService进程中,看看是否需要创建新的进程来启动Activity;
Step 5. 对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中进行启动;
Step 6. ActivityManagerServic调用ApplicationThread.scheduleLaunchActivity接口,通知相应的进程执行启动Activity的操作;
Step 7. ApplicationThread把这个启动Activity的操作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。
这样,Android应用程序的Activity启动过程就简要介绍到这里了。
- Android6.0 AMS启动Activity(一) 启动Activity两种方式
- Android6.0 AMS启动Activity(一) 启动Activity两种方式
- Android6.0 AMS启动Activity(四) AMS内部成员变量
- Android6.0 AMS启动Activity(二) 启动进程然后启动Activity
- Android6.0 AMS启动Activity(二) 启动进程然后启动Activity
- Android6.0 AMS启动Activity(三) 进程内部启动Activity
- Android6.0 AMS启动Activity(五) 在新进程中启动Activity
- Android6.0 AMS启动Activity(三) 进程内部启动Activity
- Android6.0 AMS启动Activity(六) AMS与PKMS关系(通过Intent获取ActivityInfo)
- Android6.0 AMS启动Activity(四) AMS内部一些成员变量
- Android6.0 AMS启动Activity(六) AMS与PKMS关系(通过Intent获取ActivityInfo)
- Android6.0 AMS 新进程中启动Activity
- Activity启动过程(一)AMS
- AMS启动Activity过程
- Activity两种启动方式
- 启动Activity两种方式
- Ams分析之activity启动
- AMS-启动Activity之二
- Android官方开发文档Training系列课程中文版:Activity测试之创建功能性测试
- JSP四个作用域
- Android App支付:支付宝SDK接入详细指南(附官方支付demo)
- 面向对象的三个基本特征摘要
- 准确率,召回率,F值 (Precision & Recall)
- Android6.0 AMS启动Activity(一) 启动Activity两种方式
- git 生成patch 并应用补丁
- System.getProperties和System.setProperties
- android 开发常用工具类汇总
- 基于C#的socket编程的TCP异步实现
- Android Studio,忽略文件提交不到svn中
- iOS 上传到AppStore上的icon尺寸和预览图片大小
- zookeeper安装
- Maven新建、更新……遇到“Could not calculate build plan”这一类问题怎么办