Android 面试题系列一

1.socket编程,socke的工作原理,以及怎么创建请求?

答:我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。我们知道网络层的ip地址可以唯一标示主机,而传输层TC协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。能够唯一标示网络中的进程后,它们就可以利用socket进行通信了。socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",通过对方的ip和端口号创建socket, 建立后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

2.IntentService和Service的关系,Activity之间怎样传递数据,

答:IntentService是Service的子类。IntentService在执行onCreate的方法的时候,开了一个线程HandlerThread,并获得了当前线程队列管理的looper,并且在onStart的时候,把消息置入了消息队列,在消息被handler接受并且回调的时候,执行了onHandlerIntent()方法,该方法的实现是子类去做的。这个方法里可以执行耗时操作。

传递数据方式:

(1) 广播方式  (2) AIDL  (3)接口回调 (4)共享文件(如SharedPreference,注意同一时间不能同时读写)  (5)Handler的Messager交互

3.ContentProvieder的理解

Android四大组件之一,为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。把所有数据组织成表,提供增删改查,用URI来统一标识资源。

4.TCP、UDP的区别

TCP传输控制协议,是一种提供可靠数据传输的通用协议。

UDP用户数据报协议,是一个面向无连接的协议。如广播

5. OOM异常是什么 ,OOM现象怎么处理

OOM全称为Out of Memory,内存溢出。常见导致OOM场景有

(1)加载超大的Bitmap (通过压缩质量,且使用完注意recycle()回收)

  (2)  查询数据库未关闭游标

  (3)  构造Adapter 时,没有使用缓存的convertView

总之对使用完的资源,注意及时释放。

6.如何监听动画点击事件

监听当前执行动画的View即可(面试官傻掉了?)

7.Android四大组件以及对四大组件的基本认知

Activity:承载页面与用户交互,处理操作

Service:后台运行,相比于Activity是无界面的

BroadCast:  异步广播

ContentProvider: 提供统一的对数据集标准,可用于应用程序之间数据共享

8.谈谈对视图渲染的原理

CPU在图像绘制之前向GPU输入指令这一过程通过OpenGL-ES也就是说在屏幕绘制UI对象的时候都需要在CPU中转化成多边形再传递GPU进行格栅化操作,格栅化操作完成的格栅化将字符串,按钮,路径或者形状的一些高级对象拆分到不同的像素上在屏幕上进行显示

9.View的事件传递机制

假设View的层级关系如下

   

         

 

   

View事件传递顺序ACTION_DOWN

由最上层ViewGroup通过dispathcTouchEvent,如果事件没有被消费(dispatchTouchEventreturn true),或者拦截(onInterceptTouchEventreturn true),就会逐层传往下递到最底层View,如下所示

Activity.dispatchTouchEvent-->ViewGroup1.dispatchTouchEvent-->ViewGroup1.onInterceptTouchEvent-->ViewGroup2.dispatchTouchEvent-->ViewGroup2.onInterceptTouchEvent-->View.dispatchTouchEvent

如果事件没有被消费(onTouchEventreturn true),会逐层往上调用onTouchEvent,如下所示

View.onTouchEvent()->ViewGroup1.onTouchEvent()->ViewGroup1.onTouchEvent()->Activity.onTouchEvent();

10.ART和Dalvik的区别

Dalvik Android 4.4 及其以下平台使用的虚拟机;

ART Android4.4以上平台使用的虚拟机技术;

在应用程序启动时,JIT通过进行连续的性能分析来优化程序代码的执行,在程序运行的过程中,Dalvik虚拟机在不断的进行将字节码编译成机器码的工作。

ART引入了AOT这种预编译技术,在应用程序安装的过程中,ART就已经将所有的字节码重新编译成了机器码。应用程序运行过程中无需进行实时的编译工作,只需要进行直接调用.因此,ART极大的提高了应用程序的运行效率,同时也减少了手机的电量消耗,提高了移动设备的续航能力,在垃圾回收等机制上也有了较大的提升。

相对于Dalvik虚拟机模式,ART模式下Android应用程序的安装需要消耗更多的时间,同时也会占用更大的储存空间(指内部储存,用于储存编译后的代码),但节省了很多Dalvik虚拟机用于实时编译的时间

11.Listview怎样优化

复用convertView、ViewHolder的使用、图片滑动中不加载、item view布局优化、getView尽量少逻辑

现在建议使用RecycleView来代替

12.如果使用webView在JS中调用java方法

Activity注册Scheme,重写WebViewClient,在shouldOverrideUrlLoading做拦截,处理逻辑即可。

13.项目开发使用什么工具

