【学习摘抄】1---ActivityThread

http://www.embeddedlinux.org.cn/Androidkernel/

http://blog.csdn.net/xieqibao/article/details/6570080

在阅读SDK文档和研究Activity这个概念时,我感觉到了Android中若隐若现的Android自由无边界这个设计意图Android的应用只是一个虚的概念,并没有实际的入口,这个不像Window平台上的应用程序的概念,Android更多的是提供组件(Components)的概念。为什么要虚化应用的概念?我想这个虚化就是自由无边界设计意图的直接体现。突出请求和服务,突出组件个体,弱化边界,系统的各个组件可以自由的无边界的交流,服务请求者直接发出请求,不论这个对象在何处和属于谁的,组件是自由独立的个体,一个应用程序可以直接请求使用其他的应用的的组件,这个是Android应用框架设计的核心理念,其他的一切都是在为这个核心理念服务。


让程序员忽略应用的概念,甚至彻底的抛弃进程这样的概念,程序员看到的就是一个一个的组件,应用程序员利用这些组件来架构成一个所谓的应用,那么设计者首先要考虑的是什么呢?我想应该是一个抽象的应用模型,在这个模型下产生概念和接口。


Android则是彻底的组件化思想构建,一开始的应用程序概念就是ActivityService,Broadcast receiversContentProvider,IntentTask。这些概念体现了一个人机交互的模型本质:

界面呈现

发起请求,响应请求

内容交互

消息接收处理

 

ActivityAndroid应用的核心概念,简而言之Activity为用户交互管理者,有一个可视界面呈现,而ServiceActivity的区别是他在后台运行,没有界面呈现。而Intent的意义是意图,他在Android的概念空间中,代表消息,这个消息代表了请求的意图。

Activity可以到处存在,提供服务,消除空间差别,Activity是一个独立的个体,更能表现面向对象的实质。这个个体需要接受另外的个体的消息,可以随时发起对另外一个个体的请求。个体是自由的,Android中你可以开始一个Activity,但是没有权利消灭一个Activity,这是个体权利的体现,个体的消灭是由系统决定的,这个就是AndroidActivity蕴含的人文意义。


ActivityThread:

ActivityThread主要用来启动应用程序的主线程,并且管理在应用端跟用户打交道的activity。在应用端的activity信息全部被存储在ActivityThread的成员变量mActivities中。

final HashMap<IBinder, ActivityRecord> mActivities= new  HashMap<IBinder, ActivityRecord>(); 


也就是说,在mActivities中,记录了应用程序创建的所有activity实例记录,对应的是ActivityRecord

ActivityThread是怎么启动应用程序的呢?ActivityThread中有一个main函数,在这个里面,将启动应用程序并建立消息循环。在之前也介绍过,系统会为主线程自动创建消息循环。


每个应用程序对应着一个ActivityThread实例,应用程序由ActivityThread.main打开消息循环。每个应用程序同时也对应着一个ApplicationThread对象。该对象是activityThreadActivityManagerService之间的桥梁。

attach中还做了一件事情,就是通过代理调用attachApplication,并利用bindertransact机制,在ActivityManagerService中建立了ProcessRecord信息。


ActivityManagerService和ActivityStack位于同一个进程中,而ApplicationThread和ActivityThread位于另一个进程中,这个就要看代码,后面有两篇文章可以参考:《Android应用程序进程启动过程的源代码分析》和《Android系统进程Zygote启动过程的源代码分析》。
Zygote进程启动System进程->System进程创建一个线程来启动ActivityManagerService->ActivityManagerService内部又会创建一个ActivityStack来维护系统的Activity组件堆栈。
ActivityManagerService请求Zygote进程创建一个应用程序进程->应用程序进程加载一个ActivityThread实例->ActivityThread实例在内部创建一个ApplicationThread实例,用来和ActivityManagerService通信。




客户端保存的Activities是ActivityRecord的形式,是放在ActivityThread的mAcitivities中的,一个应用一个ActivityThead.
ActivityStack::realStartActivityLocked()
->app.thread.scheduleLaunchActivity() --- ProcessRecord.IApplicationThread::scheduleL...
->ApplicationThread::scheduleLaunchActivity()
->ActivityThread::handleMessage() case LAUNCH_ACTIVITY
->ActivityThread::handleLaunchActivity(r, null)
->ActivityThread:: performLaunchActivity() --- mActivities.put(r.token, r);
服务端
AMS::startHomeActivityLocked()
->ActivityStack::startActivityLocked() --- mHistory.add(addPos, r);


  1. 在客户端和服务端分别有一个管理activity的地方,服务端是在mHistory中,处于mHistory栈顶的就是当前处于running状态的activity,客户端是在mActivities中。
  2. startActivity时,首先会在ActivityManagerService中建立HistoryRecord,并加入到mHistory中,然后通过scheduleLaunchActivity在客户端创建ActivityRecord记录并加入到mActivities中。最终在ActivityThread发起请求,进入消息循环,完成activity的启动和窗口的管理等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值