前言
本人毕业学校是双非二本,非计算机科班出身,大学时自学的Android相关技能。截止2021年8月,有3年Android开发经验,之前一直在不大不小的城市里生活,现在想着找一个更大的平台寻求发展(技术沉淀、涨薪),所以出来接受社会的毒打了。。。
本文的目的是记录自己的面试经历,各位路过的兄dei也可以参考一下,也让自己有个回顾和反思。路漫漫其修远兮,吾将上下而求索
下面的题目,希望各位大佬不吝赐教~
字节
- 自我介绍
- 能不能用队列实现栈(问的比较详细)
- 内存泄漏
- 线程几种状态,怎么进行切换,线程池
- 死锁产生原因,怎么避免
- http与https区别‘
- 完整http事务流程
- TCP三次握手,为什么不能两次
- 四次挥手,为什么不能三次
- 算法题,从一万个数里面选100个最大的,用什么排序算法,怎么排序。
- 说说自己写代码遇到什么问题
- 有什么要问的。
美团
- 自我介绍
- 四大组件—延伸—广播不取消注册(内存泄漏)和多线程通信方式
- 事件分发—延伸—(场景)按钮点击移动(cancel)和项目使用
- view的绘制流程—延伸—项目使用
- 拷打项目,问难点
- 设计模式(生产者与消费者模式)/算法(重排链表)
- 举一个最有印象,最有成就的项目——深挖 难点:高德api、小组件经营方式高德地图MapView绘制 (不会)
- 换项目询问—友盟集成用途
- 换项目结合博客内容询问,数据抓取并上传数据
- HTTP和HTTPS的区别
- HTTPS为什么是有状态的
- HTTP发送请求到返回数据
- 安卓多线程通信
- 生命周期描述和操作
- MVC和MVVM缺点和优点
- 项目中是否有上传图片,上传图片怎么实现
- 问注解 Muitpart是怎么实现的?
- 发送请求遇到问题,返回状态500
- 上传图片遇到问题呢?
- 请求失败,想知道发送参数?
- 假如没有debug包,正式上线包已经遇到接口问题?(抓包,但没用过)
- Flutter了解
- 除了安卓外,还深入了解过其他技术吗?
- 算法:N分钱分给M个人,每人至少1分钱以上,其他尽可能随机
小红书
- 自我介绍
- 什么时候学的Android
- ActivityA跳转到ActivityB的生命周期流程
- A不执行onStop可能是什么情况
- APP从点击开始的启动流程
- 用过Service吗,答以前用过,现在耗时任务都用协程了,然后后面就有很多Kotlin相关问题
- 讲一下协程
- 知不知道协程是如何调度的,协程的挂起和恢复
- 知道KAPT吗,简单答了一下KSP和KAPT
- 写过JNI,C++吗
- MVVM有什么优缺点
- 用过Rxjava吗
- 你如何理解Dsl(简历上的项目用了Dsl)
- 讲一下Handler原理
- 问项目
- 项目中的难点
- 为什么使用单Activity多Fragnent
- Fragment的生命周期
- 是否了解Fragment的动画
- 项目用了Retrofit,为什么写接口不用实现就可以用
- 算法:实现一个数据结构,添加,删除,随机获取一个的操作都是O1时间复杂度
大华
- 自我介绍
- 你觉得自己安卓什么水平
- 接口和抽象类的区别
- 深拷贝和浅拷贝的区别
- 讲一下委托
- 单例有哪些实现方法
- Object单例如果反编译成Java是怎么样的
- 组件间通信方法有哪些
- 自定义View流程
- 介绍一下项目和亮点
- 保存数据到本地有没有加密
- 了解哪些加密算法
- 项目里使用了单Activity多Fragment,是如何进行通信的,讲一下流程
- 用了Retrofit,知道他的原理吗
最后
由于文章篇幅有限,没法把我这几个月来所面试过的面试题展示出来,不过,放心,我已经将这些公司问的最多的面试题整理成一份《Android大厂面试必考问题+答案解析》PDF文档了,有需要的朋友可以扫描下方二维码领取!!!
《Android大厂面试必考问题+答案解析》
-
SD卡
-
android的数据存储方式
-
BroadcastReceiver
-
sp频繁操作会有什么后果?sp能存多少数据?
-
dvm与jvm的区别
-
ART
-
Activity的生命周期
-
Application能不能启动Activity
-
Activity的状态都有哪些
-
横竖屏切换时Activity的生命周期Activity的状态都有哪些
-
如何设置activity成窗口样式
-
Activity的启动方式
-
Service的生命周期
-
IntentService
-
Fragment和Activity的onCreateOptionsMenu
-
Service的onStartCommand有几种返回值
-
Service的onRebind什么情况下执行
-
Handler防止内存泄露
-
IntentFilter的匹配法则
-
Fragment与Activity传值
-
Fragment 生命周期
-
Fragment的add和replace的区别 //replace==remove|append
-
Fragment如何实现Activity栈的压栈和出栈
-
什么情况下造成内存泄露
-
图片过大导致OOM
-
SoftReference跟WeakRefrence的区别
-
dp与px
-
设置布局为一半宽、高
-
多分辨率支持的清单文件配置
-
Android的事件分发机制
-
ArrayList和LinkedList的区别
-
LruCache
-
什么是ANR,如何规避
-
描述Service的启动方式
-
Android有哪几种布局
-
HashMap、HashTable的区别 //从线程安全性、速度
-
红黑树
-
Handler Looper 工作原理
-
Listview的几种adapter介绍
-
如何在ListView间添加分割线
-
LinkedHashMap 源码解读
-
Drawable转Bitmap
-
Layout_weight
-
android:layout_gravity和android:gravity的区别
-
如何重用布局
-
使用merge减少include布局所造成的布局层次
-
如何优化布局
-
android:layout_gravity的使用规则
-
TextView显示图像
-
SpannableString的使用
-
AutoCompleteTextView的使用
-
在按钮上显示图像的方式有哪些
-
如何动态改变Button的大小和位置
-
如何让一个显示图像的按钮在不同状态下显示不同图像
-
如何实现图像的半透明度
-
HttpURLConnection
-
ProgressBar
-
AbsListView
-
ListView,如何进行数据的增删改查
-
ListView中如何显示数据库中的数据
-
android TypedArray
-
如何动态加载apk文件(未安装)的类
-
Android ContentProvider
-
如何设置Activity为程序启动的默认Activity
-
启动Activity的几种方式
-
Activity传递数据的方式
-
如何将Activity设置成半透明的模态框
-
如何接收广播
-
如何获取短信内容
-
如何拦截手机屏幕休眠和唤醒
-
如何发送广播
-
AIDL与Service
-
如何读取联系人信息
-
请描述Content Provider的uri由哪几部分组成
-
介绍开发ContentProvider的步骤
-
如何为ContentProvider添加访问权限
-
AlertDialog
-
如何自己控制对话框的关闭时机
-
如何改变对话框的透明度
-
如何自己控制Toast的显示和关闭
-
如何使用Notification
-
PendingIntent使用 //跨进程intent
-
点击Notification触发Activity跳转
-
如何自定义Notification的view
-
然后为一个Activity添加选项菜单
-
如何将上下文菜单绑定至可视组件View
-
在单击菜单时,如何能跳转进别的Activity
-
菜单的回调函数有哪些
-
如何使用SharedPreferences存取数据
-
SharedPreferences //构造函数(string name,int mode)
-
Android如何解析xml文件
-
gson
-
如何将table1表的数据和结构复制到table2上
-
SQLite
-
SQLiteOpenHelper.getReadableDatabase和SQLiteOpenHelper.getWritableDatabase将数据库文件放哪了
-
然后将带数据的SQLite同apk一起发布
-
Socket连接成功后,怎么获取服务器的ip和域名
-
BufferedInputStream mark //只有BufferedInputStream实现了mark方法
-
如何打开手机中的蓝牙功能
-
如何获取已绑定的蓝牙设备
-
搜索蓝牙的过程中经过哪些状态
-
隐式Intent
-
如何采用广播监听去电和来电
-
Android支持的电话状态
-
Android如何控制接听和挂断电话
-
请给出访问通话记录的Content Provider URI
-
发送短信 //需要动态请求权限:android.permission.SEND_SMS
-
ContactsContract
-
VideoView 播放视频
-
在工程路径下的res/drawable存放tree.png,如果将图片显示在View上
-
调用Drawable进行绘图
-
如何设置图像透明度
-
如何旋转View
-
Activity 切换
-
Android
-
动画
-
属性动画 Animator
-
定义字符串数组资源
-
图层layer资源
-
Clip图像资源
-
ShapeDrawable
-
如何统一设置多个View的android:textSize和android:textColor
-
属性动画 Animator123布局文件中的”@“、”+”、”?”含义
-
Android获取屏幕高度和宽度的办法
-
AsyncTask
-
Intent可传递的数据类型
-
AlarmManager //闹钟
-
HandlerThread
-
自定义ViewGroup
-
JVM的GC算法
-
OkHttp
-
ButterKnife //源码阅读
-
Dalvik内存模型
-
ART垃圾回收
-
JVM 可达性分析中哪些对象可以作为根节点
-
HashSet
-
SSL中的对称加密和非对称加密
-
Handler的内存泄露问题
-
Android volatile关键字
-
EventBus 源码阅读 //反射Class通常采用通配符 =>Class<?>或者Class<? extends T>
-
String a=“ abc”;String b=“ abc”; 创建了几个对象 //栈存放引用变量 堆存在new出来的对象,并且堆划分出一部分作为常量池
-
java的单例创建
-
Android进程优先级
-
ThreadLocal 源码
-
自定义View对象
-
Android @Override //重写
-
Android Semaphore机制
-
Android Lock同步
-
ThreadPoolExecutor 线程池
-
Android下载图片通过bitmap设置ImageView
-
ImageView
-
onSaveInstanceState //保存app数据,当系统因内存不足时而销毁app,会得到调用
-
ViewPager&PagerAdapter&TabFragmentPagerAdapter
-
Fragment在横竖屏切换时的数据保存
-
DialogFragment //采用子类继承的方式进行使用,相比AlertDialog由FragmentManager负责自动重建
-
SQLiteDatabase
-
IntentFilter的匹配规则
-
Android多进程
-
Android Scroller
-
Sqlite 连接操作
-
Spinner
-
RelativeLayout 源代码
-
Message //static Message sPool,指向队列前头的可用Message对象
-
ArrayDeque 源代码阅读
-
RecyclerView
-
LinearLayoutManager //RecyclerView的布局管理器
-
GridLayoutManager
-
RecyclerView 使用
-
Binder
-
ActivityThread //Android应用的主线程
-
CountDownLatch 线程同步
-
retrofit
-
ClassLoader 类加载器
-
RxJava