当前位置:网站首页 > Java基础 > 正文

android面试java基础



前言

一转眼,2023就过去了,金三银四又要拉开序幕,那么我们的Android程序员关于Android开发岗位的面试,大家知不知道要对哪些知识点做准备呢?

本文给大家整了一套涵盖Android所有技术栈的快速学习方法和笔记。目前已经收到了七八个网友的反馈,说是面试问到了很多这里面的知识点。

android面试java基础

【有需要面试题的朋友,可以点击下方卡片领取!!!】

常见面试题:

一、你了解 Android 系统启动流程吗?

当按电源键触发开机,首先会从ROM中预定义的地方加载引导程序BootLoader 到 RAM中,并执行BootLoader程序启动Linux Kernel,然后启动用户级别的第一个进程: init 进程。init 进程会解析init.rc脚本做一些初始化工作,包括挂载文件系统创建工作目录以及启动系统服务进程等,其中系统服务进程包括 Zygote、service manager、media 等。在 Zygote中会进一步去启动 system_ server进程,然后在 system_server 进程中会启动AMS、WMS、PMS等服务,等这些服务启动之后,AMS中就会打开Launcher应用的home Activity,最终就看到了手机的“桌面”。

二、system_server 为什么要在 Zygote 中启动,而不是由 init 直接启动呢?

Zygote 作为一个孵化器,可以提前加载一些资源,这样 fork()时基于 Copy-On-Write 机制创建的其他进程就能直接使用这些资源,而不用重新加载。 比如 system_server 就可以直接使用 Zygote 中的 JNI 函数、共享库、常用的类、以及主题资源。

三、为什么要专门使用 Zygote 进程去孵化应用进程,而不是让system_server去孵化呢?

首先 system_server 相比 Zygote 多运行了 AMS、 WMS 等服务,这些对一个应用程序来说是不需要的。另外进程的fork()对多线程不友好,仅会将发起调用的线程拷贝到子进程,这可能会导致死锁,而system_server 中肯定是有很多线程的。

四、能具体说说是怎么导致的死锁的吗?

在POSIX 标准中,fork的行为是这样的:复制整个用户空间的数据(通常使用 copy-on-write 的策略,所以可以实现的速度快)以及所有系统对象,然后仅复制当前线程到子进程。这里:所有父进程中别的线程,到了子进程中都是突然蒸发掉的对于锁来说,从 OS 看,每个锁有一个所有者,即最后一次 lock 它的线程。假设这么一个环境,在 fork 之前,有一个子线程 lock 了某个锁,获得了对锁的所有权。fork 以后,在子进程中,所有的额外线程都人间蒸发了。而锁却被正常复制了,在子进程看来,这个锁没有主人,所以没有任何人可以对它解锁。 当子进程想 lock 这个锁时,不再有任何手段可以解开了。

五、Zygote 为什么不采用 Binder 机制进行 IPC 通信?

Binder机制中存在Binder线程池,是多线程的,如果Zygote采用Binder的话就存在上面说的fork()与多线程的问题了。其实严格来说,Binder机制不一定要多线程,所谓的Binder线程只不过是在循环读取Binder驱动的消息而已,只注册一个Binder线程也是可以工作的,比如service manager 就是这样的。实际上Zygote尽管没有采取Binder机制,它也不是单线程的,但它在fork()前主动停止了其他线程,fork()后重新启动了。

六、Binder有什么优势

  • 性能方面

共享内存 0次数据拷贝 Binder 1次数据拷贝 Socket/管道/消息队列 2次数据拷贝

  • 稳定性方面

Binder:基于C/S架构,客户端 (Client) 有什么需求就丢给服务端 (Server) 去完成,架构清晰、职责明确又相互独立,自然稳定性更好 共享内存:虽然无需拷贝,但是控制复杂,难以使用 从稳定性的角度讲,Binder机制是优于内存共享的。

  • 安全性方面

