android相关面试题

来源:互联网 发布:网络审查 论文 编辑:程序博客网 时间:2024/05/21 10:22

文章:http://blog.sina.com.cn/s/blog_7759bda9010132qg.html

1、用htm5开发安卓应用

你只需要一些HTML的相关知识,懂一些CSS和JavaScript,运用工具中所提供的各种丰富的功能模块,便可在很短时间内完成App的开发而且让你的App具备完美的原生体验。

因为用户不需要对于每一个app都要安装,这样确实显得很麻烦。

2、JS和activity调用

3、intent传递数据时,下列的数据类型哪些可以被传递?

a、Serializable b、charsequencec、Parcelabled、Bundle

答案:都可以。a叫做序列化,c叫做包裹化

4、在android中使用Menu时可能需要重写的方法有?

a、onCreateOptionsMenu()  b、onCreateMenu()c、onOptionslitemSelected()d、onItemSelected()

答案:a,c。菜单有两种,一种是选项菜单,需要重写a和c。其创建方法为:先重写a,再创建一个用于解析菜单资源文件的MenuInflater对象,然后调用该对象的inflate()方法解析一个菜单资源文件,并把解析后的菜单保存在menu中。要做选中处理时,重写c.

另一种是上下文菜单,是长时间按键不放产生的。可以在Activity的onCreate方法注册上下文菜单,例如可以为文本框注册上下文菜单。之后重写onCreateContextMenu,选择时重写onContextItemSelected方法。

5、android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库版本进行管理的方法可以是?

a、getWriteableDatabase ()b、getReadableDatabase()c、getDatabase()d、getAbleDatabase()

答案:a,b一般来讲a和b返回的结果是一样的,除非数据库定义了只读或者只写之类的属性。其相关知识如下:

可以定义自己的DBOpenHelper类继承自SQLiteOpenHelper,覆写onCreate(SQLiteDatabase db)。用db.execSQL(SQL语句)来建表等操作,相当于是建立数据库。

同样可以覆写基类的onUpgrade方法,方便数据库版本更新。

操作为:先在方法中定义SQLiteDatabase 对象,然后用DBOpenHelper的getWritableDatabase方法来初始化对象。之后就可以用db.execSQL(SQL语句)执行自己的操作了。

同样可以利用游标进行操作,获取数据。如:

Cursor cur=db.rawQuery("select * from information where id=?",new String []{String.valueOf(id)});

while(cur.moveToNext())//其它用法如cur.moveToLast()移到最后一行。

String a=cur.getString(cur.getColumnIndex("name"));//来获取数据

6、android关于service生命周期的onCreate()和onStart()说法正确的是?

答案:当第一次启动的时候先后调用onCreate()和onStart()(已经被onStartCommand替换掉了)方法,但是之后重启服务的时候只调用onStart

7、GLSurFaceView

GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。

理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
用户自定义渲染器(render)。
让渲染器在独立的线程里运作,和UI线程分离。
支持按需渲染(on-demand)和连续渲染(continuous)。

8、安卓的内存回收机制

当 Android 应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓“退出但不关闭”。从而使得用户调用程序时能够在第一时间得到响应。

当系统内存不足时,系统将激活内存回收过程。为了不因内存回收影响用户体验(如杀死当前的活动进程),

Android 基于进程中运行的组件及其状态规定了默认的五个回收优先级:

IMPORTANCE_FOREGROUND:

IMPORTANCE_VISIBLE:

IMPORTANCE_SERVICE:

IMPORTANCE_BACKGROUND:

IMPORTANCE_EMPTY:
这几种优先级的回收顺序是 Empty process、Background process、Service process、Visible process、Foreground process。

ndroid 系统中内存回收的触发点大致可分为三种情况。

第一,用户程序调用 StartActivity(), 使当前活动的 Activity 被覆盖;

第二,用户按 back 键,退出当前应用程序;

第三,启动一个新的应用程序。

见:http://www.cnblogs.com/bastard/archive/2012/08/17/2644169.html

9、常见的runtimeException

NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常

bufferunderflowexception缓存溢出

UnsupportedOperationException - 不支持的操作异常

10、boolean b=false; system.out.printIn(b)  ;输出false

另外&&操作优先于||操作.

11、activity生命周期

见文章:http://blog.csdn.net/tangcheng_ok/article/details/6755194

对资源状态的保存在onStart函数中进行。

