本篇主要是自己用来总结自己面试遇到的一些问题,及平时看到的面试总结问题。为以后面试做个资料准备,也为其他面试者提供一份资料。本篇文章不会一次整理完,后续会不断追加。
一、Java知识部分
Q:ArrayList的一个集合,遍历元素的同时进行删除操作,有没有问题?如果有问题,如何解决?
A:正常情况下遍历ArrayList的两种方式为fori和增强for循环两种方式,当采用fori进行遍历同时执行删除某个元素时,没有什么异常;如果采用增强for循环的方式进行增删操作,会抛出ConcurrentModificationException异常,原因就是底层依赖的是迭代器。基于以上情况,如果要在遍历的时候进行删除操作,可以获取ArrayList的迭代器,调用迭代器的remove方法完成。
Q:List的分类,类别之间的区别是什么,都分别适合什么操作。
A:Java中的List是一个接口,其派生常用的主要有ArrayList和LinkedList。ArrayList底层是由数组实现的,LinkedList底层是由链表实现的。基于数组可以直接访问每一个具体的元素,ArrayList适合根据下标直接访问某个具体的元素;相对的,链表的特点是增删操作灵活,只需要将指针进行动态修改即可,所以LinkedList适合对集合进行频繁的增删操作。
Q:看你简历中说熟练使用多线程,说一下你是如何使用的?遇到过什么相关问题,如何解决?
A:在项目中检测有版本更新时,下载新版本使用AsyncTask来进行新apk文件的下载,下载完成后进行安装。在电话面试中接着问了AysncTask中各个版本的内部实现有什么区别的问题?在AsyncTask内部维护了一个线程池,用来执行添加到其中的耗时任务。在2.3版本以前,采用的线程池数量是默认的5个,多个添加到线程池中的任务是已并行执行;在3.0以后,AsyncTask中的线程池的默认数量为设备上cpu的数量,另外还维护了一个任务队列,会依次从任务队列中获取任务按照顺序执行。
在使用线程多的地方,有时候会遇到并发访问的问题。此时可以使用给方法加锁关键字的方法或者对代码块进行加锁,来解决并发访问的问题。尤其在数据库操作时时长遇到此类问题。
二、Android部分相关
Q:说一下Activity的生命周期。具体都是做哪些操作?(此题的考察点不在声明周期方法,而是具体哪些操作,需要面试者总结一些常见的操作,总结的越全面越好。)
A:onCreate界面创建,此时还不可见;onStart用户已可见但还无法交互操作;onResume用户可以开始进行交互操作;onRestart重新可见;onPause界面被其他界面遮挡;onStop界面完全被遮盖;onDestroy界面被系统回收;七个主要的生命周期方法及对应的状态。一般情况下,在onCreate中设置布局文件及初始化视图,接收传递数据,注册,绑定等;在onResume中进行数据加载,数据更新,初始化动画等操作;在onPause中,停止数据刷新,保存一些数据变量等操作;onDestory中进行反注册,解除绑定,移除Handler中消息队列中的消息等操作;
Q:Activity的启动模式,解释一下。具体在项目中如何使用的。
A:Activity有四种启动模式,分别是standard,singleTop,singleTask,singleInstance。startActivity开启新Activity时,默认是standard模式;singleTop为栈顶优先,指定了singleTop的Activity,如果在栈顶,启动该Activity时不会重新启动,而会调用onNewIntent方法来接受intent;singleTask可以简单理解为栈内唯一模式,即如栈内已存在某个启动模式为singleTask的Activity,再启动该Activity时,就会将Activity放到栈顶,同时调用activity的onNewIntent方法。singleInstance模式Activity单独在一个任务栈中存在。通常会把主界面设置为singleTask模式,在有通知点击跳转事件时,把点击跳转的界面设置为singleTop,在onNewIntent方法中接收数据,处理业务逻辑。
Q:应用中广播的使用方式(广播的注册方式),广播的几种分类,有什么区别?
A:Android应用中通过广播的使用主要是两个步骤。第一步,先注册广播,第二步,接收广播处理业务逻辑。广播注册分为静态注册和动态注册两种方式。静态注册就是在Mainfest文件中进行声明,该种方式是在apk安装的时候就会被扫描,然后存放到system/pckages.xml文件中;另外一种方式是在代码中进行动态的register和unRegister操作;相比较而言,动态注册要更方便和灵活,可以自己掌握,除此之外,相同的优先级情况下,动态注册要优于静态注册的方式接受目标广播。
Q:Activity与Fragment或者Fragment之间的通信方式有哪些,在项目中都是如何使用的?
A:Activity与Fragment之间的通信大概有接口回调方式,广播,利用EventBus等第三方类库来实现等方式。对于广播而言,虽然可以实现通信的目的,但是有点大材小用,因为广播适用于一对多的情况下;利用第三方等类库受制于添加依赖及特定规则;对于接口回调,如果一个Fragment用到不同的Activity,需要进行不同类型的通信及数据传递,会需要写的代码比较多,灵活度稍差。
Q:oncreate中有个setContent方法,你有看过它是怎么实现的吗?
A:
Q:你平时会看一些源码吗?都是如何进行学习的?
A:
Q:我看你简历上写的熟练使用自定义View,你能给我讲一下你平时都是怎么使用自定义View的吗?
A:
Q:我们在绘制一个View的时候,系统需要知道它的大小和位置,你知道有哪几种View的测量模式吗?分别有什么区别?
A:
Q:简历中有写在项目中承担的责任其中一项主要是搭建框架,你能具体讲讲吗?
A:
Q:网络请求框架用的是什么?有进行过一些封装吗?
A:
Q:简历上我看有写熟练掌握Handler机制,能给我讲讲吗?Looper.prepare方法是在哪一步被调用的?
A:
Q:SystemUi做过需求吗?
A:
Q:Launcher修改,都做了哪些修改,如何修改的?Launcher数据是保存在哪里的?
A:
Q:动态加载的原理了解吗,是如何实现的,从源码的角度分析下?
A:
Q:如何提高进程的存活率,你采用过哪些方式方法?
A: