android中的token

来源:互联网 发布:淘宝网民真实评价 编辑:程序博客网 时间:2024/05/20 14:22


       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(










0 0