Android面试:整理了Android面试官最常问的26道面试题 ,教你吊打面试官

118 篇文章 6 订阅
86 篇文章 0 订阅

前言

面试时总被面试官挖的Android基础题掉坑里?整理了26道面试题 ,牢固你的基础!(附《Android开发面试题以及答案整理》!)

  • 1.如何对 Android 应用进行性能分析

  • 2.什么情况下会导致内存泄露

  • 3.如何避免 OOM 异常

  • 4.Android 中如何捕获未捕获的异常

  • 5.ANR 是什么?怎样避免和解决 ANR(重要)

  • 6.Android 线程间通信有哪几种方式

  • 7.Devik 进程,linux 进程,线程的区别

  • 8.描述一下 android 的系统架构

  • 9.android 应用对内存是如何限制的?我们应该如何合理使用内存?

  • 10. 简述 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.自定义控件:摩天轮的实现过程

  • 27.GridLayout的使用

  • 28.流式布局的实现过程

  • 29.第三方登陆

  • 30.第三方支付

  • 31.进程保活

由于文章篇幅限制,不可能将所有面试题以文字形式把大厂面试题展示出来,本篇为大家精选了一些面试题,如果你需要这份完整版的面试笔记,大厂面试真题!可以直接点击下方卡片领取

一、性能优化

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 代替+

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 waitstarted  
CPUusage from 4361ms to 699ms ago ----CPU在ANR发生前的使用情况  
04-0113:12:15.872 E/ActivityManager(  220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait  
  
04-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

  1. 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.开发中都使用过哪些框架、平台

1.EventBus 事件分发机制,由handler实现,线程间通信

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.自定义控件:摩天轮的实现过程

关于面试的充分准备

一些基础知识和理论肯定是要背的,要理解的背,用自己的语言总结一下背下来。 虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,所以努力让自己成为高级工程师才是最重要的。

最后

给大家分享一份《Android 高级开发面试题以及答案整理》希望对大家有帮助!内容特点:条理清晰,含图像化表示更加易懂。篇幅有限,展示部分截图,需要完整版的扫码免费领取!

内含:Activity、Fragment、service、布局优化、AsyncTask相关、Android 事件分发机制、 Binder、Android 高级必备 :AMS,WMS,PMS、Glide、 Android 组件化与插件化等面试题和技术栈!

《Android 高级开发面试题以及答案整理》

一、Handler 相关知识

二、Activity 相关

三、Fragment

四、Service 相关

五、Android 布局优化之 ViewStub、include、merge
六、BroadcastReceiver 相关
七、AsyncTask 相关
八、Android 事件分发机制

九、Android View 绘制流程
十、Android Window、Activity、DecorView 以及 ViewRoot
十一、Android 的核心 Binder 多进程 AIDL
十二、Android 高级必备 :AMS,WMS,PMS

十三、Android ANR
十四、Android 内存相关
十五、Android 屏幕适配
十六、Android 缓存机制

十七、Android 性能优化

十八、Android MVC、MVP、MVVM

十九、Android Gradle 知识
二十、RxJava
二十一、OKHTTP 和 Retrofit
二十二、最流行图片加载库: Glide
二十三、Android 组件化与插件化

篇幅有限,需要完整版《Android 高级开发面试题以及答案整理》的朋友扫描下方卡片免费领取,保证免费分享!还有Android开发相关学习资料以及视频解析都可以免费领取!

  • 19
    点赞
  • 173
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
iOS和Android测试是移动应用程序测试领域中非常重要的两个方面。在面试过程中,一些常见的问题包括: 1. 你如何测试iOS和Android应用程序? 在测试iOS和Android应用程序时,首先要了解应用程序的功能需求和设计。然后使用相应的测试工具和设备,如Xcode和iOS模拟器进行iOS应用程序测试,使用Android Studio和模拟器进行Android应用程序测试。通过测试不同的功能和页面,包括用户界面、功能模块、设备兼容性和性能等方面,以确保应用程序的质量和稳定性。 2. 在iOS和Android应用程序测试中,你如何处理兼容性问题? 在测试兼容性时,需要考虑不同版本的iOS和Android操作系统以及各种不同的设备。为了解决这个问题,可以使用真实的设备进行测试,确保测试涵盖不同的操作系统版本和设备型号。此外,还可以利用各种移动测试工具,如Appium和Calabash等,来模拟并测试不同设备和操作系统环境下的应用程序。 3. 你在测试iOS和Android应用程序时使用哪些自动化测试工具? 在测试iOS和Android应用程序时,常用的自动化测试工具包括Appium、Calabash、KIF和Espresso等。这些工具可以自动化执行常见的测试任务,如界面操作、功能验证和性能测试等,并生成详细的测试报告。通过使用自动化工具,可以提高测试效率并减少测试人员的工作负担。 4. 如何测试应用程序的性能? 在测试应用程序的性能时,可以使用工具如Xcode Instruments和Android Profiler来监测应用程序的CPU、内存、网络和电池等方面的性能表现。同时,可以模拟不同的网络环境和设备压力来测试应用程序的性能稳定性。此外,还可以针对应用程序的不同功能和场景进行负载测试和压力测试,以验证其在高负载环境下的性能表现。 总而言之,测试iOS和Android应用程序需要综合考虑功能、兼容性和性能等方面的测试,并利用相应的测试工具和设备来保证应用程序的质量和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值