token顾命思意,象征符号,到底是什么的象征呢?我们在看andorid源码的时候,经常会碰到程序与系统service之间的通信,我们也知道进程间通信会用binder机制!
而这个token就是一个IBinder类型代表远程service的stub对象!
以下分析以6.0代码为准!
1: activity中的mToken
activity启动流程中mToken一路传递:具体参考老罗的Android应用程序启动过程源代码分析
Actvity.startActivity() -> Instrument.execStartActivity()->ActvityManagerService.startActivity() ->ActivityStackSupervisor.startAcivtyMayWait() ->ActivityStackSupervisor.startAcivtyLocked()
代码中会查找mToken所包含的ActivityRecord中的taskrecord是否在taskrecord中
这里mToken是一个IApplication.stub实例,可以看下下面这块代码:
ActivityRecord isInStackLocked(IBinder token) {
final ActivityRecord r = ActivityRecord.forTokenLocked(token);
return isInStackLocked(r);
}
可以看下forTokenLocked()源码
static ActivityRecord forTokenLocked(IBinder token) {
try {
return Token.tokenToActivityRecordLocked((Token)token);
} catch (ClassCastException e) {
Slog.w(TAG, "Bad activity token: " + token, e);
return null;
}
}
Token是ActivityRecord的内部成员类
static class Token extends IApplicationToken.Stub
Token.tokenToActivityRecordLocked()里面获取activyRecord对象
2:view中的mWindowToken
首先看下mWindowToken的获取
public IBinder getWindowToken() {
return mAttachInfo != null ? mAttachInfo.mWindowToken : null;
}
view中的mWindowToken是mAttachInfo的一个成员,先来看下AttachInfo的构造函数
AttachInfo(IWindowSession session, IWindow window, Display display,
ViewRootImpl viewRootImpl, Handler handler, Callbacks effectPlayer) {
mSession = session;
mWindow = window;
mWindowToken = window.asBinder();
mDisplay = display;
mViewRootImpl = viewRootImpl;
mHandler = handler;
mRootCallbacks = effectPlayer;
}
mAttachInfo的初始化实在viewRootImpl中!
public ViewRootImpl(Context context, Display display) {
mContext = context;
mWindowSession = WindowManagerGlobal.getWindowSession();
mDisplay = display;
mBasePackageName = context.getBasePackageName();
.
.
.
mWindow = new W(this);
.
.
.
mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this);
这里W 也是一个stub类,定义在viewRootImpl中
static class W extends IWindow.Stub(