启动一个Activity的时候,会为Activity创建Token,也就是ActivityRecord中的Token:
startActivityLocked ->
ActivityRecord r = new ActivityRecord(..); //生成ActivityRecord实例
ActivityRecord(
...
appToken = new Token(this, service);
...
}
Token是binder的作用,主要是与ams交互,通知window、事件的消息
WMS中的appToken、appWindowToken(wms管理窗口也是通过窗口栈):
public void addAppToken( ) {
atoken = new AppWindowToken(this, token, voiceInteraction);
Task task = mTaskIdToTask.get(taskId);
if (task == null) {
task = createTaskLocked(taskId, stackId, userId, atoken, taskBounds, config);
}
task.addAppToken(addPos, atoken, taskResizeMode, homeTask);
mTokenMap.put(token.asBinder(), atoken);
}
AppWindowToken(WindowManagerService _service, IApplicationToken _token,
boolean _voiceInteraction) {
super(_service, _token.asBinder(),
WindowManager.LayoutParams.TYPE_APPLICATION, true);
appWindowToken = this; //appWindowToken
appToken = _token; //引用到ActivityRecord中的Token
voiceInteraction = _voiceInteraction;
mInputApplicationHandle = new InputApplicationHandle(this);
mAppAnimator = new AppWindowAnimator(this);
}
appWindowToken包含appToken,可以binder调用,与应用交互信息
App中的Token:
public void setWindowManager(WindowManager wm, IBinder appToken, String appName,
boolean hardwareAccelerated) {
mAppToken = appToken;
}
App中的Token就是ActivtyRecord的token
ActivityClientRecord
这个类是Activity在ActivityThread中一一对应的,一个APP有多个Activity, 也就是说有多个ActivityClientRecord, 那么当AMS要启动一个Activity的时候,怎么样找到APP中正确的那个Activity呢?答案就是通过Token
Activity
Activity中Token主要用于在请求AMS服务时用于定位到具体到AMS中正确的ActivityRecord
比如进入PIP模式,通过Token,AMS就可以知道具体是哪个Activity进入PIP
WMS
WMS中的token是通过WindowManager.LayoutParams传过来的,作用之一是作为
mTokensMap中的key值用来储存对应的WindowToken
作用之二是通知AMS一些消息