当程序第一次运行时用户就会看这个Activity,这个Activity可以通过启动其他的Activity进行相关操作。当启动其他的Activity时这个当前的这个Activity将会停止,新的Activity将会压入栈中,同时获取用户焦点,这时就可在这个Activity上操作了。都知道栈是先进后出的原则,那么当用户按Back键时,当前的这个Activity销毁,前一个Activity重新恢复。

Activity的启动过程:onCreate—onStart—onResume;按下返回键时:onPause—onStop—onDestroy 正如上面说是,当按下返回键时,此Activity弹出栈,程序销毁。确实如此,我们再次 打开时的启动过程又回到onCreate—onStart—onResume。OK,启动之后按下Home键,回到Launcher,查看打印信息:onPause—onStop,再次打开的运行过程:onRestart—onStart—onResume。

12、SAX和dom解析XML文件优缺点

SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。

优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:只需XML文档的少量内容,很少回头访问;机器内存少;

dom:将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能

缺点:整个文档调入内存,浪费时间和空间。

13、自定义style格式

<style><item></item></style>

14、注册BroadcastReceiver方式是?

<receiver android:name="NewBroad">
<intent-filter>
<action
android:name="android.provider.action.NewBroad"/>
<action>
</intent-filter>
</receiver>

15、ContenValues

和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值都是基本类型。

16、Android的Looper的实现原理,为什么调用Looper.prepare()就在当前线程关联了一个Looper对象,它是如何实现的。

在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper。当调用Looper.prepare()时,那么系统就会自动的为该线程建立一个消息队列,通过 Handler来发送消息。然后调用 Looper.loop();之后就进入了消息循环,这个之后就可以取消息、和处理消息。在主线程中则通过新建Handler对象来处理消息(比如获取的是一些状态码),更新界面

17、简述Android如何处理UI与耗时操作的通信,有哪些方式及各自的优缺点。

安卓对于耗时操作的处理是放在多线程中的,线程通过消息处理机制来与UI进行通信。

对Android也提供了AsyncTask来完成。他相当于封装了线程以及线程通知ui的操作。让你使用起来更方便。

handler的好处在于灵活松散,缺点在于代码不过紧凑
AsyncTask的好处在于业务逻辑和更新都可以非常好的放在一起。缺点个人觉得不够优雅,使用他的代码总是感觉很奇怪。

上面题目来源:滕讯移动端参考题

18、android的activity的7个生命周期?

在Activity从建立到销毁的过程中需要在不同的阶段调用7个生命周期方法。这7个生命周期方法的定义如下:
protected void onCreate(Bundle savedInstanceState)
protected void onStart()
protected void onResume()
protected void onPause()
protected void onStop()
protected void onRestart()
protected void onDestroy()
上面7个生命周期方法分别在4个阶段按着一定的顺序进行调用,这4个阶段如下:

开始Activity:在这个阶段依次执行3个生命周期方法:onCreate、onStart和onResume。
Activity失去焦点:如果在Activity获得焦点的情况下进入其他的Activity或应用程序,这时当前的Activity会失去焦点。在这一阶段,会依次执行onPause和onStop方法。
Activity重新获得焦点:如果Activity重新获得焦点,会依次执行3个生命周期方法:onRestart、onStart和onResume。
关闭Activity:当Activity被关闭时系统会依次执行3个生命周期方法:onPause、onStop和onDestroy。

如果在这4个阶段执行生命周期方法的过程中不发生状态的改变,那么系统会按着上面的描述依次执行这4个阶段中的生命周期方法,但如果在执行的过程中改变了状态,系统会按着更复杂的方式调用生命周期方法。

在执行的过程中可以改变系统的执行轨迹的生命周期方法是onPause和onStop。如果在执行onPause方法的过程中Activity重新获得了焦点,然后又失去了焦点。系统将不会再执行onStop方法,而是按着如下的顺序执行相应的生命周期方法:
onPause -> onResume-> onPause
如果在执行onStop方法的过程中Activity重新获得了焦点,然后又失去了焦点。系统将不会执行onDestroy方法,而是按着如下的顺序执行相应的生命周期方法:
onStop -> onRestart -> onStart -> onResume -> onPause -> onStop


19、android的布局页面为什么一定要用activity,直接用view不行吗?

20、Android的网络开发框架volley,Async-Http

Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如:
android-async-http见:http://www.cnblogs.com/angeldevil/p/3729808.html

retrofit
okhttp

