Android 面试复习文章记录

255 阅读3分钟

兄弟们时刻保持离职后能找到工作的能力。 爱生活,爱自己,热爱自由,时刻准备面试。

pie title 干货含量
"干货" : 100

Gilde生命周期原理7.19

  • RquestManager->
  • RequestFragmentManager->
  • fragmentGet ()->
  • fragmentManager->
  • fragment.getChildManager

setRetainInstance属性 Fragment保存不会重建如何保存状态里面

  • onSaveInstanceState保存Allstate ->
  • mActive这个ArrayList集合,里面存放的是添加到FragmentManager中的Fragment找到f.mRetainInstance为true
  • oncareate NonConfigurationInstances
  • restoreAllState if (nonConfig != null) { Fragment f = nonConfig.get(i);}

ViewModel怎么实现自动处理生命周期?为什么在旋转屏幕后不会丢失状态? 为什么ViewModel可以跟随Activity/Fragment的生命周期而又不会造成内存泄漏呢?

  • 实现lifecycleOwner接口,onRetainNonConfigurationinstall
  • 保存ViewModeStore 是一个HashMap 重建找到getLastNonConfigurationInstance()
  • holdeFragment

事件分发机制流程?

  • SystemServer
  • inputManag
  • inputManagerService
  • pip
  • inputevent motaonEvent
  • Activity hadleResumeActivity windowManager addView DecorView viewRootIml inputChannl inputManagerReceive 责任链 ViewPoststate
  • 分发到View事件流程

事件分发机制中inputManager与anr如何产生?

  • inputReader inputdispath eventHub epoll机制阻塞 io通知来启动
  • inboundqueue outboundqueue waitQuen
  • startService 埋雷模式 ams启动startservice startRealService 通过handler post startSerice app回调取消掉handler
  • activity与inputmanagerservie通过socket来建立通信

系统启动流程 7/20总结

  • systemapp 日历 相机
  • java api activity location package window
  • c++ webkit opengles media art davukj jit
  • hal 硬件接口层 audio blueooth
  • linux层 binder audio bluetooth
  • system/core/init/init.cpp 孵化用户守护进程 开机动画 zygote进程 meidia server 系统服务进程
  • zygote 创建系统服务端 加载虚拟机 fork systemServer 应用进程launcher 启动app

SystemServer进程

  • zygote fork出system server进程使用sockete 内存拷贝 socket 单线程线程死锁 关闭socket 创建binder线程池
  • system server 启动了 loop 上下文 服务类 加载动态库
  • 引导服务 ams pms light
  • 核心服务 用户使用时间长短 webview更新服务 管理电池
  • 其他服务 电话管理 wms 输入inputManager
  • ams 四大组件启动调度切换
  • pms apk安装解析
  • wms 窗口启动添加删除

Activity启动流程ActivityManagerService 创建了那些类

  • Ams通过内部类lifecycle创建 在onstatr中启动,初始化上下文 MainLooper 电池服务 注册到servieManager中
  • activity启动到instrumentation.execstartActivity中 通过binder找到 ServiceManager中注册的Ams
  • ActivityStarter中的方法 activityRecord信息 ->startActivityUnchecked 中 taskRecord 比较启动模式FLAG_ACTIVITY_NEW_TASK
  • 是否创建一个新的栈 最后走到 startProcessLocked zygote通信 fork进程创建

序列化原理 如何使用那些

  • Serializable 大量创建变量 反射 序列化二进制写入文件 但是有缓存速度会快 serialVersionUID 判断是否一直
  • Parcelable 层也是用到了Binder ,也就是将数据写到内核的共享内存中,然后其他进程可以从共享内存中进行读取。
  • 内存数据传输 Parcelable
  • 数据持久化 Serializable 缓存HandleTable

recyclerView 缓存 2022/7/26

  • scrapview 预布局deatch 完成后重新加入 ,当前缓存状态不是移除状态且与上次下标相同则复用
  • cache 屏幕划出 大小为2 setCacheSize
  • viewCacheExtension 自定义缓存
  • RecyclerViewPool 默认数量为2,缓存大小重新创建重新绑定数据 onBindViewHolder

屏幕如何刷新 2022/7/27

  • 帧 所有画面都是一帧一帧行成
  • 帧率 fps 每秒多少帧
  • 掉帧 开启垂直同步 双缓存机制 vsync framebuffer backbuffer TripleBuffer

屏幕刷新机制如何刷新编舞者?

  • view刷新 invitaive doTraversal 设置标志位 发送同步屏障 执行peformTraversal 移除同步屏障
  • 底层发送vsync刷新信号16.6ms,回调FrameDisPlayEventReceiver onVSync方法 发送到主线程 中间通过handler 绘制帧 申请sync信号 延迟信号

待学习

  1. HandlerThread
  2. IntentService
  3. 线程池
  4. activity启动流程
  5. binder的进程通信
  6. java集合数组