Android专项面试训练题(一) - alex5211314

时间:2024-03-07 16:31:23

Android专项面试训练题(一)

1、下面不可以退出Activity的是?(D

A、finish()
B、抛异常强制退出
C、System.exit(0)
D、onStop()

解析:
A, finish() 方法就是退出activity
B. actiivity中出现抛异常,会弹出框,强制退出当前activity的。
C. System.exit(0); 这是退出所有activity使用的。
D. onStop() 只是activity一个周期方法,此时还没退出,只有走到onDestory()才退出
 
2、通过Intent传递一些二进制数据的方法有哪些? (C
    A、使用Serializable接口实现序列化,这是java常用的方法 
    B、实现Parcelable接口,这里Andriod的部分分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见
A、A
B、B
C、AB


3、下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是 (D
A、DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,不一定拥有一个独立 的Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念.
B、DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例.而每一个DVM不一定都是在Linux 中的一个进程,所以说不是一个概念.
C、DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例.而每一个DVM不一定都是在Linux 中的一个进程,所以说不是一个概念
D、DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念.
解析:
一句话:每一个DVM都是在Linux 中的一个进程! 选择D...
先来概念:

 我们来看看每个android进程如何产生的,

 下面来对Zygote进程孵化新进程的过程做进一步了解:
  1. Zygote进程调用fork()函数创建出Zygote\' 子进程,
  2. 子进程Zygote\' 共享父进程Zygote的代码区与连接信息。
    如下图所示,Fork()橙色箭头左边是Zygote进程,右边是创建出的Zygote‘子进程;然后Zygote’ 子进程将执行流程交给应用程序A,Android程序开始运行。
新生成的应用程序A会使用已有Zygote父进程的库与资源的连接信息,所以运行速度很快。

                   

       
   另外,对于上图,Zygote启动后,初始并运行DVM,而后将需要的类与资源加载到内存中。随后调用fork()创建出Zygote\' 子进程,接着子进程动态加载并运行应用程序A。
   运行的应用程序A会使用Zygote已经初始化并启动运行的DVM代码,通过使用已加载至内存中的类与资源来加快运行速度。
Android进程模型

Linux通过调用start_kernel函数来启动内核,当内核启动模块启动完成后,将启动用户空间的第一个进程——Init进程,下图为Android系统的进程模型图:



从上图可以看出,Linux内核在启动过程中,创建一个名为Kthreadd的内核进程,PID=2,用于创建内核空间的其他进程;同时创建第一个用户空间Init进程,该进程PID = 1,用于启动一些本地进程,比如Zygote进程,而Zygote进程也是一个专门用于孵化Java进程的本地进程,上图清晰地描述了整个Android系统的进程模型


4、使用Toast提示时,关于提示时长,下面说法正确的是( A ).
A、显示时长默认只有2种设置
B、可以自定义显示时长
C、传入30时,提示会显示30秒钟
D、当自定义显示时长时,比如传入30,程序会抛出异常
解析:
A.显示时长只有2种设置

Toast.makeText(this, str, Toast.LENGTH_LONG).show();

toast只能设置为 2s和3.5s ,其它的值都无效,API的文档虽然写的第三个参数是时间,但是Framework里作了重定义,限定了 2s和3.5s这两个值 ,对应 Toast.LENGTH_SHORT和Toast.LENGTH_LONG,实现方式在NotificationManagerService.java的scheduleTimeoutLocked()这个函数里。

Toast的默认显示时间有两个,分别为Toast.LENGTH_SHORT和Toast.LENGTH_LONG

5、Intent传递数据时,下列的数据类型不可以被传递的是( D
A、Serializable
B、File
C、Parcelable
D、Thread
解析:
Serializable :将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用ObjectInputStream 和 ObjectOutputStream 进行对象的读写。

   Parcelable  :

   android提供了一种新的类型:Parcel。本类被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以

外,只有实现了Parcelable接口的类才能被放入Parcel中。

是GOOGLE在安卓中实现的另一种序列化,功能和Serializable相似,主要是序列化的方式不同

 

Intent 传递的数据必须能够被序列化,凡是能被序列化的数据都能采用Intent传递


6、当 Activity 被消毁时,如何保存它原来的状态( A
A、实现 Activity 的 onSaveInstanceState()方法
B、实现 Activity 的 onSaveInstance()方法
C、实现 Activity 的 onInstanceState()方法
D、实现 Activity 的 onSaveState()方法
解析:
onSaveInstanceState() 
当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。


7、关于ServiceConnection接口的onServiceConnected()方法的触发条件描述正确的是?( B
A、bindService()方法执行成功后
B、bindService()方法执行成功同时onBind()方法返回非空IBinder对象
C、Service的onCreate()方法和onBind()方法执行成功后
D、Service的onCreate()和onStartCommand()方法启动成功后
解析:

  bindService是异步调用和Service进行绑定, 如果绑定成功, 则会调用ServiceConnection的onServiceConnected

  当调用bindService方法后就会回调Activity的onServiceConnected,在这个方法中会向Activity中传递一个IBinder的实例,Acitity需要保存这个实例

 

  8、Android系统对下列哪些对象提供了资源池 ( AC )

A、Message
B、Thread
C、AsyncTask
D、Looper
解析:
A.Message提供了消息池,有静态方法Obtain从消息池中取对象;
B.Thread默认不提供资源池,除非使用线程池ThreadPool管理;
C.AsynTask是线程池改造的,池里 默认提供(核数+1)个线程进行并发操作,最大支持(核数  * 2 + 1)个线程,超过后会丢弃其他任务;
D.Looper,每个Looper创建时创建一个消息队列和线程对象,也不是资源池;
因此答案为AC

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

10、下面是属于GLSurFaceView特性的是?( ABC
A、管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
B、管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
C、让渲染器在独立的线程里运作,和UI线程分离。
D、可以直接从内存或者DMA等硬件接口取得图像数据
解析:

一个GLSurfaceView类 , 具有以下特点 :

1.管理一个平面, 这个平面是一个特殊的内存块 , 它可以和 android 视图系统混合 .

2.管理一个EGL 显示 , 它能够让 OpenGL 渲染到一个平面 .

3.接受一个用户提供的实际显示的Renderer 对象 .

4.使用一个专用线程去渲染从而和UI 线程解耦 .

5.支持on-demand  和连续的渲染.

6.可选的包, 追踪 和 / 或者错误检查这个渲染器的 OpenGL 调用 .