1、android中主要用到的几种设计模式:
(1)模板模式
如Activity,每次新建一个Activity时都会覆盖onCreate(),onStart()方法等,这些方法在父类中就相当于一个模板。
(2)观察者模式
Listener相当于一个观察者,对一些事件的响应都进项观察,当发现有响应就进行相应的处理。
(3)单例模式(目的:希望对象只创建一个实例,并且提供一个全局的访问点。)
Application
(4)适配器模式(相当于现实生活中的插头)
BaseAdapter、SimpleAdapter
(5)工厂模式(创建位图)
BitmapFactory.decodeResource();BitmapFactory相当于位图工厂。
(6)代理模式
android系统中利用AIDL定义一种远程服务时就需要用到代理模式。
2、android的四大组件
Activity、Service、Broadcast Receiver、content provider
3、自定义控件的步骤
(1)定义一个Class继承于系统View;
(2)在xml中配置layout布局文件;
(3)重写父类的一些方法,如onMeasure、onDraw、onLayout等;
(4)在程序中应用自定义的View;
4、onMeasure、onDraw、onLayout的作用
onMeasure()用来设置视图的大小,即视图的宽度和高度;
onLayout(),layout操作用于设置视图在屏幕中显示的位置。onLayout(),在view中这个函数什么都不做,为viewgroup类型布局子视图用;
onDraw(),draw操作利用前面两部分得到的参数,将视图显示在屏幕上。
(1)绘制背景;
(2)绘制视图本身,调用ondraw()方法;
(3)绘制子视图,dispatchDraw()容器类会用到这种方法;
(4)绘制滚动条。
5、Activity的生命周期
(1)启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
(2)当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
(3)当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
(4)当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
(5)用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
(6)当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
(7)用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
6、Handler机制原理
发送消息和处理消息
7、 GC内存泄露
出现情况:
(1)数据库的cursor没有关闭
(2)构造adapter时,没有使用缓存contentview
衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程/
(3)Bitmap对象不使用时采用recycle()释放内存
(4)activity中的对象的生命周期大于activity
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]
8、什么是ANR 如何避免它
ANR:Application Not Responding,五秒
在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:
对输入事件(如按键、触摸屏事件)的响应超过5秒
意向接受器(intentReceiver)超过10秒钟仍未执行完毕
Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。
因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成(或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 -- 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。
9、listview如何优化(这个很重要,多次被问到)
(1)分页加载
(2)convertView缓存
(3)viewHolder
(4)scrollListener,记住滑动的状态
10、Activity的四种启动模式
(1)standard
模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
(2)singleTop
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
(3)singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
(4)singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。