7-3日试题整理

Android专项练习

1.下面关于android dvm的进程和Linux的进程,应用程序的进程说法正确的是?

  • DVM指dalivk的虚拟机,每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalivk虚拟机实例,而每一个DVM不一定都是在Linux中的一个进程,所以说不是一个概念
  • DVM指dalivk的虚拟机,每一个Android应用系统程序都在它自己的进程中运行,不一定拥有一个独立的Dalivk虚拟机实例,而每一个DVM都是在Linux中的一个进程,所以说是一个概念
  • DVM指dalivk的虚拟机,每一个Android应用系统程序都在它自己的进程中运行,不一定拥有一个独立的Dalivk虚拟机实例,而每一个DVM不一定都是在Linux中的一个进程,所以说不是一个概念
  • DVM指dalivk的虚拟机,每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalivk虚拟机实例,而每一个DVM都是在Linux中的一个进程,所以说是一个概念

解析:Android系统用的就是Linux的内核,DVM可以理解成在Linux上跑的程序,每个应用程序运行时,都会启动一个DVM实例,也就是一个Linux的进程,因此DVM进程和Linux进程实际上是一回事


2.下面属于Android的动画分类的有?(Android3.0之前)

  • Tween
  • Frame
  • Draw
  • Animation

Android的动画分为三种:

  • 帧动画:也就是Frame动画。Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制类似,它的原理是在一定的时间段内切换多张有细微差别的图片从而达到动画的效果。由于是一帧一帧的加载,所以需要较多的图片。从而增大APK的大小,不过Frame动画可以实现一些比较难的效果,例如:等待的环形进度。涉及的Java对象:AnimationDrawable.
  • 补间动画:也就是Tween动画,是操作某一个控件让其展现出旋转,渐变,缩放的一种转换过程,是一种视觉上的变化,不是真正位置上的变化。只能用在View对象上,且功能较为局限。因此,补间动画通常用于执行比较简单的动画。涉及的Java对象有:AlphaAnimation(渐变动画),ScaleAnimation(缩放动画),TranslateAnimation(位移动画),RotateAnimation(旋转动画)
  • 属性动画:Android3.0之后推出的,其机制不再是针对View来设计的,也不限于只能实现移动,缩放,旋转和淡入淡出这几种简单的动画操作,同时也不再只是一种视觉上的动画效果。属性动画实际上是一种在一定时间段内不断修改某个对象的某个属性值的机制。

3.前台进程是Android系统中最重要的进程,在Android系统中包含哪些情况?

  • Activity正在与用户进行交互
  • 进程服务正在执行声明中的回调函数
  • 进程的BroadcastReceiver在执行onReceiver()函数
  • 当一个Activity被部分遮挡时

解析:
1.前台进程:
用户当前操作所必需的进程,如果一个进程满足一下任一条件,即视为前台进程:

  1. 托管用户正在交互的Activity(已调用Activity的onResume()方法)
  2. 托管某个Service,后者绑定到用户正在交互的Activity
  3. 托管正在“前台”运行的Service(服务已调用stateForeground())
  4. 托管正执行一个生命周期回调的Service(onCreate(),onStart()或onDestroy())
  5. 托管正执行其onReceiver()方法的BroadcastReceiver

通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应。

2.可见进程:
没有任何前台组件,但仍会影响用户在屏幕上所见内容的进程。如果一个进程满足以下任一条件,即可视为可见进程:

  1. 托管不在前台,但仍对用户可见的Activity(已调用其onPause()方法)。例如,如果前台Activity启动了一个对话框,允许在其后显示上一个Activity,则有可能会发生这种情况。
  2. 托管绑定到可见(或前台)Activity的Service

可见进程被视为是及其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。

3.服务进程:
正在运行已使用startService()方法启动的服务且不属于上述两个更高类别进程的进程。尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如:在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。

4.后台进程:
包含目前对用户不可见的Activity进程(已调用Activity的onStop()方法)。这些进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程,可见进程,或服务进程使用。通常会有很多后台进程在运行,因此它们会保存在LRU(最近最少使用)列表中,以确保包含用户最近查看的Activity的进程最后一个被终止。如果某个Activity正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该Activity时,Activity会恢复其所有可见状态。有关保存和恢复状态的信息,请看Activity文档。

5.空进程:
不含任何活动应用组件的进程。保留这种进程的唯一目的是用作缓存,以缩短下次在其中运行组件所需要的启动时间。为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。


