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方法的请求过程:
从该时序图中可以看出,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的介绍)
?
总结: