Android Activity学习笔记——Activity的启动和创建
http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html
最近学习Android相关知识,感觉仅仅了解Activity几个生命周期函数基本上没有任何意义的;
于是想深入了解一下Activity到底是怎么一回事怎么运行来的;里面的东东真是叫个庞大;
现在只能简单的了解其框架性的概念和流程;
一 Activity概念
Android的核心不是Application而是Activity,至少在我们开发的时候是这样的;
Activity就是被用来进行与用户交互和用来与android内部特性交互的组件,
在应用程序中用到的所有activity都需要在manifest.xml文件中进行注册;
那么Activity又是怎样一种组件,怎么样进行显示交互的,一个activity实例是如何被管理和运行起来的,activity生命周期又是怎么一回事。
二 Activity框架和管理结构
Activity管理的核心是AcitivityManagerService,是一个独立的进程;
ActiveThread是每一个应用程序所在进程的主线程,循环的消息处理;
ActiveThread与AcitivityManagerService的通信是属于进程间通信,使用binder机制;
三 Activity启动过程
以启动一个应用程序startActivity为例看一下代码执行的大概流程:
可将其分为6个过程:
1 使用代理模式启动到ActivityManagerService中执行;
2 创建ActivityRecord到mHistory记录中;
3 通过socket通信到Zgote相关类创建process;
4 通过ApplicatonThread与ActivityManagerService建立通信;
5 ActivityManagerService通知ActiveThread启动Activity的创建;
6 ActivityThread创建Activity加入到mActivities中并开始调度Activity执行;
请看下图:
并不是所有启动一个Activity都是这样的过程:一个应用程序中所有Activity只有一个ActivityThread属于一个Process;
ActivityStack并不是每次都需要创建一个Stack来管理Activities;
下面看看adnroid系统中四个重要概念:
Application:由多个相关的松散的与用户进行交互Activity组成,通常被打包成apk后缀文件中;
Activities:应用程序的主要组成部分,是应用程序的核心;
ActivityStack:将应用程序中打开的Activity保存在历史栈中,按照栈的先进后出的原则;
Start Activity时入栈,返回时出栈;
Task:将一系列相关的Activity组合,完成某个应用程序完整操作;不管activity属于哪
个Application的;
例如:写信息—调用—文件管理,都属于一个Task,但属于两个Application;
四 Activity启动流程类结构分析
1 ActivityService相关类
使用了Proxy代理模式:ActivityManagerProxy代理ActivityManagerService;
并为之提供了公共的访问接口:IActivityManager;
2 Activity启动
3 ActivityStack管理
ActivityStack创建并存储系列创建的Activity实例,将其入栈管理mHistory;
4 ActivityThread
This manages the execution of the main thread in anapplication process,
scheduling and executing activities,broadcasts, and other operations on it as the activity manager requests.
是应用程序的主线程,消息循环执行者;其中有很多的内部类来完成工作;
ActivityThread使用内部类:ApplicationThread与ActivityManagerService进行通信,
ActivityThread将状态变化传递控制客户端Activity的状态执行;
mActivities保存由ActivityStack所创建的ActivityRecord相关实例引用;
借助网上一些达人的总结以及自己结合代码的分析,总结上述流程框架方面的东东;
可能并不一定准确或存在漏洞,恳请达人指点多谢;
Android Activity学习笔记——Activity的启动和创建的更多相关文章
- Android学习笔记——Activity的启动和创建
http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...
- Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
---------------------------------------------------------------------------------------------------- ...
- Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例
---------------------------------------------------------------------------------------------------- ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Android:日常学习笔记(6)——探究活动(4)
Android:日常学习笔记(6)——探究活动(4) 活动的启动模式 standard模式 standard是活动默认的启动模式,在不进行显示定义的情况下,所有活动都会自动使用这种启动模式. stan ...
- Android:日常学习笔记(6)——探究活动(3)
Android:日常学习笔记(6)——探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...
- Android:日常学习笔记(5)——探究活动(2)
Android:日常学习笔记(5)——探究活动(2) 使用Intent在活动之间穿梭 什么是Intent Intent时Android程序中各组件之间进行交互的一种重要方式,他不仅可以指明当前组件想要 ...
- Android:日常学习笔记(2)——分析第一个Android应用程序
Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...
- Android Studio 学习笔记(一)环境搭建、文件目录等相关说明
Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...
随机推荐
- Tomcat8源码笔记(二)Bootstrap启动
TOMCAT源码调试入口是Bootstrap类的main方法,我的启动参数VM: -Dcatalina.home=E:/Tomcat_Source_Code/apache-tomcat-8.0.53- ...
- SpringBoot入门之Thymeleaf的使用
在.net的MVC3 或更高版本等支持 Razor 的框架里使用cshtml,Razor是一种简单的编程语法,用于在网页中嵌入服务器端代码.在使用springboot开发mvc时也有与.net类似的视 ...
- MyBatis从入门到放弃二:传参
前言 我们在mapper.xml写sql,如果都是一个参数,则直接配置parameterType,那实际业务开发过程中多个参数如何处理呢? 从MyBatis API中发现selectOne和selec ...
- C# 获取用户IP地址(转载)
[ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...
- angularjs通过ng-change和watch两种方式实现对表单输入改变的监控
angularjs通过ng-change和watch两种方式实现对表单输入改变的监控 直接上练习代码 <!DOCTYPE html> <html xmlns="http:/ ...
- Visual Studio 代码风格约束
团队内部若能统一代码风格对于日后的项目维护大有裨益,但面对厚达十几甚至几十页的代码风格规范,开发人员难免产生抵触心理.Python和Go等在语言层面就对代码风格作了一定的约束,但C#并没有,为解决这个 ...
- IdentityServer4-客户端定义-翻译
客户端定义(Defining Client) 客户端可以从你的IDS服务器请求tokens. 通常,客户端需要遵循下面的通用设置: 一个唯一的Client ID 如果需要还可以提供密码 允许与toke ...
- Eclipse快捷键 10个最有用的快捷键(转载收藏)
原文连接:https://www.cnblogs.com/iamfy/archive/2012/07/11/2586869.html Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级 ...
- JDK动态代理与CGLib动态代理相关问题
导读: 1.JDK动态代理原理是什么?为什么不支持类的代理? 2.JDK动态代理实例 3.CGLib代理原理是什么? 4.CGLib代理实例 5.JDK动态代理与CGLib代理的区别是什么? 6.总结 ...
- Android ContentProvider数据共享
一.构造一个自己的Provider实现App之间数据共享 1.我们先来了解一下 Uri(统一资源定位符) 定义:每一个Content Provider使用一个公开的URI唯一标示其数据集,Andr ...