最近一直在面试,总结一些常碰到的问题
1. 四大组件
1)Activity
生命周期:onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy()
启动方式:
a.Stardard 同个任务栈新建不同实例
b.SingleTop 若当前实例处于栈顶,则直接调用;否则,新建实例
c.SingleTask 相同栈内多实例,实例唯一
d.SingleInstance 每个任务栈中只有一个实例
2)Service
启动方法:
a.StartService
生命周期:onCreate()->onStart()->onDestory()
不管启动多少次,onCreate()只调用一次
b.BindService
生命周期:onCreate()->onBind()->onUnbind()->onDestory()
屏幕旋转时,Service重新启动,重新走一遍上述生命周期
3)BroadcastReciver
注册方式,区别
2. Listview优化方案
1)复用ConvertView:判断ConvertView是否为NULL,若为NULL,则新建;否则,直接引用
2)给ConvertView设置TAG,传入ViewHolder对象,用于缓存数据,达到图像数据异步加载的效果
3)数据量大的情况下,实现分页加载(如何分页,如何判断到页底:position等于数据集大小)
4)有图片加载则压缩图片
3. Handler机制
a.Handler发送Msg,Looper对象从消息队列(Message Queue)读取Msg对象进行处理,并把Msg交给Handler,Handler读取并进行UI更新
b.非主线程创建Handler,需要加Looper.prepare()
4. 自定义控件步骤
1)自定义属性,attr.xml
2)在View的构造方法中获得自定义属性
3)测量onMesure()
4)布局onLayout(ViewGroup)
5)绘制onDarw(Canvas的使用)
6)交互动作onTouchEvent
7)onInterceptTouchEvent(ViewGroup)
onMeasure中:
MeasureSpec的specMode:
1)EXACTLY:MATCH_PARENT使用
2)AT_MOST:WART_CONTENT使用
3)UNSPECIFIED
测量完毕后使用setMeasuredDimension
5. 内存泄露的原因
1)资源对象未关闭(Cursor,File等)
2)构建Adapter没有使用ConvertView
3)Bitmap未使用时没释放(使用bm.recycle)
4)使用application的context代替activity的context,避免activity的context在自己范围外使用,导致activity无法释放
5)广播注册没取消
6)Hanler应声明为静态对象,并在其内部类中保存一个对外部类的弱引用
弱引用:不论内存空间是否不足,都会回收内存
软引用:内存空间不足时,回收内存;否则,不回收
6. 解决OOM常用方案
1)缓存图像到内存,采用软引用缓存到内存,而不是每次使用的时候重新加载到内存
2)调整图像大小,做压缩处理
3)及时回收图像(bm.recycle)
4)自定义堆内存分配大小,优化Dalvik虚拟机堆内存分配
7. 图片压缩(按比例压缩)
1)读入图片,把BitmapFactory.Options.inJustDescodeBounds赋值TRUE,使得Bitmap通过路径获得图片信息但不占内存
2)根据option.outWidth和outHeight获取长高
3)设inSampleSize缩放比例,调节decode原图的所需的内存
4)重新读入图片decodeFile
8. ANR如何避免
1)运行在主线程里的任何方法都尽可能少做事情
2)避免在BroadcastRecever中做耗时操作,若有耗时工作,应在Recevier中启动Service
3)使用notification Manager,避免在Intent Recevier里启动Acitivity
9. 对象序列化
1.Parcelable:Android独有,更高效,但是需要实现部分方法
2.Serializable:jre普遍所有,兼容性更好,但是效率较低
3.参考:http://my.oschina.net/u/242041/blog/206997