本文个人在深圳逛街的时候突然想到的...这几周就有想写几篇关于线程应用程序的笔记,所以回家到之后就奋笔疾书的写出来发表了
以上面试题都是在网上找的总结出来的,感谢大家的分享!希望,我们共同进步,找到自己妄想的公司:
1.android dvm 的进程和Linux的进程,应用程序的进程否是为同一个观点:
答:dvm是dalivk虚拟机。个一每android应用程序都在自己的进程中运行,都具有一个dalivk虚拟机例实。而个一每dvm都是在linux的一个进程。所以说可以以为是同一个观点。
2.android的画动有哪几种?他们的点特和区分是什么?
答:两种,一种是tween画动,一种是frame画动。tween画动,这类实现式方可以使视图组件挪动,放大或缩小以及发生透明度的变更。frame画动,传统的画动法方,通过序顺的播放排列好的片图来实现,相似片子。
3.handler进制的道理:
答:android供给了handler和looper来满意线程间的信通。Handler先进先出则原。looper用来管理特定线程内对象之间的消息交换(message Exchange).
1)looper:一个线程可以发生一个looper对象,由它来管理此线程里的message queue(消息队列)
2)handler:你可以结构一个handler对象来与looper通沟,以便push新消息到messagequeue里;或者接收looper(从messagequeue里出取)所送来的消息。
3)messagequeue:用来放存线程放入的消息。
4)线程:UI thread 常通就是main thread,而android启动程序时会为它建立一个message queue.
4.android view的刷新:
答:Android中对View的更新有很多种式方,用使时要辨别不同的应用合场。我觉感最要紧的是分清:多线程和双缓冲的用使情况。
1).不用使多线程和双缓冲
这类情况最简略了,一般只是希望在View生发转变时对UI停止重绘。你只要在Activity中显式地用调View对象中的invalidate()法方便可。系统会动自用调 View的onDraw()法方。
2).用使多线程和不用使双缓冲
这类情况要需开启新的线程,新开的线程就欠好问访View对象了。强行问访的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.
这时候你要需创立一个继承了android.os.Handler的子类,并重写handleMessage(Messagemsg)法方。android.os.Handler是能发送和处置消息的,你要需在Activity中收回更新UI的消息,然后再你的Handler(可以用使匿名内部类)中处置消息(因为匿名内部类可以问访父类变量,你可以直接用调View对象中的invalidate()法方 )。也就是说:在新线程创立并发送一个Message,然后再主线程中获捕、处置该消息。
3).用使多线程和双缓冲
Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以义定一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不要需android.os.Handler帮助了。SurfaceHolder中lockCanvas()法方可以锁定画布,制绘玩新的图像后用调unlockCanvasAndPost(canvas)解锁(表现),还是较比便方得。
5.说说mvc模式的道理,它在android中的用运:
答:android的官方议建应用程序的发开用采mvc模式。何谓mvc?
mvc是model,view,controller的缩写,mvc含包三个部份:
l型模(model)对象:是应用程序的主体部份,全部的务业逻辑都应当写在该层。
2视图(view)对象:是应用程序中担任生成用户面界的部份。也是在整个mvc构架中用户一唯可以看到的一层,接收用户的入输,表现处置结果。
3控制器(control)对象:是根据用户的入输,控制用户面界据数表现及更新model对象态状的部份,控制器更要重的一种航导功能,想用用户动身的相干件事,交给m哦得了处置。
android励鼓弱合耦和组件的重用,在android中mvc的详细体现如下:
1)视图层(view):一般用采xml文件停止面界的描述,用使的时候可以非常便方的引入,当然,如何你对android解了的较比的多了话,就定一 可以想到在android中也可以用使javascript+html等的式方作为view层,当然这里要需停止java和javascript之间的通 信,荣幸的是,android供给了它们之间非常便方的信通实现。
2)控制层(controller):android的控制层的重 任常通落在了浩繁的acitvity的肩上,这句话也就暗含了不要在acitivity中写码代,要通过activity交割model务业逻辑层处置, 这样做的另外一个原因是android中的acitivity的响应时光是5s,如果耗时的操纵放在这里,程序就很易容被回收掉。
3)型模层(model):对据数库的操纵、对网络等的操纵都应当在model里头处置,当然对务业算计等操纵也是必须放在的该层的。
6.Activity的命生周期:
答:onCreate: 在这里创立面界,做一些据数 的初始化作工
onStart: 到这一步成变用户可见可不交互的
onResume:成变和用户可交互 的,(在activity 栈系统通过栈的式方管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)
onPause: 到这一步是可见但可不交互的,系统会停止画动 等消费CPU 的情事从上文的描述经已道知,应当在这里保存你的一些据数,因为这个时候你的程序的优先级低降,有可能被系统收回。在这里保存的据数,应当在
onstop: 变得可不见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被用调法方了,多是面外类用调finish法方或者是系统为了节俭空间将它暂时性的干掉
7.让Activity成变一个口窗:
答:Activity属性设定:有时候会做个应用程序是漂浮在手机主面界的。这个只要需在置设下Activity的主题theme,即在Manifest.xml义定Activity的方地加一句:
android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:
android:theme="@android:style/Theme.Translucent"
8.Android中经常使用的五种布局:
答:LinearLayout线性布局;AbsoluteLayout绝对布局;TableLayout表格布局;RelativeLayout对相布局;FrameLayout帧布局;
9.Android的五种据数存储式方:
答:sharedPreferences;文件;SQLite;contentProvider;网络
10.请解释下在单线程型模中Message、Handler、Message Queue、Looper之间的系关:
答:Handler取获以后线程中的looper对象,looper用来从存有Message的Message Queue里出取message,再由Handler停止message的分发和处置。
11.AIDL的全称是什么?如何作工?能处置哪些型类的据数?
答:AIDL(AndroidInterface Definition Language)android接口描述语言
12.系统上安装了多种浏览器,否是指定某浏览器问访指定页面?请说明由原:
答:通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性。码代如下:
Intent intent = new Intent();
Intent.setAction(“android.intent.action.View”);
Uri uriBrowsers = Uri.parse(“http://www.sina.com.cn”);
Intent.setData(uriBrowsers);
//包名、要打开的activity
intent.setClassName(“com.android.browser”,”com.android.browser.BrowserActivity”);
startActivity(intent);
13.什么是ANR,如何免避?
答:ANR的义定:
在android上,如果你的应用程序有一段时光响应不移敏灵,系统会向用户示提“应用程序无响应”(ANR:application Not Responding)对话框。因此,在程序里对响应能性的计划很要重,这样,系统不会表现ANR给用户。
如何免避:
首先来研讨下为什么它会在android的应用程序里生发和如何佳最构建应用程序来免避ANR.
android应用程序常通是运行在一个独单的线程(例如:main)里,这就味意你的应用程序所做的情事如果在主线程里占用了大长时光的话,就会发引ANR对话框,因为你的应用程序并没有给自己机遇来处置入输件事或者Intent播广。
因此,运行在主线程里的任何访求都尽可能少做情事。特别是,activity应当在它的键关命生周期法方(onCreate()和onResume())里尽可能少的去作创立操纵。潜伏的耗时操纵,例如网络或据数库操纵,或者高耗时的算计如转变位图寸尺,应当在子线程里(或者以据数库操纵为例,通过步异求请的式方)来实现。然而,不是说你的主线程阻塞在那里待等子线程的实现---也不是用调Thread.wait()或者Thread.sleep()。替换的法方是:主线程应当为子线程供给一个Handler,以便实现时可以提交给主线程。以这类式方计划你的应用程序,将能证保你的主线程持保对入输的响应性并能免避由5秒入输件事的时超发引的ANR对话框。这类做法应当在其它表现UI的线程里效仿,因为它们都受同相的时超影响。
IntentReceiver行执时光的特别制约味意着它应当做:在后台里做小的、碎琐的作工,如保存设定或注册一个Notification。和在主线程里用调的其它法方一样,应用程序应当免避在BroadcastReceiver里做耗时的操纵或算计,但也不是在子线程里做这些任务(因为BroadcastReceiver的命生周期短),替换的是,如果响应Intent播广要需行执一个耗时的动作的话,应用程序应当启动一个Service。便顺及提一句,你也应当免避在Intent Receiver里启动一个Activity,因为它会创立一个新的画面,并从以后用户正在运行的程序上夺抢核心。如果你的应用程序在响应Intent播广时要需向用户展示什么,你应当用使Notification Manager来实现。
一般说来,在应用程序里,100到200ms是用户能感知滞阻的时光值阈,上面总结了一些巧技来免避ANR,并有助于让你的应用程序看起来有响应性。
如果你的应用程序为响应用户入输正在后台作工的话,可以表现作工的进度(ProgressBar和ProgressDialog对这类情况说来很用有)。特别是游戏,在子线程里做挪动的算计。如果你的程序有一个耗时的初始化进程的话,虑考可以表现一个Splash Screen或者倏地表现主画面并步异来充填这些信息。在这两种情况下,你都应当表现正在停止的进度,以免用户以为程序被冻结了。
14.什么情况会致使Force Close?如何免避?否是获捕致使其的异常?
答:如空指针等可以致使ForceClose;可以看Logcat,然后找到对应的程序码代来决解错误。
15.反正屏切换时候的activity的命生周期:
答:
1) 新建一个activity,并把各个命生周期印打出来
2) 运行activity,到得如下信息:
onCreate()à
onStart()à
onResume()à
3) 按ctrl+F12切换成横屏时
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
4) 再按ctrl+f12切换成竖屏时,发明印打了两次同相的Log
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
5) 改修AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,行执步骤3
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
6) 改修AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,行执步骤4,发明不会再印打同相信息,但多印打了一行onConfigChanged
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onConfigurationChanged()à
7) 把步骤5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,行执步骤3,就只印打onConfigChanged
onConfigurationChanged()à
8) 把步骤5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,行执步骤4
onConfigurationChanged()à
onConfigurationChanged()à
总结:
1) 不置设activity的android:configChanges时,切屏会重新用调各个命生周期,切横屏时会行执一次,切竖屏时会行执两次。
2) 置设activity的android:configChanges=“orientation”时, 切屏会重新用调各个命生周期,切横屏、竖屏时都只会行执一次,但是竖屏最后多印打一条onConfigurationChanged()
3) 置设activity的android:configChanges=“orientation|keyboardHidden”时,切屏不会重新用调各个命生周期,只会行执onConfigurationChanged(),横屏一次,竖屏两次
再总结下整个activity的命生周期:
1) 以后activity发生件事弹出Toast和AlertDialog的时候Activity的命生周期不会有转变
2) Activity运行时按下HOME键(跟被完全覆盖一样的)
onSavaInstanceStateà
onPauseà
onStopà
onRestartà
onStartà
onResumeà
3) 未被完全覆盖,只是失去核心:
onPauseà
onResumeà
16.如何将SQLite据数库(.db文件)与apk文件一起发布?
答:可以将.db文件复制到Eclipse Android工程中的res aw目录中。全部在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将.db文件复制到res aw目录中
17.如何将打开res aw目录中的据数库文件?
答:在Android中不能直接打开res aw目录中的据数库文件,而要需在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该据数库文件。复制的基本法方是用使getResources().openRawResource法方获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的据数写入其他的目录中相应文件中。在Android SDK中可以用使SQLiteDatabase.openOrCreateDatabase法方来打开任意目录中的SQLite据数库文件。
18.android 中有哪几种解析xml的类?官方推荐哪种?以及它们的道理和区分:
答:XML解析主要有三种式方,SAX、DOM、PULL。常规在PC上发开我们用使Dom对相轻松些,但一些能性敏感的据数库或手机上还是主要用采SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性便方,但缺点就是对于套嵌多个分支说来处置不是很便方。而DOM式方会把整个XML文件加载到内存 中去,这里Android发开网提醒大家该法方在查找方面可以和XPath很好的结合如果据数量不是很大推荐用使,而PULL常经常使用在J2ME对于节点处 理较比好,相似SAX式方,同样很节俭内存,在J2ME中我们经经常使用使的KXML库来解析。
19.DDMS和TraceView的区分?
答:DDMS是一个程序行执查看器,在里头可以看见线程和堆栈等信息,TraceView是程序能性分析器
20.谈谈Android的IPC机制:
答:IPC是内部进程信通的简称,是共享"命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的停止交互,故在Android中该机制,只适用于Activity和Service之间的信通,相似于远程法方用调,相似于C/S模式的问访。通过义定AIDL接口文件来义定IPC接口。Servier端实现IPC接口,Client端用调IPC接口本地代理。
21.NDK是什么:
答:NDK是一系列工具的集合
NDK供给了一系列的工具,帮助发开者迅速的发开C/C++的动态库,并能动自将so和java应用打成apk包
NDK集成了交叉编译器,并供给了相应的mk文件和隔离cpu,平台等的差异,发开人员只要简略的改修mk文件就可以创立出so
22.描述一下android的系统构架:
答:android系统构架分从下往上为Linux内核层、运行库、应用程序框架层和应用程序层。
Linux内核层:担任硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
运行库和androidruntion:运行库:即c/c++函数库部份,大多数都是开放源码代的函数库,例如webkit,该函数库担任android网页浏览器的运行;例如标准的c函数库libc、openssl、sqlite等,当然也包括支持游戏发开的2dsgl和3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与表现,如mpeg4、h.264、mp3、aac、amr、jpg和png等浩繁的多媒体文件格式。Androidruntion担任解释和行执生成的dalvik格式的字节码
应用软件构架:java应用程序发开人员主要是用使该层封装好的api停止倏地发开的。
应用程序层:该层是java的应用程序层,android内置的googlemaps、email、IM、浏览器等,都处于该层,java发开人员工发的程序也处于该层,而且和内置的应用程序具有平等的地位,可以用调内置的应用程序,也可以替换内置的应用程序
23.Activity 与 Task的启动模式有哪些,它们含义详细是什么?
答:在一个activity中,有多次用调startActivity来启动另一个activity,要想只生成一个activity例实,可以置设启动模式。
一个activity有四种启动模式:standed,signleTop,singleTask,singleInstance
Standed:标准模式,一用调startActivity()法方就会发生一个新的例实。
SingleTop:如果经已有一个例实位于activity栈顶,就不发生新的例实,而只是用调activity中的newInstance()法方。如果不位于栈顶,会发生一个新的例实。
singleTask:会在一个新的task中发生这个例实,以后每次用调都会用使这个,不会去发生新的例实了。
SingleInstance:这个和singleTask基本一样,只有一个区分:在这个模式下的activity例实所处的task中,只能有这个activity例实,不能有其他例实
24.Application类的作用:
答:API里的第一句是:
Base class for those who need to maintain global application state
如果想在整个应用中用使全局变量,在java中一般是用使静态变量,public型类;而在android中如果用使这样的全局变量就不符合Android的框架构架,但是可以用使一种更优雅的式方就是用使Application context。
首先要需重写Application,主要重写里头的onCreate法方,就是创立的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量停止操纵了。
启动Application时,系统会创立一个PID,即进程ID,全部的Activity就会在此进程上运行。那么我们在Application创立的时候初始化全局变量,同一个应用的全部Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中转变了这些全局变量的值,那么在同一个应用的其他Activity中值就会转变
25.说明onSaveInstanceState() 和 onRestoreInstanceState()在什么时候被用调:
答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是命生周期法方,它们不同于 onCreate()、onPause()等命生周期法方,它们并不定一会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState()才会被用调。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被用调。因为在这类情况下,用户的行为决定了不要需保存Activity的态状。常通onSaveInstanceState()只适合用于保存一些临时性的态状,而onPause()适合用于据数的持久化保存。
另外,当屏幕的方向生发了转变, Activity会被摧毁并且被重新创立,如果你想在Activity被摧毁前缓存一些据数,并且在Activity被重新创立后恢复缓存的据数。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()法方。
26.android的service的命生周期?哪个法方可以多次被用调:
答:1)与用采Context.startService()法方启动服务有关的命生周期法方
onCreate() -> onStart() -> onDestroy()
onCreate()该法方在服务被创立时用调,该法方只会被用调一次,无论用调多少次startService()或bindService()法方,服务也只被创立一次。
onStart() 只用有采Context.startService()法方启动服务时才会回调该法方。该法方在服务开始运行时被用调。多次用调startService()法方尽管不会多次创立服务,但onStart() 法方会被多次用调。
onDestroy()该法方在服务被终止时用调。
2)与用采Context.bindService()法方启动服务有关的命生周期法方
onCreate() -> onBind() -> onUnbind() -> onDestroy()
onBind()只用有采Context.bindService()法方启动服务时才会回调该法方。该法方在用调者与服务绑定时被用调,当用调者与服务经已绑定,多次用调Context.bindService()法方并不会致使该法方被多次用调。
onUnbind()只用有采Context.bindService()法方启动服务时才会回调该法方。该法方在用调者与服务解除绑定时被用调。
如果先用采startService()法方启动服务,然后用调bindService()法方绑定到服务,再用调unbindService()法方解除绑定,最后用调bindService()法方再次绑定到服务,触发的命生周期法方如下:
onCreate() ->onStart() ->onBind() ->onUnbind()[重载后的法方需返回true] ->onRebind()
27.android的broadcast的命生周期:
答:1)Broadcast receiver命生周期中仅有一个回调法方:
void onReceive(Context curContext, Intent broadcastMsg)
当接收器接收到一条broadcast消息,Android就会用调onReceiver(),并传递给它一个Intent对象,这个对象携带着那条broadcast消息。我们以为仅当行执这个式方时,Broadcast receiver是活动的;这个法方返回时,它就终止了。这就是Broadcast receiver的命生周期。
2)由于Broadcast receiver的命生周期很短,一个带有活动的Broadcast receiver的进程是受保护的,以免避被干掉;但是别忘了有一点,Android会在任意时刻干掉那些携带不再活动的组件的进程,所以很可能会造成这个问题。
3)决解上述问题的方案用采一个Service来实现这项作工,Android会以为那个进程中(Service所在的进程)仍然有在活动的组件。
28.android view,surfaceview,glsurfaceview的区分:
答:SurfaceView是从View基类中派生出来的表现类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均用使SurfaceView
SurfaceView和View最本质的区分在于,surfaceView是在一个新起的独单线程中可以重新制绘画面而View必须在UI的主线程中更新画面。
那么在UI的主线程中更新画面 可能会发引问题,比如你更新画面的时光过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
当用使surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是件事同步。比如你触屏了一下,你要需surfaceView中thread处置,一般就要需有一个event queue的计划来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。
所以基于以上,根据游戏点特,一般分成两类。
1)被动更新画面的。比如棋类,这类用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接用使 invalidate。 因为这类情况下,这一次Touch和下一次的Touch要需的时光较比长些,不会发生影响。
2)主动更新。比如一个人在一直跑动。这就要需一个独单的thread不停的重绘人的态状,免避阻塞main UI thread。所以显然view不合适,要需surfaceView来控制。
文章结束给大家分享下程序员的一些笑话语录:
祝大家在以后的日子里. 男生象Oracle般健壮; 女生象win7般漂亮; 桃花运象IE中毒般频繁; 钱包如Gmail容量般壮大, 升职速度赶上微软打补丁 , 追女朋友像木马一样猖獗, 生活像重装电脑后一样幸福, 写程序敲代码和聊天一样有**。