Android面试整理

一、java部分


String、StringBuffer与StringBuilder之间区别
http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html

ArrayList、Vector、LinkedList的存储性能和特性
http://www.cnblogs.com/jiangyi-uestc/p/5682699.html

理解java的三大特性之多态
http://www.cnblogs.com/chenssy/p/3372798.html

java抽象类的使用
http://www.cnblogs.com/liangqiyuan/p/5568464.html

Java内存管理
http://www.cnblogs.com/andy-zhou/p/5316084.html

HashMap和HashTable的区别
http://www.cnblogs.com/lintong/p/4363533.html

heap(堆)和stack(栈)的区别
Java内存分为两类,一类是栈内存,一类是堆内存,栈内存是指程序进入一个方法时,会为这个方法单独分配一块存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈也会释放,这个栈中的变量也随之释放。
堆一般用于存放对象,或final修饰的局部变量。

****wait()和sleep()的区别****
1.sleep来自Thread类,和wait来自Object类
2.调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁
3.sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU
4.sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒,wait需要notify或notifyAll才能唤醒。

ArrayList源码分析
http://blog.csdn.net/jzhf2012/article/details/8540410

垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法通知虚拟机进行垃圾回收?
http://www.cnblogs.com/zhangxiaopeng/p/5001171.html

线程池概念及使用
http://www.cnblogs.com/dolphin0520/p/3932921.html

JVM中的垃圾收集算法和Heap分区
http://www.cnblogs.com/caca/p/jvm_gc_algorithm_heap_space.html

内存泄露-基础知识
http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=21&extra=page%3D1%26filter%3Ddigest%26digest%3D1

内存泄露-排查方法
http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=62&extra=page%3D6

内存泄露-常见原因
http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=125&extra=page%3D3

算法
http://www.jianshu.com/p/ae97c3ceea8d

二、Android部分


Handler异步处理信息机制
http://blog.csdn.net/lmj623565791/article/details/38377229/

View 事件传递
http://a.codekk.com/blogs/detail/54cfab086c4761e5001b253e

Parcelable和Serializable的区别
http://blog.csdn.net/djun100/article/details/9667283

View 绘制流程
http://a.codekk.com/blogs/detail/54cfab086c4761e5001b253f

多线程
http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1022&extra=page%3D1%26filter%3Ddigest%26digest%3D1

android存储数据方式
1.sharePreference,它是android提供的用来存储一些简单配置信息的机制,采用了xml格式将数据存储到设备中。
2.文件存储,即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
3.SQLite存储,SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
4.使用ContentProvider存储,主要用于应用程序之间的数据交换,从而能够让其他应用保存或读取此ContentProvider的数据。
5.网络存储,通过网络上提供给我们的存储空间来上传和下载我们在存储空间的数据信息。

view、surfaceView、GLSurfaceView的关系和区别
view是最基础的,必须在UI主线程内更新画面,速度较慢。
SurfaceView是view的子类,使用双缓机制,在新的线程中更新画面,刷新速度比View快。
GLSurfaceView是SurfaceView的子类,openGL专用。

横竖屏切换时,activity的生命周期
1.不设置activity的android:configchanges时,切屏会重新调用各个生命周期,切横屏执行一次,切竖屏执行两次。
2.设置activity的android:configchanges="orientation"时,切屏会重新调用各个生命周期,切横、竖屏只会执行一次。
3.设置activity的android:configchanges="orientation|ketboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigChanged方法。

何如打开raw目录中的数据库文件?
在android中不能直接打开raw目录中的数据库文件,需要在程序第一次启动时,将文件复制到手机内存中或SD卡中,然后再打开数据库文件,复制的基本方法是使用getResources().openRawResource获得raw目录中资源的InputStream,然后将InputStream的数据写入其他目录中的相应文件,然后使用SQLiteDatabase打开。

android四种启动模式
standard:每启动一个新的activity,它就会在返回栈中入栈,并处于栈顶的位置。
singleTop:栈顶复用模式,如果新activity已经位于任务栈的栈顶,那么此activity不会被重新创建,同时它的onNewIntent方法会被调用,如果不是则仍会创建。
singleTask:栈内复用模式,这是一种单例模式,只要activity在一个栈内存在,那么多次启动此activity都不会被重新创建实例,会调用onNewIntent,并把次activity上的所有activity出栈。
singleInstance:启动一个新的返回栈来管理这个activity,这个返回栈只有这个实例,不允许有别的activity存在。

