Android

查找靠谱查看android源码的工具???

1.Android生命周期

https://developer.android.google.cn/reference/android/app/Activity.html#ActivityLifecycle

2.onStart和onResume区别?

   onStart() activity可见,但不可点击,没有获得焦点。

   onResume() activity 获得焦点,可以跟用户交互, activity在前台。

  onRestart() ??????调用时机

  onNewIntent() ????

 

3.Activity启动流程???

   a.startActivity 最终都会调用startActivityForResult, 通过ActivityManagerProxy调用system_server 进程中ActivityManagerService 的startActivity方法。

   b.如果需要启动的Activity所在进程未启动,则调用zygote孵化应用进程。

   c.进程创建后会调用应用的ActivityThread的main方法,main方法调用attach方法将应用进程绑定到ActivityManagerService(保存应用的ApplicationThread的代理对象)并开启loop循环接受消息

   d.AMS通过ApplicationThread的代理发送Message通知启动Activity,ActivityThread内部Handler处理handleLaunchActivity,依次调用performLaunchActivity, handleResumeActivity(即activity的onCreate,onStart,onResume)

深入理解Activity启动流程

 

4.Android 类加载器

   Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统class文件是一个Java源码文件生成一个.class文件;而android是把所有class文件进行合并、优化,然后生成一个最终的class.dex, 目的是把不同class文件重复的东西只需保留一份,如果我们的Android应用不进行分dex处理,最后一个应用的apk只会有一个dex文件。

Android中常用的两种类加载器,DexClassLoader和PathClassLoader,它们都继承于BaseDexClassLoader。

区别在于调用父类构造器时,DexClassLoader多传了一个optimizedDirectory参数,这个目录必须是内部存储路径,用来缓存系统创建的Dex文件。而PathClassLoader该参数为null,只能加载内部存储目录的Dex文件。所以可以用DexClassLoader去加载外部的apk???---》参考CF

dalvik和art区别??

multi-dex 功能是啥??细节不懂。

一个dex文件,最多放多少class/方法??---包含自己+系统

 

5.Android 消息机制???

1)应用启动从ActivityThread的main开始,先Looper.prepare(),该方法中先new Looper(), 在私有的构造方法中又 new MessageQueue作为Looper的成员变量,Looper对象通过ThreadLocal绑定MainThread中。

2)当我们创建Handler对象时,在构造方法中通过ThreadLocal获取绑定的Looper对象,并获取此Looper对象的成员变量MessageQueue作为Handler对象的成员变量;

3)在子线程中调用step2创建的Handler对象的sendMessage(msg)方法时,在该方法中将msg的target属性设置为自己,同时调用成员变量MessageQueue对象的enqueueMessage()方法将msg放入到MessageQueue中;???

4)主线程创建好之后,会执行Looper.loop()方法,该方法中获取与线程绑定的Looper对象,通过Looper成员变量MessageQueue 开启一个会阻塞(不占用资源)的死循环;只要MessageQueue中有msg,就会获取该msg,并执行msg.targt.dispatchMessage(其中target为step3中的handler对象),此方法调用step2创建的Handler对象的handlerMessage(),之后该msg对象存入回收池。

ThreadLocal是啥?

 

6.Looper.loop()为什么不会阻塞主线程

   Android是基于事件驱动的,即所有Activity的生命周期都是通过Handler事件驱动。loop方法中调用MessageQueue的next() 获取下一个message;当没消息时,基于Linux pipe/epoll机制会阻塞在loop的queue.next()中的nativePollOnce()方法里,并不会消耗CPU。

pipe/epoll 是什么机制???

nio???

 

7.IdleHandler(闲时机制)

 IdleHandler是一个回调接口,通过MessageQueue的addIdleHandler添加实现类。

 当MessageQueue中的message处理完了(无新任务 or 下一个任务延时中),则调用IdleHandler接口,如果返回false,则移除它;返回true,下次message处理完了依旧回调它。

 