传统的IPC没有任何安全措施,安全依赖上层协议来确保。 传统的IPC方法无法获得对方可靠的进程用户ID/进程UI (UID/PID) ,从而无法鉴别对方身份。 传统的IPC只能由用户在数据包中填入UID/PID,容易被恶意程序利用。 传统的IPC访问接入点是开放的,无法阻止恶意程序通过猜测接收方地址获得连接。 Binder既支持实名Binder,又支持匿名Binder,安全性高。

七、跨进程通信的几种方式

  1. Intent 比如拨打电话
  2. ContentProvider 数据库存储数据 (底层同样也是Binder,专门用于不同应用间共享数据。支持一对多进程数据共享)
  3. Broadcast 广播通信
  4. 4 ALDL 通信,通过接口共享数据 (支持一对多通信,支持RPC)

八、多进程应用使用场景

1 需要向其他应用获取数据 2 某些应用模块需要单独运行在进程中(WebView优化,后台进程) 3 加大一个应用可使用的内存(获取多份内存空间)

九、Binder 机制 (进程间的通信)

Binder 是 Android 为我们提供的 IPC(Inner Process Commnuication进程间通信)的一种方式,Android 中的Activity 、Service、Broadcast、ContentProvider 都是运行在不同的进程中,Binder 是他们之间进行通信的桥梁。

原理:

首先要定义要传输的对象,并进行序列化,反序列化,然后在相同包名下定义 AIDL 接口、要传输的对象,然后定义 好了以后,再 makeProject ,生成对应的类,然后再创建一个 Service 写服务端的代码,然后再客户端使用 bindService 方法进行连接,再 ServiceConnection 的回调方法中拿到服务端的接口对象,之后就可以往服务端发送消息。

最后

由于面试内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2024年Android中高级最全面试真题答案 完整文档的可点击下方卡片免费领取!!!

目录

img

第一章 Java方面

  • Java基础部分
  • Java集合
  • Java多线程
  • Java虚拟机
img

第二章 Android方面

  • Android四大组件相关
  • Android异步任务和消息机制
  • Android UI绘制相关
  • Android性能调优相关
  • Android中的IPC
  • Android系统SDK相关
  • 第三方框架分析
  • 综合技术
  • 数据结构方面
  • 设计模式
  • 计算机网络方面
  • Kotlin方面
img

第三章 音视频开发高频面试题

  • 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
  • 怎么做到直播秒开优化?
  • 直方图在图像处理里面最重要的作用是什么?
  • 数字图像滤波有哪些方法?
  • 图像可以提取的特征有哪些?
  • 衡量图像重建好坏的标准有哪些?怎样计算?
img

第四章 Flutter高频面试题

  • Dart部分
  • Flutter部分
img

第五章 算法高频面试题

  • 如何高效寻找素数
  • 如何运用二分查找算法
  • 如何高效解决雨水问题
  • 如何去除有序数组的重复元素
  • 如何高效进行模幂运算
  • 如何寻找最长回文子串
img

第六章 Andrio Framework方面

  • 系统启动流程面试题解析
  • Binder面试题解析
  • Handler面试题解析
  • AMS面试题解析
img

需要完整面试题的朋友,点击下方卡片即可免费获取!!!

  • 上一篇: java初级基础
  • 下一篇: java基础 合并数组
  • 版权声明


    相关文章:

  • java初级基础2025-04-10 20:10:05
  • java基础深拷和浅拷2025-04-10 20:10:05
  • 无基础考java2025-04-10 20:10:05
  • 没有c基础好学java2025-04-10 20:10:05
  • java基础205讲解2025-04-10 20:10:05
  • java基础 合并数组2025-04-10 20:10:05
  • java基础重载2025-04-10 20:10:05
  • java基础学完怎么样2025-04-10 20:10:05
  • java基础语句解读2025-04-10 20:10:05
  • java基础信息查询2025-04-10 20:10:05