作家
登录

用两张图告诉你,为什么你的App会卡顿?

作者: 来源: 2017-06-01 08:56:06 阅读 我要评论

Activity.java

  1. final void attach(Context context, ActivityThread aThread, 
  2.     Instrumentation instr, IBinder token, int ident, 
  3.     Application application, Intent intent, ActivityInfo info, 
  4.     CharSequence title, Activity parent, String id, 
  5.     NonConfigurationInstances lastNonConfigurationInstances, 
  6.     Configuration config, String referrer, IVoiceInteractor voiceInteractor, 
  7.     Window window){ 
  8.         ... 
  9.         mWindow = new PhoneWindow(this, window); 
  10.         //创建Window 
  11.         ... 
  12.         mWindow.setWindowManager( 
  13.          (WindowManager)context.getSystemService(Context.WINDOW_SERVICE), 
  14.          mToken, mComponent.flattenToString(), 
  15.          (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0); 
  16.         //留意!这里就是在创建WindowManager。 
  17.         //这个办法在前面已经说过了。 
  18.         if (mParent != null) { 
  19.            mWindow.setContainer(mParent.getWindow()); 
  20.         } 
  21.         mWindowManager = mWindow.getWindowManager(); 
  22.             }  

持续看图。WindowManagerImpl持有了PhoneWindow的引用,是以它可以对PhoneWindow进行治理。同时它还持有一个异常重要的引用mGlobal。这个mGlobal指向一个WindowManagerGlobal类型的单例对象,这个单例每个应用法度榜样只有独一的一个。在图中,我说清楚明了WindowManagerGlobal保护了本应用法度榜样内所有Window的DecorView,以及与每一个DecorView对应接洽关系的ViewRootImpl。这也就是为什愦我前面提到过,WindowManager只是一个代劳,实际的治理功能是经由过程WindowManagerGlobal实现的。我们来看个源码的例子就比较清楚了。开妒攀啦!

WimdowManagerImpl.java

  1. public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) { 
  2.     ... 
  3.     mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow); 
  4.     //实际是经由过程WindowManagerGlobal实现的。 
  5.  

大年夜膳绫擎的代码可以看出,WindowManagerImpl确切只是WindowManagerGlobal的一个代劳罢了。同时,膳绫擎这个办法在全部Android的视图框架流程中十分的重要。我们知道,在Activity履行onResume()后界面就要开端衬着了。原因是在onResume()时,会调用WindowManager的addView()办法(实际最后调用的是WindowManagerGlobal的addView()办法),把视图添加到窗口上。结合我的┞封篇【可能是史上最简单的!一张图3分钟让你明白Activity启动流程,不看懊悔!http://www.jianshu.com/p/9ecea420eb52】看,可以赞助你更好的懂得Android的视图框架。

ActivityThread.java

  1. final void handleResumeActivity(IBinder token, 

      推荐阅读

      换个角度看看,为什么钓鱼攻击总能成功?

    当我第一次收到银行发来的“安然”邮件时,我第一反竽暌功就是这里是否有诈?因为在我看来,它实袈溱是太像垂纶邮件了。这封躺在收件箱里的邮件来源竽暌冠我银行经理的小我邮箱地>>>详细阅读


    本文标题:用两张图告诉你,为什么你的App会卡顿?

    地址:http://www.17bianji.com/lsqh/35508.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)