面试的面试官比较年轻,问的东西感觉都挺广的,而且不怎么爱问八股,所以面完感觉心里面也没谱,不确定是否有把握。所以面对一些不太会的问题,回答的时候就比较放飞自我了。
面试内容:
- 询问了在上家实习过程中与硬件相关的事情
- 刚刚提到JNI,那你理解JNI在Android开发里面的作用是什么?
- 访问低级系统资源:有些系统级的功能,Java API可能无法提供,或者提供的接口不够灵活。通过JNI,可以直接使用C/C++代码来访问这些资源,如直接操作硬件、调用系统底层API等。
- 丰富功能:对于一些计算密集型的操作,如图像处理、视频编解码、物理模拟等,使用C/C++编写的本地代码通常比Java代码更快,通过JNI可以方便调用。
- JNI方法的注册主要有哪些?
- 静态注册:根据函数名来建立 java 方法与 JNI 函数的一一对应关系,Java+包名+类名+方法名(native方法)
- 用javah 和javac命令生成包含native方法的.h头文件。
- 查找起来效率比较低
- Java方面改了方法名,C/C++也需要改
- 动态注册:JNI 允许我们提供一个函数映射表,注册给 JVM,这样 JVM 就可以用函数映射表来调用相应的函数, 而不必通过函数名来查找相关函数,流程更加清晰可控,效率更高.。
- 会用到JNI_OnLoad函数,后面会走到RegisterNatives(clazz, gMethods, numMethods),其中 JNINativeMethod 表示的是native方法与Java方法的映射关系。
- 静态链接库和动态链接库的区别
- 静态链接库:静态链接是在编译时将库中的代码直接嵌入到目标程序中,形成一个独立的可执行文件
- 动态链接库:动态链接是在编译时不将库的代码嵌入到目标程序中,而是在运行时从动态链接库中加载这些代码
- 使用livedata的缺点:
- LiveData只能在主线程转换更新数据
- postValue也是需要切换到到主线程的,当我们想要更新LiveData对象时,我们会经常更改线程(工作线程→主线程),如果在修改LiveData后又要切换回到工作线程那就更麻烦了,同时postValue可能会有丢数据的问题,在一段时间内发送数据的速度 > 接受数据的速度,LiveData 无法正确的处理这些请求。
- 只在 Observer 至少处于 STARTED 状态时才能收到事件通知。
- Activity 只有在 onStart 后和 onStop 前才能收到事件通知
- LiveData没有内建的区分数据是否已被处理的机制,如果需要实现这样的逻辑,则需要额外的封装
- livedata发的数据是黏性的吗?
- 是粘性的,假设存在一个静态的 LiveData 变量,且已经包含了数据,对其进行监听的 Activity 都会收到其当前值的回调通知,即收到了黏性消息。
- 当一个Activity或Fragment因为配置改变(如屏幕旋转)或其他原因被销毁并重新创建时,新的Activity或Fragment实例会立即接收到最新的数据,从而可以正确地恢复UI状态。
- activity绑定一个livedata,activity在后台,还能收到没?
- LiveData遵循Android的生命周期,只有当Activity(或其他LifecycleOwner,如Fragment)处于活跃状态(即在
onStart()
和onResume()
之间)时,LiveData才会向其发送更新 - LivaData实现后台也能收到消息?
- 使用
LiveData.observeForever()
方法,而不是LiveData.observe()
方法。observeForever()
方法会创建一个不受生命周期限制的观察者 - LiveData实现观察生命周期的原理是什么?
- 内部会创建生命周期感知的观察者包装类LifecycleBoundObserver(把注册进来的observer包装成 一个具有生命周边边界的观察者)
- 利用Lifecycle,把观察者注册到LifecycleBoundObserver进去,就能监听到宿主生命周期状态的变化
- 它能监听宿主被销毁的事件,从而主动的把自己反注册,避免内存泄漏
- 此时观察者是否处于活跃状态就等于宿主是否可见, 监听宿主的生命周期,并且宿主不可见时不分发任何数据
- 说到阿里的Arouter框架,它解决的场景有哪些?
- 解决集中的URL管理:
- 多人协同开发的时候,大家都去AndroidManifest.xml文件中,定义各种<Intent-filter>,然后使用隐式Intent实现跳转。最终发现AndroidManifest.xml中充斥着各种Schame、各种Path,需要经常解决Path冲突的问题
- 自定义拦截器,自定义拦截顺序,可以对路由进行拦截,比如登陆判断,和埋点处理
- 支持直接解析标准Url进行跳转,并自动注入参数到目标页面中
- 工程上,不同的modle怎么加载一个成app
- 在主应用模块的build.gradle文件中声明对这两个库模块的依赖
- OKhttp空闲链接怎么清除掉的
- OkHttp的连接池会保持连接最多5分钟的空闲时间,如果连接在这段时间内没有被复用,那么这个连接就会被关闭并从连接池中移除。这个空闲时间是可以配置的
反问:询问业务和技术方向
#24届软开秋招面试经验大赏#
#Android面经##哈啰##客户端面经#