文档章节

Android framework——Activity的启动和创建

jackxu2015
 jackxu2015
发布于 2015/08/14 22:55
字数 839
阅读 169
收藏 0


 本人制作的app:1号密码 欢迎试用

  最近学习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相关实例引用;

    

 

 

本人开发的app:欢迎各位兄弟试用:

http://android.myapp.com/myapp/detail.htm?apkName=com.xcy.xpassword

 

 

 

 

© 著作权归作者所有

jackxu2015
粉丝 3
博文 58
码字总数 41324
作品 0
深圳
高级程序员
私信 提问
Task和Activity相关

Task和Activity相关 这段时间在做一个项目,发现对Task和Activity掌握的还是不牢固。把相关知识整理在这里,方便查阅,有几个Flag没看明白啥意思,也没测试出来效果如何。。。 android:allo...

~小白
2012/03/31
0
0
android task and activity

a usful blog. http://changeyouforever.iteye.com/blog/1160038 android:allowTaskReparenting 用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“......

eric_zhang
2012/03/07
0
0
Activity 四种启动模式

standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D...

hanzhankang
2014/02/11
0
0
Android 开发中 Activity 的正确打开方式

adb shell dumpsys activity 输入这个命令可以得到一个清晰的 Task 视图,比如你有多少个 Task ,哪些 activity 在其对应的 Task 等相关信息。 下图是一张运行这个命令的输出截图。 从图中可...

花仲马
2016/08/24
3.6K
6
有奖高手问答:OSChina 第 24 期高手问答 —— Android 框架

OSCHINA 本期高手问答我们再次请来了《深入理解Android》卷I、卷II的作者 —— @邓凡平 为大家解答关于Android Framework方面的问题。 @邓凡平 资深Android开发工程师和系统工程师,热衷于A...

红薯
2012/08/13
5.9K
78

没有更多内容

加载失败,请刷新页面

加载更多

spdlog静态库方式

spdlog新版本提供了静态库方式,这样比原来的header only方式显著提升了编译速度。 这里分析一下怎么使用: 根目录下的CMakeLists.txt中主要有如下内容: ...include(cmake/ide.cmake) // ...

chuqq
34分钟前
2
0
转载《Java 开发手册》今日发布,向全球开发者致敬!

致全球Java开发者: 代码是二进制世界的交流方式,极致的代码是我们的荣耀。 2017年春天,《阿里巴巴Java开发手册》发布,我们希望在涵盖编程规约、异常日志、单元测试、安全规约、MySQL数据...

薛定谔的旺
38分钟前
42
0
Windows常用快捷键

1、Ctrl+Shift+T 恢复误关网页 2、Ctrl+Y 反撤销(Ctrl+Z撤销)

南风末
39分钟前
0
0
获取一个字符串相同的字符出现的次数及字符分别是

// 统计一个String字符串中出现的相同字符的次数 及分别是什么 public static void charStat(String str){ long start = System.currentTimeMillis(); Map<Character,In......

凉城旧影
46分钟前
3
0
Nodejs 10以上版本不支持Deepin 问题

I solved this problem by this way : Copy script from https://deb.nodesource.com/setup_12.x. Find line DISTRO=$(lsb_release -c -s) and change to DISTRO="jessie". Save all script ......

SuShine
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部