android内存优化
1.循环内尽量不要使用局部变量。
2.不用的对象即时释放。
3.数据库的cursor及时关闭。
4.构造adapter时,使用缓存的converview。
5.即时关闭InputStream / OutputStream。
6.对于service调用registReceiver()后,对应的生命周期方法中调用unRegistReceiver。
7.图片尽量使用软引用,较大的图片可以通过BitmapFactory缩放后再使用,并及时recycle。

加载大图片时如何防止内存溢出
1.尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,通过BitmapFactory.decodeStream创建出一个bitmap,再将其设为ImageView的source。
2.使用BitmapFactory.Options对图片进行压缩。
3.运用java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免重复加载,及时销毁不再使用的bitmap对象。

屏幕适配
1.图片适配:不同手机分辨率会找到不同drawable对应的目录,在做屏幕适配时,会把一些对应分辨率的图片放在drawable中。
2.布局适配:不同手机屏幕的大小不一样,可以让布局的展示也不一样,在res目录下创建layout-1280 *720文件夹,里面创建的布局文件会加载在1280 * 720 的手机屏幕上。
3.尺寸适配:在res下创建values - 1280 * 720 文件夹,dimens代码用@dimen/imagewidth 调用。

Application Not Responding(ANR)定位和修复
1.主线程中存在耗时的计算。
2.主线程中错误的操作(如Thread.wait或Thread.sleep)。
3.BroadcastReceiver未在10秒内完成相关处理。
4.Activity的onCreate和onResume回调中尽量避免耗时的代码

如何避免OOM
1.使用更加轻量的数据结构,如使用ArrayMap/SparseArray而不是HashMap等传统数据结构。
2.避免在Android中使用Enum。
3.减少bitmap对象的内存占用,通常有2个方法,inSampleSize缩放比例,把图片载入内存之前,我们需要计算出一个合适的缩放比例,避免不必要的大载入。 decode format:解码格式,选择ARGB_8888 / RBG_565 等存在很大差异。
4.使用更小的图片,在涉及到资源图片时,我们需要特别留意这张图片是否存在可以压缩的空间,是否可以使用更小的图片。
5.内存对象的重复利用

  • 复用系统自带的资源,Android系统本身内置了很多的资源,如字符串、颜色、图片、动画、样式等,这些资源都可以在程序中直接引用。
  • 注意在listview等出现大量重复子组件的视图里堆ConvertView的复用。
  • Bitmap对象复用,在listview等显示大量图片的控件里,需要使用LRU的机制来缓存处理bitmap。

6.避免对象的内存泄露,内存对象的泄漏,会导致一些不再使用的对象无法及时释放,这样一方面占用了宝贵的内存空间,很容易导致后续需要分配内存的时候,空闲空间不足而出现OOM。

  • 注意activity的泄露, 1.内部类引用导致activity的泄露(如Handler)。2.activity的context被传递到其他实例中。
  • 考虑使用Application Context而不是activity context

7.谨慎使用static对象,因为static的生命周期过长,和应用程序保持一致,使用不当很可能导致对象泄漏。
8.优化布局层次,减少内存消耗。

Android常见的内存泄漏
1.单例造成的内存泄漏:由于单例的静态特性使得其生命周期跟应用的生命周期一样长,如果使用不当很容易造成内存泄漏。(要传入context时,不要传入activity的context)
2.匿名内部类,非静态内部类:都持有外部类的引用。
3.Handler造成内存泄漏:如果Acitivty被finish,但延时任务还没处理完成,它会持有activity的引用而造成泄漏。 解决方法:声明Handler为静态的,则其存活期跟activity无关,同时通过弱引用方式传入activity,最后在activity的onDestory时应移除消息队列中的消息。
4.尽量避免使用static成员变量。
5.资源未关闭造成的内存泄漏:对于使用了BraodcastReceiver,File,游标 ,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

AsyncTask原理及不足
线程池有限,太多异步会满线程池,导致ANR(应用没反应)
会开大量线程消耗系统资源导致应用FC(强制关闭)
一旦doingbackground,cancel不了

如何退出Activity?如何安全退出已调用多个Activity的Application?
1.记录打开的Activity,定义一个活动集合类,对所有的活动进行管理。
2.发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
3.递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容