安卓面试问题会出现什么?

这是一篇关于安卓面试问题的文章。让我们来看看吧!

1.Android DVM的流程和Linux的流程以及应用的流程是一样的吗?

答:dvm是dalivk虚拟机。每个android应用程序都在自己的进程中运行,并且有一个dalivk虚拟机实例。每个dvm都是linux中的一个进程。所以可以认为是同一个概念。

2.2.android有哪些种类的动画?它们的特点和区别是什么?

答:有两种,一种是补间动画,一种是帧动画。补间动画,可以使视图组件移动、放大或缩小并产生透明度变化。帧动画是一种传统的动画制作方法,通过顺序播放排列好的画面来实现,类似于电影。

3.3 .处理器系统的原理:

回答:android提供了handler和looper来满足线程间的通信。处理程序先进先出原则。Looper用于管理特定线程内对象之间的消息交换。

1)looper:一个线程可以生成一个looper对象,管理这个线程中的消息队列。

2)handler:可以构造一个handler对象与looper进行通信,以便将新消息推送到messagequeue或者接收looper发送的消息(取自messagequeue)。

3)messagequeue:用于存储线程放入的消息。

4)线程:UI线程通常是主线程,android启动程序时会创建一个消息队列。

4.4.android视图的刷新:

答:Android中更新View的方式有很多种,使用时要区分不同的应用。我觉得最重要的是区分多线程和双缓冲。

1).不要使用多线程和双缓冲。

这种情况最简单。通常,您只想在视图改变时重绘UI。只需要在活动中的视图对象中显式调用invalidate()方法即可。系统会自动调用视图的onDraw()方法。

2).使用多线程而不使用双缓冲。

这种情况下需要启动一个新的线程,新打开的线程不容易访问视图对象。将会报告强制访问:Android . view . view root $ calledfromrownerthread异常:只有创建了视图层次结构的原始线程才能接触其视图。

这时需要创建一个继承android.os.Handler的子类,重写handleMessage(Messagemsg)方法。Android.os.Handler可以发送和处理消息。你需要发送一个消息来更新活动中的UI,然后在你的处理程序中处理这个消息(可以使用匿名内部类)(因为匿名内部类可以访问父类变量,所以可以直接调用View对象中的invalidate()方法)。也就是说:在新线程中创建和发送消息,然后在主线程中捕获和处理消息。

3).使用多线程和双缓冲。

Android中的SurfaceView是View的子类,也实现了双缓冲。您可以定义她的子类并实现SurfaceHolder。回调接口。因为SurfaceHolder的实现。回调接口,新线程不需要android.os.Handler的帮助,SurfaceHolder中的lockCanvas()方法可以锁定画布,方便绘制新图像后调用unlockCanvasAndPost(canvas)解锁(显示)。

5.谈谈mvc模式的原理及其在android中的应用:

答:android的官方建议是应用程序的开发应该采用mvc模式。什么是mvc?

Mvc是模型、视图和控制器的缩写。mvc由三部分组成:

l模型对象:是应用的主体部分,所有的业务逻辑都要写在这一层。

2视图对象:它是应用程序中负责生成用户界面的部分。也是整个mvc架构中用户唯一能看到的一层,接收用户的输入,显示处理结果。

3控制对象:是控制用户界面数据显示,并根据用户输入更新模型对象状态的部分。是控制器更重要的导航功能,用户想离开的相关事件交给M处理。

Android鼓励弱耦合和组件重用。mvc在android中的具体体现如下:

1)视图层:一般用xml文件来描述界面,使用时很容易引入。当然,如果你对android比较了解,肯定可以想到用javascript+html作为android中的视图层。当然,这里需要java和javascript之间的通信。幸运的是,android为他们之间提供了非常方便的沟通。

2)控制器:android控制层的重新任命通常落在很多Acitivities的肩上。这句话也暗示了你不应该在Acitivities中写代码,而应该通过acitvity交付模型业务逻辑层来处理。还有一个原因是Android中Acitiveness的响应时间是5s,如果把耗时的操作放在这里,程序很容易被回收。

3)模型层:数据库和网络上的操作应该在模型中处理。当然,业务计算等操作也必须放在这一层。

6.6的生命周期。活动:

回答:onCreate:在这里创建一个接口,做一些数据初始化工作。

OnStart:在这一点上,它变得对用户可见并且不可交互。

OnResume:变得与用户交互,(在以栈管理这些活动的活动栈系统的顶层,运行弹出栈后,会返回到上一个活动)。

OnPause:这一步可见但不交互,系统会停止动画等消耗CPU的东西。从上面的描述中你知道,你应该在这里保存一些你的数据,因为这个时候,你的程序的优先级降低了,有可能被系统撤回。这里保存的数据应该在

Onstop:变得不可见,并被下一个活动覆盖。

