Android笔试题带答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Android笔试题大全1.请解释下在单线程模型中Message,Handler,MessageQueue,Looper之间的关系。1、拿主线程来说,主线程启动时会调用Looper.prepare()方法,会初始化一个Looper,放入Threadlocal中接着调用Looper.loop()不断遍历MessageQueue。2、Handler的创建依赖与当前线程中的Looper,如果当前线程没有Looper则必须调用Looper.prepare()。3、Handler通过调用sendMessage()方法讲消息放入MessageQueue中,MessageQueue是一个先进先出的队列,Looper不断从MessageQueue中取出消息,把消息交给消息对应的Handler对象进行分发处理。2.内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?1、内存溢出通俗理解就是软件(应用)运行需要的内存,超出了它可用的最大内存。2、内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放。3、内存优化:Android中容易内存溢出的部分,就是图片的加载,我们可以使用对图片的压缩并且使用LruCache缓存的目的来控制图片所能够使用的内存。对比较耗资源的对象及时的关闭,例如DatabaseConn,流对象,游标,各种传感器,Service等等。3.AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?1、AsyncTask运用的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。2、缺陷:AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,此时如果仍然向线程提交任务,将会抛出RejectedExecutionException。3、解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。4.同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?可以放在不同的Task中。需要为不同的activity设置不同的affinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。5.assets资源文件夹和res资源文件夹的区别?1、assets:所有资源不会在R.java文件下生成相应的标记,assets文件夹可以自己创建文件夹,必须使用AssetsManager类进行访问,存放到这里的资源在运行打包的时候都会直接打入程序安装包中,2、res:所有资源会在R.java文件下生成标记,这里的资源会在运行打包操作的时候判断哪些被使用到了,没有被使用到的文件资源是不会打包到安装包中的。资源会编译成二进制文件进行打包。3、在res文件夹下还可以定义一下目录:res/anim:这里存放的是动画资源。res/xml:可以在Activity中使用getResource().getXML()读取这里的资源文件res/raw:该目录下的文件可以直接复制到设备上,不能有子文件夹,编译软件时,这里的数据不需要编译,直接加入到程序安装包中,使用方法是getResource().OpenRawResources(ID),其中参数ID的形式是R.raw.XXX.6.横竖屏切换时候Activity的生命周期?1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。2、设置Activity的android:configChanges=orientation时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。3、设置Activity的android:configChanges=orientation|keyboardHidden时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。4.0之后多配置一个属性screenSize。7.AIDL的全称是什么?如何工作?1、全称是:AndroidInterfaceDefineLanguage2、AIDL是一种接口描述语言。编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.如果需要在一个Activity中,访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数组装成自己需要的对象.AIDL的IPC的机制是基于接口,轻量级的。它使用代理类在客户端和实现层间传递值。3、使用AIDL,需要完成2件事情:1.引入AIDL的相关类.2.调用aidl产生的class文件。8.ANR异常是什么?如何解决?1、在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:ApplicationNotResponding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现ANR,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。2、ANR异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。9.OOM异常是什么?如何解决?1、OOM就是内存溢出,即OutOfMemory。也就是说内存占有量超过了VM所分配的最大。2、使用Bitmap的时候容易出现OOM。解决办法:1.进行图片压缩,2.采用LruCache进行内存管理。LruCache实现原理是LinkedHashMap存储,当内存不够用的时候,将近期最少使用的数据从缓存中移除,保留使用最频繁的数据。3.异步加载。10.做过哪些ListView的内存优化?1、复用convertView2、绑定ViewHolder,减少findViewById()的次数3、Listview的分页显示,实现上拉加载和下来刷新。4、网络图片的异步加载和三级缓存。11.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?1、onSaveInstanceState()方法2、当你的程序中某一个ActivityA在运行时,主动或被动地运行另一个新的ActivityB,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。12、NDK是什么?1、NDK是一些列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java应用打成apk包。2、NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so。

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功