Android相关面试题
明天要去面试,所以度娘了一下Android面试题,搜索到的结果倒是不少,但大多都雷同,所以小小的整理了一下,摘出来一些比较常用和经典的题目,凑合着用把。唉,顺便抱怨一下:大周末的六点就得起,真是愁人啊。。。
笔试:
1、下面退出Activity错误的方法是(C)
A、finish()
B、抛异常强制退出
C、System.exit()
D、onStop()
解析:System.exit(0) 0是正常退出,其他数字是表示不正常退出;
2、下面属于android的动画分类的有(AB)(多项)
A、Tween B、Frame C、Draw D、Animation
解析:Animation主要有两种动画模式:一种是tweened animation(渐变动画),一种是frame by frame(画面转换动画);
3、android 中下列属于Intent的作用的是(C)
A、实现应用程序间的数据共享
B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失
C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带
D、处理一个应用程序整体性的工作
4、请介绍下Android中常用的五种布局
LinearLayout(线性布局),RelativeLayout(相对布局),FrameLayout(框架布局),TableLayout(表格布局),AbsoluteLayout(绝对布局);
5、请介绍下Android的数据存储方式
一.SharedPreferences方式
二.文件存储方式
三.SQLite数据库方式
四.内容提供器(Content provider)方式
五. 网络存储方式
6、Activity一般会重载7个方法用来维护其生命周期,除了onCreate(),onStart()外还有什么?
onRestart(),onDestory(),onResume(),onPause(),onStop();
7、两个Activity之间跳转时必然会执行的是哪几个方法?
一般情况比如说有两个Activity,分别叫A,B ,当在A里面激活B组件的时候, A 会调用 onPause()方法,然后B 调用onCreate() ,onStart(), OnResume() ,
这个时候B覆盖了窗体, A会调用onStop()方法. 如果B呢 是个透明的,或者是对话框的样式, 就不会调用onStop()方法;
8、内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?
内存溢出通俗理解就是软件(应用)运行需要的内存,超出了它可用的最大内存。
内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放。
内存优化:Android中容易内存溢出的部分,就是图片的加载,我们可以使用图片的压缩加上使用LruCache缓存的目的来控制图片所能够使用的内存。
还有对于比较耗资源的对象及时的关闭,例如Database Conn , 各种传感器 , Service 等等。
8、谈谈UI中, Padding和Margin有什么区别?
Padding 文字对边框, margin是控件与控件之间的距离
面试:
1、AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?
AsyncTask 运用的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。
缺陷:AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果
此时向线程提交任务,将会抛出RejectedExecutionException。
解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。
2、什么是ANR 如何避免它?
答:ANR:Application Not Responding,五秒
在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。
当出现下列情况时,Android就会显示ANR对话框了:
对输入事件(如按键、触摸屏事件)的响应超过5秒;
意向接受器(intentReceiver)超过10秒钟仍未执行完毕;
Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。
因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。
因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。
潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成(或者是使用异步请求,如数据库操作)。
但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 -- 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),
让子线程在即将结束的时候调用它。使用这种方法涉及你的应用程序,能够保证你的程序对输入保持良好的响应,
从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。
3、写出几种你认为可以提高Android程序运行效率的方法(至少5种);
一、http用gzip压缩,设置连接超时时间和响应超时时间:http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,仍然通过缓存的httpresponse浏览部分数据,实现离线阅读;
二、使用线程池,分为核心线程池和普通线程池,下载图片等耗时任务放置在普通线程池,避免耗时任务阻塞线程池后,导致所有异步任务都必须等待;
三、尽量避免static成员变量引用资源耗费过多的实例,比如Context;
四、listview 性能优化
1)异步加载图片
2)快速滑动时不显示图片
3)复用convertView
4)BaseAdapter避免内存溢出
五、Bitmap及时的销毁:Activity的onDestroy时将bitmap回收,在被UI组件使用后马上进行回收,对于有用户上传或第三方的大小不可控图片,可进行采样减少图片所占的内存;
六、在onResume时设置该界面的电源管理,在onPause时取消设置;
七、应用开发中自定义View的时候,交互部分,千万不要写成线程不断刷新界面显示,而是根据TouchListener事件主动触发界面的更新;
八、如果ImageView的图片是来自网络,进行异步加载;
九、位置信息获取用户的地理位置信息时,在需要获取数据的时候打开GPS,之后及时关闭掉;
十、避免申请内存:
1)尽量不要在循环中新建对象,这样会迫使vm总在gc
2)用StringBuffer替代String做加运算。这样就不会产生大量的中间对象了。String可是无法修改的
3)截取String时,用subString()替代新建对象。因为用subString()时,内部的char[]是共享的
十一、尽量用库函数;
十二、少用JNI:JNI并不一定会比java代码的效率更高。guide上建议除移植之外尽量不用JNI。或者说不要因为提高效率而用JNI
4、Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢?
其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。
最后,如果需要更多,或者想要做一些题目锻炼自己,推荐下面两个网站:
尤其是牛客网,里面还有各大公司(谷歌、阿里巴巴、百度、腾讯)的笔试面试题。