OnDestroy:这是activity被终止之前最后调用的方法。可能是调用了finish方法的外部类或者系统为了节省空间临时杀了它。

7.将活动变成一扇窗户:

答:活动属性设置:有时候一个应用会浮在手机主界面上。这个只需要设置Activity的主题theme,就是在Manifest.xml中定义Activity的地方加一句话:

Android:Theme = " @ Android:style/主题。对话框"

如果是半透明效果:

Android:Theme = " @ Android:style/主题。半透明”

8.8常用的五种布局。安卓系统:

A: LinearLayout线性布局;AbsoluteLayout绝对布局;TableLayout表格布局;RelativeLayout框架布局框架布局;

9.9的五种数据存储方法。安卓系统:

答:sharedPreferences文件;SQLite内容提供者;网络

10.请解释单线程模型中消息、处理程序、消息队列和循环之间的关系:

回答:Handler获取当前线程中的looper对象。looper用于从存储消息的消息队列中取出消息,然后Handler分发并处理消息。

11的全称是什么?AIDL?如何工作?你能处理什么类型的数据?

回答:AIDL (Android界面定义语言)是Android界面描述语言。

12.系统上安装了多种浏览器。能否指定浏览器访问指定页面?请解释原因:

答:通过直接发送Uri或者通过manifest中intentfilter的data属性来带来参数。代码如下:

Intent Intent = new Intent();

intent . set action(" Android . intent . action . view ");

uri uri browsers = uri . parse(" ");

intent . setdata(uri browsers);

//包名,要打开的活动

intent . set class name(" com . Android . browser "," com . Android . browser . browser activity ");

startActivity(意图);

13.什么是ANR,如何避免它?

答:ANR的定义:

在android上,如果你的应用有一段时间没有响应,系统会提示用户一个“ANR:应用没有响应”的对话框。因此,在程序中设计响应性能非常重要,这样系统就不会向用户显示ANR。

如何避免:

首先,让我们研究一下为什么它会发生在android应用程序中,以及如何最好地构建应用程序来避免ANR。

Android应用程序通常运行在一个单独的线程中(例如main),这意味着如果你的应用程序在主线程中花费了很长时间,它将触发ANR对话框,因为你的应用程序没有给自己一个处理输入事件或意图广播的机会。

因此,在主进程中运行的任何访问都应该尽可能少。特别是,activity应该在其关键的生命周期方法(onCreate()和onResume())中尽可能少地执行创建操作。潜在的耗时操作,如网络或数据库操作,或高耗时计算,如更改位图大小,应在子线程中完成(或在数据库操作的情况下,通过异步请求)。然而,并不是你的主线程一直在等待子线程完成——也不是你调用Thread.wait()或Thread.sleep()。相反,主线程应该为子线程提供一个处理程序,这样当它完成时就可以提交给主线程。以这种方式设计您的应用程序将确保您的主线程保持对输入的响应,并避免由5秒钟输入事件超时触发的ANR对话框。显示UI的其他线程也应该遵循这种做法,因为它们都受到相同超时的影响。

IntentReceiver执行时间的特殊限制意味着它应该在后台做一些小而琐碎的工作,比如保存设置或者注册一个通知。与主线程中调用的其他方法一样,应用程序应该避免在BroadcastReceiver中执行耗时的操作或计算,但不应该在子线程中执行这些任务(因为BroadcastReceiver的生命周期很短)。相反,如果有必要执行耗时的动作来响应意图广播,则应用程序应该启动服务。顺便说一下,你也应该避免在Intent Receiver中启动一个活动,因为它会创建一个新的屏幕,并从当前用户正在运行的程序中获取焦点。如果您的应用程序需要向用户显示一些内容以响应意图广播,您应该使用通知管理器来实现。

一般来说,在一个应用中,100到200ms是用户感知阻塞的时间阈值。这里有一些技巧来避免ANR,并帮助您的应用程序看起来响应迅速。

如果您的应用程序在后台工作以响应用户输入,您可以显示工作的进度(ProgressBar和ProgressDialog在这种情况下很有用)。特别是在游戏中,移动计算是在子线程中进行的。如果您的程序有一个耗时的初始化过程,请考虑显示一个闪屏或快速显示主屏幕并异步填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为程序被冻结了。

14.什么会导致强制关闭?如何避免?您能捕捉到导致它的异常吗?

答:空指针会导致ForceClose可以查看Logcat,找到相应的程序代码来解决错误。

15.屏幕水平和垂直切换时活动的生命周期:

答:

1)创建一个新的活动,并打印出每个生命周期。

2)运行“活动”以获取以下信息:

onCreate()à

onStart()à

onResume()à

3)按ctrl+F12切换到横向屏幕。

onSaveInstanceState()à

onPause()

onStop()

onDestroy()

onCreate()à

onStart()à

onRestoreInstanceState()

onResume()à