8.同步屏障机制(sync barrier)

    同步屏障可以通过MessageQueue.postSyncBarrier函数来设置。该方法发送一个无target的message到Queue中;在next()中如果message无target,则在一定的时间内跳过同步消息,优先处理异步消息。即,sync barrier会Handler消息机制增加一种简单的优先级机制,异步消息优先于同步消息。

   创建Handler时async设置为true,则此handler发送异步消息。ViewRootImpl.scheduleTraversals()使用了同步屏障,保障UI绘制优先执行。

 

9.  View的绘制原理

    1)View的绘制从ActivityThread类中Handler处理RESUME_ACTIVITY事件开始,在执行performResumeActivity之后,创建Window以及DecorView并调用WindowManger的addView()添加到屏幕上,addView()又调用ViewRootImpl的setView(), 最终执行performTraversals(),依次执行performMeasure,performLayout,performDraw。也就是view绘制的三大过程。

   2)measure 过程测量view的视图大小,最终需要调用setMeasuredDimension()设置测量的结果。如果为ViewGroup需要调用measureChildren()或者measureChild()进而自己的大小。

   3) layout是摆放view的过程,view不需要实现,通常由viewGroup实现,在实现onLayout()过程中,可通过getMeasuredWidth等方法获取到measure过程获取的测量结果,进而摆放。

   4)draw过程,先绘制背景,其次调用onDraw()绘制view的内容,再调用dispatchDraw()以调用view的draw方法,最后绘制滚动条。ViewGroup默认不执行onDraw(), 如果复写了onDraw(Canvas)方法,需要调用setWillNotDraw(false)清除不需要绘制的标记。

   ps: view的ondraw方法被执行到的2个方法:1.在构造方法中给viewGroup设置颜色;2.构造方法中setWillNotDraw(false).

Android视图绘制流程完全解析,带你一步步深入了解View(二)   ????

 

9.什么是MeasureSpec

    MeasureSpec是32位的int,高2位代表SpecMode(测量模式),低30位代表SpecSize(具体大小)。SpecMode 有3类如下:

       1)UNSPECIFIED,表示父容器不对View有任何限制,一般用于系统内部,表示一种测量状态;比如:ListView,ScrollView

       2)EXACTLY , 父容器已经监测出view所需的精确大小,这时候view的最终大小SpecSize所制定的值,相当于match_parent or 100dp 具体的size;

       3)AT_MOST, 父容器指定一个可用大小即SpecSize,view的大小不能大于这个值,具体大多要看view的具体实现,相当于wrap_content;

    UNSPECIFIED ???不是特别懂

    MeasureSpec 具体应用不懂???

 

10. getWidth()方法和getMeasuredWidth()区别

 getMeasuredWidthgetWidth
获取时机不同measure()过程结束后就可以获得在layout()过程结束后才能获取到
实现原理不同getMeasuredWidth()的值通过setMeasuredDimension() 方法来进行设置getWidth() =视图右边的坐标 - 左边的坐标

 

20.事件分发的机制

图解 Android 事件分发机制 

 

21. requestLayout, invalidate, postInvalidate区别与联系

 invalidatepostInvalidaterequestLayout
相同点3个方法都有刷新界面的效果
不同点

1.都只调用onDraw()

2. invalidate()和postInvalidate()区别,invalidate()只能在UI线程中调用。postInvalidate()可在其他线程调用。

3.调用invalidate()时, 为该view添加一个标记位,同时不断传给父容器请求刷新,父容器通过计算得出自身需要重绘的区域,直到传递给ViewRootImpl中,最终触发performTraversals(), 开始view树重绘流程(只绘制需要绘制的视图)

1.重新调用onMeasure, onLayout, onDraw;

2.调用时, 会标记当前view及父容器,同时逐层向上提交,直到ViewRootImpl处理该事件,ViewRootImpl会调用三大流程,对于每个含有标记位的view及其子view都进行测量onMeasure, 布局onLayout, 绘制onDraw();

    Android View 深度分析requestLayout、invalidate与postInvalidate   ???

 

 

 

       

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值