Android Studio是IDE、Git是版本控制工具、真机测试工具等其他辅助开发工具,如图片压缩处理的Tinypng

14.安卓热修复,插件化

热修复:运行时实现对dex的替换,已达到动态修复的目的

插件化:通过ClassLoader以及hook技术实现的apk的动态拔插

15.如何创建线程,线程池及线程池的原理

创建线程:  new Thread(new Runnable)

创建线程池: Executors.newCachedThreadPool();

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

16.Android跨进程通讯都有那些方式

Intent、ContentProvider、BroadCast、Binder

17.网络请求用什么框架

二次封装Volley,Volley的Http实现用Okhttp替代。即为Volley+Okhttp

18.如果避免Viewpage的预加载数据

如果是与Fragment结合使用则通过setUserVisibleHint修改可见度来控制加载

也可以修改Android-support-v4包的源码把viewpager.setOffscreenPageLimit(int num)可以设置预先加载的页面个数,默认允许最小是1,可以改为0

19.Activity.Fragment,Service生命周期

Activity:OnCreate()->onStart()->onResume()->onPause()->onStop->onDestory

Fragment:onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach

Service:

startService() ->onCreate()- >onStartCommand()->Service running--调用stopService() ->onDestroy()

bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()

20.什么是Acitivity

承载以及展示页面,与用户交互,处理操作

21. Service是否在main thread 中执行,Service里面是否能执行耗时的操作?

Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的。所以不能进行耗时操作。如果想做应该单独开线程或者使用IntentService

22. 说说Activity、Intent、Service是什么关系

intent是activity和service的桥梁,通信员,activity主要操作显示界面,service在后台运行,适合长时间运行,如下载,听歌等

23. 请介绍一下Android的数据存储方式

1、使用SharedPreferences存储数据;

2、文件存储数据;

3、SQLite数据库存储数据;

4、使用ContentProvider存储数据;

5、网络存储数据;

24. Listview如何实现分页加载

1.定义分页接口,关键三个字段。总数量count,当前页数pageIndex,每页大小pageSize。

2.定义一个成员变量list来维护数据,获得分页数据后使用addAll 把新数据添加进来,adapter通知数据集有更新即可

25. Java中引用类型都有那些

1.强引用

这是使用最普遍的引用。如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

2.软引用(SoftReference)

如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

3.弱引用(WeakReference)

如果一个对象只具有弱引用,那就类似于可有可物的生活用品。 弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

4.虚引用(PhantomReference)

"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。

26. Serializable和Parcelable的区别是?

Serializable(Java自带):Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。

Parcelable(android 专用):除了Serializable之外,使用Parcelable也可以实现相同的效果,不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,

27. Fragment和Activity之间如何通讯?

1.Fragment直接调用Activity中的public方法

2.使用接口回调方式

3.广播方式

4.EventBus事件总线

5.文件共享


28. Android性能优化

采用优化布局层数。 采用

延时加载View. 采用ViewStub 避免一些不经常的视图长期被引用,占用内存.

移除Activity默认背景,提升activity加载速度。

减少滥用static变量

布局减少嵌套,防止过度重绘

IO操作时记得关闭流

查询完数据库时关闭游标

ListView的优化

图片用完记得及时回收

29. Android屏幕适配都有那些

1. 使用.9Path图片

2.一套标准分辨率图,布局单位使用db, 文字sp

3.考虑一屏不够显示情况,使用ScrollView

4.如果强制一屏显示单独适配可以定义多套dimens.xml 

30. Android中动画有哪几类,他们的特点和区别是什么

第一是Tween动画(补间动画),

Tween动画:使试图组件移动,放大,缩小以及产生透明度的变化。

第二是Frame动画(逐帧动画)。

Frame帧动画就是类似电影,由多张图片切换而成。

第三是属性动画  

通过动画的方式改变对象的属性

31. 在项目中,你是如何缓存数据的?

1. 图片、文件的缓存一般放在磁盘上

2. 本地DB缓存

3. SharedPreference数据放一些非安全性的量

32. 请简单说说,LinearLayout和RelativaLayout两者的区别,并分别描述在什么情况下使用,对性能损耗更小

答:  在具有多层嵌套的情况下,请考虑RelativeLayout以减少嵌套,这样在解析布局文件时就会减少调用onMeasure和onLayout 提高性能

33.在开发中,你是ip直连,还是通过域名访问?

答    一般通过域名访问,但这种情况下会有被运营商DNS劫持的危险,常见的情况是h5页面无缘无故增加了广告

通过ip直连就解决了该问题,因为省略了本地DNS缓存服务器。

你可能感兴趣的:(Android 面试题系列一)