我的状况
自己一般本科毕业,计算机专业,从事Android开发也有3年了。
2020年因为疫情的起因,整个互联网行业都进入了低谷期,许多公司都进行了裁员,而我所在的公司也不例外。就这样,我来到了工作了3年多的公司。开启了2020年的面试旅程。
当初抉择从事Android开发,前景怎么样呢?
当初想想,挪动互联网的倒退人不知;鬼不觉曾经十多年了,Mobile First 也曾经变成了 AI First。换句话说,咱们曾经不再是“风口上的猪”。挪动开发的光环和溢价开始缓缓隐没,并且正在向 AI、区块链等新的畛域转移。挪动开发的新鲜血液也曾经变少,最显著的是国内应届生都纷纷涌向了 AI 方向。
能够说,国内挪动互联网的红利期曾经过来了,当初是增量降落、存量厮杀,从抢夺用户到抢夺时长。比拟显著的是手机厂商纷纷互联网化,与传统互联网企业间接竞争。另外一方面,过来渠道的打法失灵,小程序、快利用等新兴渠道崛起,无论是手机厂商,还是各大 App 都把出海摆到了策略的地位。
这一年里我也遇到很多艰难,也踩了很多坑,同时我本人也摸索了很多的学习办法,总结了很多心得体会,并且,我对招聘也做了一些钻研和相应的筹备。在往年的秋季招聘完结当前,参考了阿里P7,腾讯T12等大佬的面试总结经验做成专题,以便分享给更多将来将要加入招聘的敌人。
面试专题合集
目录
1.如何对 Android 利用进行性能剖析
2.什么状况下会导致内存泄露
3.如何防止 OOM 异样
4.Android 中如何捕捉未捕捉的异样
5.ANR 是什么?怎么防止和解决 ANR(重要)
6.Android 线程间通信有哪几种形式
7.Devik 过程,linux 过程,线程的区别
8.形容一下 android 的零碎架构
9.android 利用对内存是如何限度的?咱们应该如何正当应用内存?
- 简述 android 应用程序构造是哪些
11.请解释下 Android 程序运行时权限与文件系统权限的区别
12.Framework 工作形式及原理,Activity 是如何生成一个 view 的,机制是什么
13.多线程间通信和多过程之间通信有什么不同,别离怎么实现
14.Android 屏幕适配
15.什么是 AIDL 以及如何应用
16.Handler 机制
17.事件散发机制
18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么
19.子线程中能不能 new handler?为什么
20.Android 中的动画有哪几类,它们的特点和区别是什么
21.如何批改 Activity 进入和退出动画
22.SurfaceView & View 的区别
23.开发中都应用过哪些框架、平台
24.应用过那些自定义View
25.自定义控件:绘制圆环的实现过程
26.自定义控件:摩天轮的实现过程
一、性能优化
1.如何对 Android 利用进行性能剖析
android 性能次要之响应速度 和UI刷新速度。
能够参考博客:Android零碎性能调优工具介绍
首先从函数的耗时来说,有一个工具TraceView 这是androidsdk自带的工作,用于测量函数耗时的。
UI布局的剖析,能够有2块,一块就是Hierarchy Viewer 能够看到View的布局档次,以及每个View刷新加载的工夫。
这样能够很快定位到那块layout & View 耗时最长。
还有就是通过自定义View来缩小view的档次。
2.什么状况下会导致内存泄露
内存泄露是个折腾的问题。
什么时候会产生内存泄露?内存泄露的根本原因:长生命周期的对象持有短生命周期的对象。短周期对象就无奈及时开释。
1. 动态汇合类引起内存泄露
次要是hashmap,Vector等,如果是动态汇合 这些汇合没有及时setnull的话,就会始终持有这些对象。
2.remove 办法无奈删除set集 Objects.hash(firstName, lastName);
通过测试,hashcode批改后,就没有方法remove了。
3.observer 咱们在应用监听器的时候,往往是addxxxlistener,然而当咱们不须要的时候,遗记removexxxlistener,就容易内存leak。
播送没有unregisterrecevier
4.各种数据链接没有敞开,数据库contentprovider,io,sokect等。cursor
5.外部类:
java中的外部类(匿名外部类),会持有宿主类的强援用this。
所以如果是new Thread这种,后盾线程的操作,当线程没有执行完结时,activity不会被回收。
Context的援用,当TextView 等等都会持有上下文的援用。如果有static drawable,就会导致该内存无奈开释。
6.单例
单例 是一个全局的动态对象,当持有某个复制的类A是,A无奈被开释,内存leak。
3.如何防止 OOM 异样
首先OOM是什么?
当程序须要申请一段“大”内存,然而虚拟机没有方法及时的给到,即便做了GC操作当前
这就会抛出 OutOfMemoryException 也就是OOM
Android的OOM怎么样?
为了缩小单个APP对整个零碎的影响,android为每个app设置了一个内存下限。
public void getMemoryLimited(Activity context) { ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); System.out.println(activityManager.getMemoryClass()); System.out.println(activityManager.getLargeMemoryClass()); System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024)); }
HTC M7实测,192M下限。512M 个别状况下,192M就是下限,然而因为某些非凡状况,android容许应用一个更大的RAM。
如何防止OOM
缩小内存对象的占用
1.ArrayMap
/SparseArray
代替hashmap
2.防止在android外面应用Enum
3.缩小bitmap的内存占用
- inSampleSize:缩放比例,在把图片载入内存之前,咱们须要先计算出一个适合的缩放比例,防止不必要的大图载入。
- decode format:解码格局,抉择
ARGB_8888
/RBG_565
/ARGB_4444
/ALPHA_8
,存在很大差别。
4.缩小资源图片的大小,过大的图片能够思考分段加载
内存对象的反复利用
大多数对象的复用,都是利用对象池的技术。
1.listview
/gridview
/recycleview contentview
的复用
2.inBitmap
属性对于内存对象的复用ARGB\_8888/RBG\_565/ARGB\_4444/ALPHA\_8
这个办法在某些条件下十分有用,比方要加载上千张图片的时候。
3.防止在ondraw办法外面 new对象
4.StringBuilder 代替+
[](https://blog.csdn.net/u012165...)4.Android 中如何捕捉未捕捉的异样
CrashHandler
要害是实现Thread.UncaughtExceptionHandler
而后是在application的oncreate外面注册。
5.ANR 是什么?怎么防止和解决 ANR(重要)
ANR->Application Not Responding
也就是在规定的工夫内,没有响应。
三种类型:
1). KeyDispatchTimeout(5 seconds) —次要类型按键或触摸事件在特定工夫内无响应
2). BroadcastTimeout(10 seconds) —BroadcastReceiver在特定工夫内无奈解决实现
3). ServiceTimeout(20 seconds) —小概率类型 Service在特定的工夫内无奈解决实现
为什么会超时:事件没有机会解决 & 事件处理超时
怎么防止ANR
ANR的要害
是解决超时,所以应该防止在UI线程,BroadcastReceiver 还有service主线程中,解决简单的逻辑和计算
而交给work thread操作。
1)防止在activity外面做耗时操作,oncreate & onresume
2)防止在onReceiver外面做过多操作
3)防止在Intent Receiver里启动一个Activity,因为它会创立一个新的画面,并从以后用户正在运行的程序上争夺焦点。
4)尽量应用handler来解决UI thread & workthread的交互。
如何解决ANR
首先定位ANR产生的log:
04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event, 5009.5ms since waitstartedCPUusage from 4361ms to 699ms ago ----CPU在ANR产生前的应用状况04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量
从log能够看出,cpu在做大量的io操作。
所以能够查看io操作的中央。
当然,也有可能cpu占用不高,那就是 主线程被block住了。
6.Android 线程间通信有哪几种形式
1)共享变量(内存)
2)管道
3)handle机制
runOnUiThread(Runnable)
view.post(Runnable)
7.Devik 过程,linux 过程,线程的区别
Dalvik过程。
每一个android app都会独立占用一个dvm虚拟机,运行在linux零碎中。
所以dalvik过程和linux过程是能够了解为一个概念。
8.形容一下 android 的零碎架构
从小到上就是:
linux kernel,lib dalvik vm ,application framework, app
9.android 利用对内存是如何限度的?咱们应该如何正当应用内存?
activitymanager.getMemoryClass() 获取内存限度。
对于正当应用内存,其实就是防止OOM & 内存泄露中曾经阐明。
10. 简述 android 应用程序构造是哪些
1)main code
2)unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一种很早就有的技术了,翻译过去就是纹理映射技术.
google倡议只把启动图片放入。
5)lib
6)color
11.请解释下 Android 程序运行时权限与文件系统权限的区别
文件的零碎权限是由linux零碎规定的,只读,读写等。
运行时权限,是对于某个零碎上的app的拜访权限,容许,回绝,询问。该性能能够避免非法的程序拜访敏感的信息。
12.Framework 工作形式及原理,Activity 是如何生成一个 view 的,机制是什么
Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等形式,供app应用。
简略来说framework就是提供app生存的环境。
1)Activity在attch办法的时候,会创立一个phonewindow(window的子类)
2)onCreate中的setContentView办法,会创立DecorView
3)DecorView 的addview办法,会把layout中的布局加载进来。
13.多线程间通信和多过程之间通信有什么不同,别离怎么实现
线程间的通信能够参考第6点。
过程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast,
Activity 之间,activity & serview之间的通信,无论他们是否在一个过程内。
14.Android 屏幕适配
屏幕适配的形式:xxxdpi, wrap\_content,match\_parent. 获取屏幕大小,做解决。
dp来适配屏幕,sp来确定字体大小
drawable-xxdpi, values-1280*1920等 这些就是资源的适配。
wrap\_content,match\_parent, 这些是view的自适应
weight,这是权重的适配。
15.什么是 AIDL 以及如何应用
Android Interface Definition Language
AIDL是应用bind机制来工作。
参数:
java原生参数
String
parcelable
list & map 元素 须要反对AIDL
16.Handler 机制
参考:android 过程/线程治理(一)——音讯机制的框架 这个系类。
17.事件散发机制
android 事件散发机制
18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么
EventBus,播送,view.post, runinUiThread
然而无论各种花色,实质上就2种:handler机制 + 播送
19.子线程中能不能 new handler?为什么
必须能够。子线程 能够new 一个mainHandler,而后发送音讯到UI Thread。
20.Android 中的动画有哪几类,它们的特点和区别是什么
视图动画,或者说补间动画。只是视觉上的一个成果,理论view属性没有变动,性能好,然而反对形式少。
属性动画,通过变动属性来达到动画的成果,性能略差,反对点击等事件。android 3.0
帧动画,通过drawable一帧帧画进去。
Gif动画,原理同上,canvas画进去。
21.如何批改 Activity 进入和退出动画
overridePendingTransition
22.SurfaceView & View 的区别
view的更新必须在UI thread中进行
surfaceview会独自有一个线程做ui的更新。
surfaceview 反对open GL绘制。
二、我的项目框架的应用
23.开发中都应用过哪些框架、平台
2.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils
3.百度地图
4.volley
5.fastjson
6.picciso
7.友盟
8.zxing
9.Gson
24.应用过那些自定义View
pull2RefreshListView
25.自定义控件:绘制圆环的实现过程
public class CycleView extends View { Paint mPaint = new Paint(); public CycleView(Context context) { this(context, null); } public CycleView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(20); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(100,100,50,mPaint); }}
要害是canvas.drawCycle & paint.setsytle(stoken)
26.自定义控件:摩天轮的实现过程
因为文章篇幅无限,文档资料内容较多,本能够提供链接下载,但无奈容易被谐和,所以全副存档,须要这些文档这里的敌人,能够点击我的【Gitee】,同时也给大家提供一个技术交换探讨平台,心愿可能共同进步,共勉!
总结
其实如果你技术深度足够,大必不必为待业而发愁。每个行业何尝不是这样,最开始的风口,到缓缓的成熟。Android高级在2019年的日子里景色不再, 靠会四大组件就可能获取到称心薪资的时代一去不复返。通过一波一波的淘汰与洗牌,剩下的都是技术的金子。就像大浪褪去,裸泳的会缓缓上岸。而真正保持下来的肯定会获得不错问题。毕竟Android市场是如此之大。从Android高级的蓬勃的待业岗位需要来看,能深信咱们每一位Android开发者的幻想 。