2017安卓开发工程师面试题总结

JAVA篇

1. 抽象类和接口的区别

抽象类:抽象方法,只有行为的概念,没有具体的行为实现,使用abstract关键字修饰,没有方法体,子类必须 重写这样的抽象方法。
包含抽象抽象方法的类,一定是抽象类。
抽象类只能被继承,一个类只能继承一个抽象类
接 口: 全部的方法都是抽象方法,属性都是常量。
不能实例化,只能自定义变量
接口只能被实现, 一个类实现接口,必须实现全部的抽象方法
接口之间可以多实现。
一个类可以实现多个接口,实现多继承现象。

2.列举你所知道的线程同步的方法
wait():让线程等待,让线程存储到一个线程池中。
notify():唤醒被等待的线程,通常都唤醒线程池中的第一个,让被唤醒的线程处于临时阻塞状态
notifyAll():唤醒所有的等待线程

3.equals和==的区别
==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向内存空间的值是不是相同

4.简述String、StringBuffer、ArrayList和LinkedList、HasMap和HasTable的区别
String对象的长度一旦固定就不可以改变,对于已存在的String对象的修改都是创建一个新的对象,然后把新的值存进去,String类是final修饰的,所以不能被继承。StringBuffer是一个可变对象,当对它进行改变的时候不会像String那样,它只能通过构造函数来创建对象 ,另外StringBuffer还是一个线程安全的类。
ArrayList是实现了基于动态数组的数据结构,LinkedList是实现了基于链表的数据结构,二者都可以存储对象的引用,对于随机访问set和get,ArrayList优于LinkedList
Hasmap是HasTable的轻量级的实现(非线程安全的),他们两个都实现了map接口,主要区别在于hasmap允许空键值,优于非线程安全,在一个线程的情况下,效率要高于HasTable。
5.简述类中的静态成员和非静态成员的区别
静态成员变量是static关键字修饰的,在类被实例化时创建,通过类进行访问
不带有static修饰的成员变量称之为非静态成员变量,在对象被实例化时创建,通过对象进行访问
一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值。静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。
6.什么是单例?
一个类中只有一个实例并且自行化向整个系统提供这个实例叫单例

7.super()和this()的区别
super()是指父类的无参构造方法,this()是指当前类的无参构造方法,两者都必须写在构造方法的第一句 。
8.简述下JAVA中的垃圾回收机制
标记回收法:遍历对象图并且记录可到达的对象,以便删除不可到达的对象,一般使用单线程工作并且可能产生内存碎片
标记-压缩回收法:前期与第一种方法相同,只是多了一步,将所有的存活对象压缩到内存的一端,这样内存碎片就可以合成一大块可再利用的内存区域,提高了内存利用率

复制回收法:把现有内存空间分成两部分,gc运行时,它把可到达对象复制到另一半空间,再清空正在使用的空间的全部对象。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。

分代回收发:把内存空间分为两个或者多个域,如年轻代和老年代,年轻代的特点是对象会很快被回收,因此在年轻代使用效率比较高的算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老年的内存空间,老年代则采取标记-压缩算法

引用计数(最简单古老的方法):指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程

对象引用遍历(现在大多数 jvm 使用的方法):对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集

什么是垃圾回收机:释放那些不再持有引用的对象的内存

9.JAVA和C++在内存管理上有什么区别
JAVA和C++之间有一堵由动态内存分配和垃圾收集技术所围成的高墙,外面的人想进来,里面的人想出去
对于从事C和C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权利的皇帝,也是从事最基础工作的劳动人民—–既拥有每一个对象的所有权,又担负着每一个对象从生命开始到终结的维护责任。
对于Java程序员来说,虚拟机的自动内存分配机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄露和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序员把内存控制的权利交给Java虚拟机,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将会是一项异常艰难的工作。并且好的Java程序在编写的时候肯定要考虑GC的问题,怎样定义static对象,怎样new对象效率更高等等问题,简称面向GC的编程,也可以说Java的内存分配管理是一种托管的方式,托管于JVM。

10.Override和Overload的含义和区别
override(重写,覆盖)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载,过载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
Overload的方法不能改变返回值类型
11.final类有什么特点
该类不能被继承
12.Stirng是基本数据类型吗
不是
13.多线程有几种实现方式,同步有几种实现方式

   多线程有两种实现方式,分别是继承是继承Thread类和实现runnable接口
   同步的实现方面有两种,分别是synchronized,wait与notify

14.Sleep()和wait()有什么区别
sleep()是线程中的一个方法,该方法用于控制自身线程的流程,当实行sleep()方法睡眠时保持线程锁。
wait()是object类中的一个方法,该方法用于让一个线程处于释放状态并释放对象锁,当该线程想要再次执行时需要调用notify方法唤醒此线程
15.当一个线程进入一个对象的Synchronized方法后,其他线程是否可进入此对象的其他方法
可以去访问非Synchronized方法。

