我的状况

自己一般本科毕业,计算机专业,从事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 利用对内存是如何限度的?咱们应该如何正当应用内存?

  1. 简述 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开发者的幻想 。