他们各有优劣,之前个人则比较喜欢用android-async-http, 如今Google推出了官方的针对Android平台上的网络通信库,能使网络通信更快,更简单,更健壮,Volley在提供了高性能网络通讯功能的同时,对网络图片加载也提供了良好的支持,完全可以满足简单REST客户端的需求, 我们没有理由不跟上时代的潮流。

文章见:http://blog.csdn.net/jdsjlzx/article/details/40738181

21、app的内存和性能优化相关的?

22、布局优化、系统优化、代码优化,还有使用一些工具监测

23、定长内存池、网站安全方面的

24、android中的消息队列模型和Handler

25、android中如何加载网络数据?可以在主线程中获取吗?

相当于是耗时操作,必须在子线程中进行。

26、android中如何在子线程中更新UI,比如要在子线程中更新界面上的button上的文字,应该如何做?

27、android中多线程间如何通信的?主线程如何知道子线程中信息是否加载好了?

28、android中activity的四种加载方式?若是singtop模式,那么在一个activity的startActivity()方法中调用自己,那么它会经历哪些生命周期?

29、在activity中finish()方法后面的代码是否会执行?

30、android的ANR问题,以及造成ANR问题的原因。

ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr。

默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。
第一:什么会引发ANR?

在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR:
1.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
2.BroadcastReceiver在10秒内没有执行完毕
造成以上两点的原因有很多,比如在主线程中做了非常耗时的操作,比如说是下载,io异常等。

潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成——也不是调用 Thread.wait()或是Thread.sleep()。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。

第二:如何避免ANR?

1、运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)

2、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点)

3、避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。

总结:anr异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。

31、说说MVC,如果将MVC应用到你的android项目中,你会怎样设计?

MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器。

Android中界面部分也采用了当前比较流行的MVC框架,在Android中:

  1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。当然,如何你对Android了解的比较的多了话,就一定可以想到在Android中也可以使用JavaScript+HTML等的方式作为View层,当然这里需要进行Java和JavaScript之间的通信,幸运的是,Android提供了它们之间非常方便的通信实现。

  2) 控制层(Controller):Android的控制层的重任通常落在了众多的Acitvity的肩上,这句话也就暗含了不要在Acitivity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

  3) 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。就是应用程序中二进制的数据。

32、TCP和UDP协议,http协议。http的错误响应码,200,300,400,304,还有其他的一些没见过的。

33、了解设计模式吗?为什么要有设计模式?考了一些具体的设计模式。你在实际项目中有用到哪些设计模式?

见文章:23种设计模式http://www.cnblogs.com/beijiguangyong/archive/2010/11/15/2302807.html

我会的只有单例模式。

以上题目来源:【2014腾讯实习招聘-面试-移动客户端开发】

34、crash发生的原因以及解决方案、如何捕获异常以及处理

35、设计window-LFU缓存类,要求接口如下:

(1)能够制定cache大小

(2)提供get/put/remove数据访问方法

(3)可以制定时间窗口(window)

(4)提供缓存命中率hitrate数据访问方法

36、不依赖下载更新来实现数据更新

以上题目来源:阿里巴巴移动客户端

37、线程的销毁方法是:onDestroy()

38、activity的退出方法有:finish(),onStop(),抛出错误异常,system.exit(0)

39、安卓的动画模式有:

tweened animation(渐变动画)

frame by frame(画面转换动画)

40、dvm

DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念.

41、assets的作用是主要放置多媒体等数据文件。

res/raw目录主要这里的文件是原封不动的存储到设备上不会转换为二进制的格式。

42、一些基础知识

◆android NDK,是一系列工具的集合,NDK 提供了一份稳定、功能有限的 API 头文件声明。使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式。NDK 将是 Android 平台支持 C 开发的开端。

◆android中常用的四个布局是LinearLayout(线性布局)、FrameLayout(单帧布局)、RelativeLayout(相对布局)和TableLayout(表格布局)

◆android 的四大组件是activity,service,broadcast和Content Provider。

◆java.io包中的objectinputstream和objectoutputstream类主要用于对对象(Object)的读写。
◆ android 中service的实现方法是:startservice和bindservice。

◆android的数据存储的方式sharedpreference,文件,SQlite,contentprovider,网络

◆startActivityForResult(Intent,requestCode)

43、adb命令

在platform-tools中有这个程序。

请使用命令行的方式创建一个名字为myAvd,sdk版本为2.2,sd卡是在d盘的根目录下,名字为scard.img, 并指定屏幕大小HVGA。

◆创建模拟器 android create acd -n myAvd -t 8 -s HVDA – C d:\card.img

◆查看哪些连接到adb服务器 abd devices