4.关于startActivityForResult()方法,如果是A跳转B,B的launchMode属性为singleInstance,A的onActivityResult()回调方法会在什么时候调用呢?

  • B被启动的时候即调用
  • B返回的时候调用
  • 下一次A启动的时候调用
  • 不会被调用

解析:
这道题A和B有争议!我认为是A,答案为B。
启动B的时候立马回调result方法,当launchMode为singleTask或singleInstance时候都这样。只要被启动的activity设置为singleInstance则startActivityForResult不起效。
不同task之间,不能传递数据。


5.Android的自动恢复功能能够完成?

  • 恢复地址簿
  • 修复丢失的文字信息
  • 恢复删除的信息
  • 恢复备份设置和数据来重新安装程序

解析:Android2.2以后的备份服务功能允许用户备份应用数据到云存储中,即当应用执行了工厂服务或转换到一个新的平台上时,如果备份的应用需要重新安装,系统就自动恢复原先备份的数据并重新安装。


6.为满足线程间通信,Android提供了?

  • Handler和Looper
  • Handler
  • Message Queue
  • Looper

解析:
Android提供了Handler和Looper来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)
Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)
Handler:你可以构造Handler对象来与Looper沟通,以便Push新消息到MessageQueue里;或者接收Looper从Message Queue所送来的消息
Message Queue(消息队列):用来存放线程放入的消息
线程:UIThread 通常就是main thread,而Android启动程序时会替他建立一个MessageQueue。
这里写图片描述


7.通过Intent传递一些二进制数据的方法有哪些?

  • 使用Serializable接口实现序列化,这是Java常用的方法
  • 实现Parcelable接口,这里Android的部分分类比如Bitmap类就已经实现了,同时Parcel able在Android AIDL中交换数据也很常见
  • 以上都对

解析:
Android中实现序列化有两个选择:

  1. 实现Serializable接口(是JavaSE本身就支持的)
  2. 实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可用于进程间通信(IPC))。

实现Serializable接口非常简单,声明一下就可以;而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
注:Android中Intent传递对象有两种方法:

  1. Bundle.putSerializable(key,Object)
  2. Bundle.putParcelable(key,Object)

当然这些Object是有一定条件的,前者实现了Serializable接口,而后者实现了Parcelable接口。
Serializable本身就是Java特有的序列化接口。而Parcelable是Android才有的,之所以Android还要弄出Parcelable而不直接用Serializable,就是因为Parcelable更加高效,但比起Serializable在写法上要复杂一些。


8.在Android应用程序开发中,可以通过()获取屏幕的属性,从而取得屏幕的高度和宽度

  • getMetrics
  • getDisplay
  • getScreen
  • getWindows

解析:
获取屏幕密度 :getScreen
获取设备屏幕大小:getDisplay
获取屏幕属性,从而取得屏幕的高度和宽度:getMetrics
获取window对象:getWindows


9.Android DVM的进程和Linux的进程,应用程序的进程是否为同一概念

  • 不是

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

Dalvik是Google公司自己设计用于Android平台的Java虚拟机,每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机奔溃的时候所有程序都被关闭。

Dalvik和Java运行环境的区别:

  1. Dalvik主要是完成对象生命周期管理。堆栈管理,线程管理,安全和异常管理,以及垃圾回收等重要功能。
  2. Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
  3. 不同于Java虚拟机运行Java字节码,Dalvik虚拟机运行的是其专有的文件格式DEX
  4. dex文件格式可以减少整体文件尺寸,提高I/O操作的类查找速度。
  5. odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化
  6. 所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制
  7. 有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。

10.Android中MVC模式C层指的是?

  • Activity
  • Services
  • Content
  • Intent

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

  1. 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。当然,如果你对Android了解的比较多了的话,就一定可以想到在Android中也可以使用JavaScript+HTML等的方式作为View层,当然这里需要进行Java和JavaScript之间的通信,幸运的是Android提供了它们之间非常方便的通信方式
  2. 控制层(Controller):Android的控制层的重任通常落在了众多的Activity的肩上,这句话也就暗含了不要再Activity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Activity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
  3. 模型层(Model):对数据库的操作,对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在该层的。就是应用程序中二进制的数据
    在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。比如显示Cursor中所有数据的ListActivity,其视图就是一个ListView,将数据封装为ListAdaoter,并传递给ListView,数据就在ListView中实现。

猜你喜欢

转载自blog.csdn.net/adonis044/article/details/80893707
7-3