16.如何获取一个目录下有多少个文件?
File f=new File(“D://”);
Int count=f.list().length;
17.当一个对象不再被使用时,如何才能从内存中消失?
将该对象引用值为空
18. 进程和线程的区别
一个线程只能属于一个进程,而一个进程可以有多个线程,至少要有一个线程
资源分配给进程,同一进程的所有线程共享该进程的所有资源。
线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步
处理机分给线程,即真正在处理机上运行的是线程。
线程是指进程内的一个执行单元,也是进程内的可调度实体。
19.线程是指进程内的一个执行单元,也是进程内的可调度实体。
因为方法的重载时按照参数来区分的,如果按返回值,JVM不知道怎么区分,方法指定不明确;

Android篇

1.如何避免OOM
定义:当程序需要申请一段“大”内存,但是虚拟机没有办法及时的给到,即使做了GC操作以后
这就会抛出 OutOfMemoryException 也就是OOM。
ArrayMap/SparseArray代替hashmap。
避免在android里面使用Enum。
减少bitmap的内存占用。
减少资源图片的大小,过大的图片可以考虑分段加载
避免在ondraw方法里面 new对象
2.ANR 是什么?怎样避免和解决 ANR(重要)
ANR->Application Not Responding ,也就是在规定的时间内,没有响应。
避免在activity里面做耗时操作,oncreate & onresume
避免在onReceiver里面做过多操作
尽量使用handler来处理UI thread & workthread的交互。
3.Android 线程间通信有哪几种方式
共享变量(内存)
管道
handle机制
runOnUiThread(Runnable)
view.post(Runnable)
4.描述一下 android 的系统架构.
从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
5.Android 屏幕适配
屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,做处理。
dp来适配屏幕,sp来确定字体大小
drawable-xxdpi, values-1280*1920等 这些就是资源的适配。
wrap_content,match_parent, 这些是view的自适应
weight,这是权重的适配。
6.什么是 AIDL 以及如何使用
Android Interface Definition Language
AIDL是使用bind机制来工作。
参数:
java原生参数
String
parcelable
list & map 元素 需要支持AIDL
7.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么
EventBus,广播,view.post, runinUiThread
但是无论各种花样,本质上就2种:handler机制 + 广播
8.子线程中能不能 new handler?为什么
必须可以。子线程 可以new 一个mainHandler,然后发送消息到UI Thread。
9.Android 中的动画有哪几类,它们的特点和区别是什么
视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。
属性动画,通过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0
帧动画,通过drawable一帧帧画出来。
Gif动画,原理同上,canvas画出来。
10.SurfaceView & View 的区别
view的更新必须在UI thread中进行
surfaceview会单独有一个线程做ui的更新。
surfaceview 支持open GL绘制。
11.activity的启动模式有哪些?是什么含义?
在android里,有4种activity的启动模式,分别为:

“standard” (默认)

“singleTop”

“singleTask”

“singleInstance”

它们主要有如下不同:

  1. 如何决定所属task

“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。

如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。

“singleTask”和”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。

  1. 是否允许多个实例

“standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例;

“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。 singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

  1. 是否允许其它activity存在于本task内

“singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。

而另外三种模式,则可以和其它activity共存。

  1. 是否每次都生成新实例

“standard”对于没一个启动Intent都会生成一个activity的新实例;

“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。

比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。

如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D

如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。

“singleInstance”是其所在栈的唯一activity,它会每次都被重用。

“singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。

当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

12. 请描述下Activity的生命周期。
activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();

可见生命周期:从onStart()直到系统调用onStop()

前台生命周期:从onResume()直到系统调用onPause()

13. 如何退出Activity?如何安全退出已调用多个Activity的Application?
对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。

对于多个activity,1、记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。2、发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。3、递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。为了编程方便,最好定义一个Activity基类,处理这些共通问题。

在2.1之前,可以使用ActivityManager的restartPackage方法。

它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。

注意不要被它的名字迷惑。

可是,在2.2,这个方法失效了。在2.2添加了一个新的方法,killBackground Processes(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和2.2的restartPackage一样,根本起不到应有的效果。

另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。它需要权限android.permission.FORCE_STOP_PACKAGES。并且需要添加android:sharedUserId=”android.uid.system”属性。同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。

因为需要在Android.mk中添加LOCAL_CERTIFICATE := platform。

而Android.mk是用于在Android源码下编译程序用的。

从以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。

现提供几个方法,供参考:

1、抛异常强制退出:

该方法通过抛异常,使程序Force Close。

验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity:

每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:

在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

4、递归退出

在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。为了编程方便,最好定义一个Activity基类,处理这些共通问题。
14. android系统的优势和不足
Android平台手机 5大优势:

一、开放性

在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。

二、挣脱运营商的束缚

在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市 ,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。

三、丰富的硬件选择

这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢?

四、不受任何限制的开发商

Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。

五、无缝结合的Google应用

如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。

再说Android的5大不足:

一、安全和隐私

由于手机 与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。

二、首先开卖Android手机的不是最大运营商

众所周知,T-Mobile在23日,于美国纽约发布 了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服务则要另当别论了!

三、运营商仍然能够影响到Android手机

在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。

四、同类机型用户减少

在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型以外。

五、过分依赖开发商缺少标准配置

在使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在 Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐 播放器,全部依赖第三方开发,缺少了产品的统一性。

15.一条最长的短信息约占多少byte?
中文70(包括标点),英文160,160个字节。
16.谈谈Android的IPC(进程间通信)机制
IPC是内部进程通信的简称, 是共享”命名管道”的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。

猜你喜欢

转载自blog.csdn.net/qq_15023815/article/details/70313024