◆安装应用程序 abd install d:\imageViewer.apk

◆文件复制 add push <local><remote>  //同样可以反过来

◆进入shell adb shell   //可以进入shell控制台,管理sk卡等,如cd sdcard(进入sk卡), mkdir mrsoft(创建文件夹), rkdir mrsoft(删除文件夹)  ,ls -al(显示所有文件和文件夹)

◆获得可用的Android平台 android list targets

◆删除AVD android delete avd -n<name>

◆创建模拟器共享sd卡 mksdcard -l<卷标签><size如2MB><路径/名称>

除了shell,同样可以通过DDMS透视图中的File Explorer->mnt来进行管理SD卡。

44、更新界面

45、访问一个网页:

Uri uri=Uri.parse("http://translate.google.cn");

Intent intent=new Intent(Intent.ACTION_VIEW,uri);

这种方法是直接调用默认浏览器。

同样可以使用WebView控件。其方法如下:

WebView wv.(WebView)findViewById(R.id.webView1);

wv.loadUrl("http://translate.google.cn");

如果需要加载js控件的话,需要用loadDataWithBaseURL来加载。

46、IP协议

◆4位版本

◆4位首部长度

◆8位服务类型(TOS)

◆16位总长度指IP数据报的长度


◆16位标识,标识主机发送的每一份数据报。

◆3位标识,标识该报文是否分片,后面是否还有分片

◆13位片偏移,在原始数据报中的相对位置。


◆8位生存时间(TTL)设置了数据报可以经过的最多路由器的数目。

◆8位协议,6表示传输层是TCP协议。

◆16位首部检验和,对首部中每16位进行二进制反码求和。如果传输过程中没有发生任何差错,那么接收方计算结果应该全为1.


◆32位源IP地址和32位目的IP地址

◆数据


47、TCP协议

应用层想传输层发送用8位字节表示的数据流,然后TCP协议把数据流分成适当长度的报文段(受数据链路层的最大传送单元MTU限制),TCP对每一个包标上序号,接收端要对序号进行确认。发送和接收时都要计算校验和。

协议头最少长度为20个字节。

◆16位源主机端口号

◆16位目的端口号


◆32位序号,是发送数据包第一个字节的序号。

◆32位确认序号,是请求下一个数据报第一个字节的序号,说明以前的都收到了。


◆4位数据偏移,指明了TCP报文段的首部长度。

◆保留6位

◆6位标志域,URG、SYN、FIN、ACK、PSH(推送)表示要尽快转由应用处理、RST(复位)复位相应的TCP连接

◆16位窗口大小,由接收方告诉发送方,允许发送的数据量。


◆16位校验和,校验首部和数据。

◆16位紧急指针,只有在URG为1时才有效。


◆数据

48、UDP

◆16位源端口

◆16位目的端口


◆16位长度,为用户数据报的总长度

◆16位的校验和,校验首部和数据


◆数据

49、ServerSocket和Socket,UDP通信,FTP客户端(使用Apache的包)

HTTP协议特点:

◆支持客户端/服务器模式

◆简单快速,请求服务时,只要传送请求方法即可如POST、GET

◆灵活。允许传输任意类型的数据对象,正在传输的类型由Content-type加以标记。

◆无连接。每次只处理一个请求,即响应完成后就断开连接。

无状态。若需要处理前面的信息,则需要重传。

URL的一般格式:http://主机[端口]路径,端口号为空则默认为80

请求报文

由请求行、请求报头、空行和请求数据4个部分组成

◆请求行,由方法字段、URL字段和HTTP协议版本字段组成如:

get /from.html HTTP/1.1

◆请求报头

user-agent:包括请求的操作系统、浏览器类型等信息。

accept:text/html,application

accept-encoding:gzip,deflate

content-type:

Referer:

Host:请求的主机名

connection:keep-Alive

空行,的作用是发送回车符和换行符,通知服务器以下不再有请求头。

◆请求数据,主要是POST提交表单的数据

响应报文

◆状态行,由协议版本,状态码,状态码描述组成。如:

HTTP/1.1 200 ok

常用的状态码有200 400 401 403 404 500(internal server error)503(server unavailable) 

◆相应报头

Location:用于重定向接受者到一个新的位置。

server:和user-agent相对,服务器系统信息。

空行

◆响应正文。

实体报头:既可以用于请求报头也可以用于响应报头

content-Encoding:编码

content-Language

content-Length


50、JSON数据解析









0 0
原创粉丝点击