4)再次按ctrl+f12切换到纵向屏幕,同样的日志打印两次。

onSaveInstanceState()à

onPause()

onStop()

onDestroyà

onCreate()à

onStart()à

onRestoreInstanceState()

onResume()à

onSaveInstanceState()à

onPause()

onStop()

onDestroyà

onCreate()à

onStart()à

onRestoreInstanceState()

onResume()à

5)修改AndroidManifest.xml,将此活动添加到Android:config changes = " orientation ",执行步骤3。

onSaveInstanceState()à

onPause()

onStop()

onDestroy()

onCreate()à

onStart()à

onRestoreInstanceState()

onResume()à

6)修改AndroidManifest.xml,将此活动添加到Android:config changes = " orientation ",执行步骤4。发现不会再打印同样的信息,而是多打印了一行onConfigChanged。

onSaveInstanceState()à

onPause()

onStop()

onDestroy()

onCreate()à

onStart()à

onRestoreInstanceState()

onResume()à

onConfigurationChanged()à

7)将步骤5中的Android:config changes = " orientation "更改为

Android:config changes = " Orientation | Keyborad Hidden ",执行步骤3,只打印onConfigChanged。

onConfigurationChanged()à

8)将步骤5中的Android:config changes = " orientation "更改为

Android:config changes = " orientation | focused hidden ",执行步骤4。

onConfigurationChanged()à

onConfigurationChanged()à

总结:

1)未设置Android:config changes of activity时,截屏时会召回生命周期,横截屏时召回一次,竖截屏时召回两次。

2)当设置了activity的Android:config changes = " Orientation "时,切屏会召回每个生命周期,在横竖切屏的时候只会执行一次,但是竖屏的最后会打印一个onConfigurationChanged()。

3)设置activity的Android:config changes = " Orientation | Keyboard Hidden "时,截屏不会调用每个生命周期,只会执行onConfigurationChanged(),一个横屏两个竖屏。

然后总结活动的整个生命周期:

1)当前活动生成事件弹出Toast和AlertDialog时,活动的生命周期不会改变。

2)活动运行时按HOME键(就像被完全覆盖一样)

onSavaInstanceStateà

onPauseà

翁斯托帕

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中,可以使用SQLite数据库。openorcreatedatabase方法打开任意目录下的SQLite数据库文件。

18.Android中有哪些种类的xml解析类?官方推荐哪种?以及它们的原理和区别:

答:解析XML主要有三种方式,SAX、DOM和PULL。我们在常规的PC开发中使用Dom相对容易,但是一些性能敏感的数据库或者手机仍然使用SAX square。SAX读取是单向的,优点是不占用内存空间,方便分析属性,缺点是不太方便嵌入多个分支。DOM方法将把整个XML文件加载到内存中。在这里,安卓开发网提醒大家,这种方法在搜索中可以很好的与XPath结合。如果数据量不是很大的话,建议使用,J2ME常用PULL来更好的处理节点,类似于SAX的方法,同样节省内存。在J2ME,我们经常使用KXML库来分析。

19有什么区别。DDMS和特雷西维?

回答:DDMS是程序执行查看器,在里面可以看到线程、堆栈等信息,TraceView是程序性能分析器。

20.说说Android的IPC机制:

答:IPC是内部进程通信的缩写,是* * *享有“命名管道”的资源。Android中的IPC机制是允许活动和服务随时交互的,所以在Android中,这个机制只适用于活动和服务之间的通信,类似于远程方法调用和C/S模式访问。通过定义AIDL接口文件来定义IPC接口。服务端实现IPC接口,客户端调用IPC接口的本地代理。

什么是21。NDK?

答:NDK是工具的集合。

NDK提供了一系列工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用做成apk包。

NDK集成了交叉编译器,并提供了相应的mk文件,隔离了cpu和平台的差异。开发人员可以通过修改mk文件来创建。

22.描述android的系统架构:

答:android系统架构自下而上分为Linux内核层、运行时层、应用框架层、应用层。

Linux内核层:负责硬件驱动、网络、电源、系统安全和内存管理。

Runtime和androidruntion:即c/c++函数库,大部分是开源函数库,比如webkit,负责android web浏览器的运行;比如标准的C库libc,openssl,sqlite等。,当然也包括支持游戏开发的2dsgl和3D 3dopengles。在多媒体方面,有一个mediaframework框架来支持各种视听和图形文件的回放和显示,如mpeg4-4、h.264、mp3、aac、amr、jpg和png。Androidruntion负责解释和执行生成的dalvik格式的字节码。

应用软件架构:java应用开发者主要利用封装在这一层的api进行快速开发。

应用层:这一层是java的应用层。android内置的googlemaps、email、IM、浏览器都在这一层,java开发者发布的程序也在这一层,与内置的应用具有平等的地位。他们可以调用内置应用程序或替换内置应用程序。