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的启动和创建的更多相关文章

  1. Android学习笔记——Activity的启动和创建

    http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...

  2. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  3. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

  4. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  5. Android:日常学习笔记(6)——探究活动(4)

    Android:日常学习笔记(6)——探究活动(4) 活动的启动模式 standard模式 standard是活动默认的启动模式,在不进行显示定义的情况下,所有活动都会自动使用这种启动模式. stan ...

  6. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)——探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

  7. Android:日常学习笔记(5)——探究活动(2)

    Android:日常学习笔记(5)——探究活动(2) 使用Intent在活动之间穿梭 什么是Intent Intent时Android程序中各组件之间进行交互的一种重要方式,他不仅可以指明当前组件想要 ...

  8. Android:日常学习笔记(2)——分析第一个Android应用程序

    Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...

  9. Android Studio 学习笔记(一)环境搭建、文件目录等相关说明

    Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...

随机推荐

  1. (转)C# 快速高效率复制对象的方式

    1.需求 在项目代码中经常需要把对象复制到新的对象中,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } pu ...

  2. CentOS配置VSFTP服务

    1.安装vsftpd a.查看是否安装vsftp [root@wsyjlly ~]# rpm -q vsftpd package vsftpd is not installed b.如果没有则安装vs ...

  3. Java框架之Spring(一)

    在学习Spring之前,需要回忆一下工厂模式.下面会演示一段代码,自己体会.之所以要工厂模式是因为他有一个好处,很像Spring的用法.在实际开发中,new对象对于一个开发人员来说是一件非常需要小心谨 ...

  4. JavaScript 把字符串类型转换成日期类型

    今天在写习题时,遇到些小问题,在这里把答案分享给大家,希望能帮助到大家! 一.把字符串转换成日期类型 var str = "1997-3-12"; var d = new Date ...

  5. input上传文件个数控制

    HTML: <h3>请上传[2,5]个文件</h3> <form action="" enctype="multipart/form-dat ...

  6. 【代码笔记】Web-HTML-表单

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  7. 修改 this 指向

    封装函数 f,使 f 的 this 指向指定的对象 function bindThis(f, oTarget) { if(f.bind){ return f.bind(oTarget); }else{ ...

  8. 【面试】Python面试题库

    https://blog.csdn.net/ChenVast/article/details/81451460 第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Py ...

  9. Jenkins 利用Dashboard View插件管理任务视图

    利用Dashboard View插件管理任务视图   by:授客 QQ:1033553122 步骤 1.  安装Dashboard View插件 说明: 如果无法在线安装,可以选择本地上传方式安装 附 ...

  10. Android--获取高清的app图标

    只有一个方法. public synchronized static Drawable getIconFromPackageName(String packageName, Context conte ...