android中的token


       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(










  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值