码迷,mamicode.com
首页 > 移动开发 > 详细

android面试中常会问到的问题总结

时间:2015-07-27 12:36:52      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

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都会进入同一个应用中。

android面试中常会问到的问题总结

标签:

原文地址:http://www.cnblogs.com/PrincessMiao/p/4679751.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!