appToken 来源

1、appToken的来源
ActivityRecord, 用于在ActivityManagerService中记录Activity相关的信息(ActivityThread端 用的是ActivityClientRecord),它有个内部静态内Token, 继承IApplicationToken.stub, 看名称可以知道它是一个Binder服务的实现类,而且是用AIDL架构实现的,具体可见frameworks\base\core\java\android\view\IApplicationToken.aidl文件

2、appToken的创建
我们在创建ActivityRecord的时候,会创建它,如下:
appToken = new Token(this), 它持有了ActivityRecord的弱引用。

通常我们在AMS收到启动新的Activity命令的时候,会在ActivityStackSupervisor->startActivityLocked 中初始化一个 ActivityRecord
AMS->startActivity()
AMS->startActivityAsUser()
  ActivityStackSupervisor->startActivityMaywait()
    ActivityStackSupervisor->startActivityLocked(), 这里创建新的ActivityRecord
      ActivityStackSupervisor->startActivityUncheckedLocked
        ActivityStack->resumeTopActivityLocked()
          ActivityStack->resumeTopActivityInnerLocked()
            ActivityStackSupervisor->startSpecificActivityLocked()
              ActivityStackSupervisor->realStartActivityLocked()
                IApplicationThread->scheduleLaunchActivity 通知ActivityThread启动新的Activity。
            
    

3、AppToken的去处
上述 scheduleLaunchActivity 的时候 会将appToke 传递到ActivityThread中。
ApplicationThread->scheduleLaunchActivity 这里会将传递过来的appToken 赋值给新创建的 ActivityClientRecord 的token变量。
  ActivityThread->performLaunchActivity() 这里会new 新的Activity;
    Activity->attach(); 这里会new PhoneWindow; 将token赋值给Activity的mToken变量; 创建PhoneWindow对应的WindowManagerImpl;并且将token赋值给Window的变量mAppToken
    Activity->makeVisiable
      WindowManagerImpl->addView()
        WindowManagerGlobal->addView()
          PhoneWindow->adjustLayoutParamsForSubWindow 这个地方会将mAppToken赋值给WindowManager.LayoutParams 变量中  
            ViewRootImpl->setView
              IWindowSession->addToDisplay()将token 传入到Session 、WindowManagerService中
     
  
这篇文章分析的更加具体:
http://blog.csdn.net/ritterliu/article/details/39318859



 

    原文作者:lipeil
    原文地址: https://www.cnblogs.com/lipeil/p/5996405.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