您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 2016年1月Android最新面试题汇总
2016Android面试收集1、请解释下在单线程模型中Message,Handler,MessageQueue,Looper之间的关系。拿主线程来说,主线程启动时会调用Looper.prepare()方法,会初始化一个Looper,放入Threadlocal中,接着调用Looper.loop()不断遍历MessageQueue,Handler的创建依赖与当前线程中的Looper,如果当前线程没有Looper则必须调用Looper.prepare()。Handler,sendMessage到MessageQueue,Looper不断从MessageQueue中取出消息,回调handleMessage方法。2、如果有个100M大的文件,需要上传至服务器中,而服务器form表单最大只能上传2M,可以用什么方法。这个问题不是很明确我觉得,首先来说使用http协议上传数据,特别在android下,跟form没什么关系。传统的在web中,在form中写文件上传,其实浏览器所做的就是将我们的数据进行解析组拼成字符串,以流的方式发送到服务器,且上传文件用的都是POST方式,POST方式对大小没什么限制。回到题目,可以说假设每次真的只能上传2M,那么可能我们只能把文件截断,然后分别上传了。3、内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?内存溢出通俗理解就是软件(应用)运行需要的内存,超出了它可用的最大内存。内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放。内存优化:Android中容易内存溢出的部分,就是图片的加载,我们可以使用图片的压缩加上使用LruCache缓存的目的来控制图片所能够使用的内存。还有对于比较耗资源的对象及时的关闭,例如DatabaseConn,各种传感器,Service等等。4、AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?AsyncTask运用的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。缺陷:AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果此时向线程提交任务,将会抛出RejectedExecutionException。解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。7、assest文件夹里放文件,对于文件的大小有没有限制?22assets目录更像一个附录类型的目录,Android不会为这个目录中的文件生成ID并保存在R类当中,因此它与Android中的一些类和方法兼容度更低。同时,由于你需要一个字符串路径来获取这个目录下的文件描述符,访问的速度会更慢。但是把一些文件放在这个目录下会使一些操作更加方便,比方说拷贝一个数据库文件到系统内存中。要注意的是,你无法在AndroidXML文件中引用到assets目录下的文件,只能通过AssetManager来访问这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。另外,网上关于assets和raw的资料都千篇一律了,因此关于这两者中单个文件大小不能超过1M的**错误**描述也在传播,即如果读取超过1M的文件会报DataexceedsUNCOMPRESS_DATA_MAX(1314625vs1048576)的IOException,还引申出种种解决方案。个人认为不应该有这样的限制,为了验证这个说法写了个Demo,发现将近5M的压缩包在assets和raw中都能正常访问,因此在这里纠正一下,理论上只要打包不超过AndroidAPK50M大小的限制都是没有问题的。当然了,不排除是Android很早期的时候因为设备硬件原因aapt在编译的时候对这两个文件夹大小做出了限制,如果是这样,较新版的ADT应该不会出现这种情况。来自:、启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?是因为启动程序(主界面也是一个app),发现了在这个程序中存在一个设置为categoryandroid:name=android.intent.category.LAUNCHER/的activity,所以这个launcher会把icon提出来,放在主界面上。当用户点击icon的时候,发出一个Intent:Intentintent=mActivity.getPackageManager().getLaunchIntentForPackage(packageName);mActivity.startActivity(intent);跳过去可以跳到任意允许的页面,如一个程序可以下载,那么真正下载的页面可能不是首页(也有可能是首页),这时还是构造一个Intent,startActivity.这个intent中的action可能有多种view,download都有可能。系统会根据第三方程序向系统注册的功能,为你的Intent选择可以打开的程序或者页面。所以唯一的一点不同的是从icon的点击启动的intent的action是相对单一的,从程序中跳转或者启动可能样式更多一些。本质是相同的。9、程序之间的亲和性的理解。1、默认情况下一个应用的所有Activity都是具有相同的affinity,都是从application中继承,application的affinity默认就是manifest的包名。2、affinity对Activity来说,就像是身份证一样,可以告诉所在的Task,自己属于其中的一员。3、应用场合:a:根据affinity重新为Activity选择合适的宿主Task;b:与allowTaskReparenting属性配合;c:启动Activity使用Intent设置了FLAG_ACTIVITY_NEW_TASK标记。10、同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?可以放在不同的Task中。需要为不同的activity设置不同的affinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。11、横竖屏切换时候Activity的生命周期。1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次2、设置Activity的android:configChanges=orientation时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次3、设置Activity的android:configChanges=orientation|keyboardHidden时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法12、AIDL的全称是什么?如何工作?全称是:AndroidInterfaceDefineLanguage在Android中,每个应用程序都可以有自己的进程.在写UI应用的时候,经常要用到Service.在不同的进程中,怎样传递对象呢?显然,Java中不允许跨进程内存共享.因此传递对象,只能把对象拆分成操作系统能理解的简单形式,以达到跨界对象访问的目的.在J2EE中,采用RMI的方式,可以通过序列化传递对象.在Android中,则采用AIDL的方式.理论上AIDL可以传递Bundle,实际上做起来却比较麻烦。AIDL(AndRoid接口描述语言)是一种借口描述语言;编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.如果需要在一个Activity中,访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数组装成自己需要的对象.AIDL的IPC的机制和COM或CORBA类似,是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值.如果要使用AIDL,需要完成2件事情:1.引入AIDL的相关类.;2.调用aidl产生的class.AIDL的创建方法:AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。由于远程调用的需要,这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:1.不需要import声明的简单Java编程语言类型(int,boolean等)2.String,CharSequence不需要特殊声明3.List,Map和Parcelables类型,这些类型内所包含的数据成员也只能是简单数据类型,String等其他比支持的类型.(另外:我没尝试Parcelables,在Eclipse+ADT下编译不过,或许以后会有所支持13、dvm的进程和Linux的进程,应用程序的进程是否为同一个概念Dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,每个android程序系统都会给他分配一个单独的liunxuid(userid),每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.1.什么是Activity?四大组件之一,一般的,一个用户交互界面对应一个activity,activity是Context的子类,同时实现了window.callback和keyevent.callback,可以处理与窗体用户交互的事件.我开发常用的的有ListActivity,PreferenceActivity等…如果界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity.2.请描述一下Activity生命周期。生命周期描述的是一个类从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法..在这个过程中会针对不同的生命阶段会调用不同的方法Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:oncreateondestroyonstoponstartonresumeonpause其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;如果被onDestroy了,则是调用onCreate方法。最后讲自己项目中的经验,比如说豆瓣客户端每次进入某个界面的时候要刷新列表,这个刷新列表的操作就放在onStart()的方法里面.这样保证每次用户看到的数据都是最新的.多媒体播放,播放来电话.onStop()视频,视频声音设置为0,记录视频播放的位子onStart()根据保存的状态恢复现场.在读文档的时候还发现activity还有两个方法onPostResume()和OnPostCreate()这两个生命周期的方法,不过开发的时候没有用到过.3.两个Activity之间跳转时必然会执行的是哪几个方法。一般情况比如说有两个activity,分别叫A,B,当在A里面激活B组件的时候,A会调用onPause()方法,然后B调用onCreate(),onStart(),OnResume(),这个时候B覆盖了窗体,A会调用onStop()方法.如果B呢是个透明的,或者是对话框的样式,就不会调用onStop()方法4.横竖屏切换时候Activity的生命周期。这个生命周期跟清单文件里的配置有关系1、不设置Activity的android:configChanges时,切屏会重
本文标题:2016年1月Android最新面试题汇总
链接地址:https://www.777doc.com/doc-2971881 .html