写点什么

Android 面试官,面试时总喜欢挖基础坑,整理了 26 道面试题牢固你基础

用户头像
Android架构
关注
发布于: 刚刚
内存对象的重复利用

大多数对象的复用,都是利用对象池的技术。


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


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 库等封装,提


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


供 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)

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android面试官,面试时总喜欢挖基础坑,整理了26道面试题牢固你基础