首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android 之ActivityThead、ActivityManagerService 与activity的治理和创建

2012-07-01 
Android 之ActivityThead、ActivityManagerService 与activity的管理和创建4707人阅读评论(17)?ActivityThr

Android 之ActivityThead、ActivityManagerService 与activity的管理和创建

4707人阅读评论(17)

?

ActivityThread:

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

?

之后通过该ProcessRecord就可以获得该ActivityThread中的所有ActivityRecord记录。下面会介绍。

?

ActivityManagerService:

在ActivityManagerService中,也有一个用来管理activity的地方:mHistory栈,这个mHistory栈里存放的是服务端的activity记录HistoryActivity(class HistoryRecord extendsIApplicationToken.Stub)。处于栈顶的就是当前running状态的activity。

我们来看一下Activity的startActivity方法的请求过程:

Android 之ActivityThead、ActivityManagerService 与activity的治理和创建

从该时序图中可以看出,Activity.startActivity()方法最终是通过代理类和Binder机制,在ActivityManagerService.startActivity方法中执行的。

那么在ActivityManagerService的startActivity中,主要做了那些事情?我们来看下里面比较重要的代码段:

根据activity、ProcessRecord等信息创建HistoryRecord实例r

再来看下ApplicationThread中的scheduleLaunchActivity方法:

?

new?ActivityRecord();????????????r.token?=?token;????????????r.ident?=?ident;????????????r.intent?=?intent;????????????r.activityInfo?=?info;????????????r.state?=?state;????????????r.pendingResults?=?pendingResults;????????????r.pendingIntents?=?pendingNewIntents;????????????r.startsNotResumed?=?notResumed;????????????r.isForward?=?isForward;????????????queueOrSendMessage(H.LAUNCH_ACTIVITY,?r);????????}??

?

在这个里面主要是根据服务端返回回来的信息创建客户端activity记录ActivityRecord.?并通过Handler发送消息到消息队列,进入消息循环。在ActivityThread.handleMessage()中处理消息。最终在handleLaunchActivity方法中把ActivityRecord记录加入到mActivities(mActivities.put(r.token,r))中,并启动activity(涉及到window、view、windowManager,详情请看handleResumeActivity()方法和上一篇关于window、WindowManager的介绍)

?

总结:

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

热点排行