第一篇:Android面试题总结
Android面试题总结
1.简述Activity的生命周期?
1)Activity的生命周期通过7个生命周期方法onCreate(),onRestart(), onStart(), onResume(), onPause(),onStop(),onDestroy()来体现。2)其中6个生命周期方法是成对对应起来的,哪里创建的对象,一般应该在其对应的方法中销毁。
onCreate()--onDestroy()onStart()--onStop()onResume()--onPause()3)当程序启动之后,第一个Activity经过的生命周期方法是:onCreate()→onStart()→ onResume()方法,当第一个Activity A启动第二个Activity B的时候(备注:第二个Activity完全遮盖住第一个Activity,并且这个过程中没有出现点击Home键,或者第一个Activity被杀死等异常情况,并且两个Activity的启动模式是标准模式),这两个Activity经历的生命周期方法是:
A onPause()→ B onCreate()→ B onStart()→ B onResume()→ A onStop()→(此时Activity A已经在回退栈的最低端,Activity B已经在Activity A的上面,在回退栈的最顶端)当通过点击后退键退出Activity B的时候:
(此时Activity B 弹出回退栈)→ B onPause()→ A onRestart()→ A onStart()→ A onResume()→ B onStop()→ B onDestroy()此时B 被销毁
2.简述Service的生命周期?
1).如果在Activity中通过调用startService()方法启动一个Service的话,那么生命周期是:
onCreate()→ onStartCommand()→ 运行中 →(如果自己或者客户端(如Activity)调用了stop Service的方法的话)→ onDestroy()2).如果在Activity中通过调用bindService()方法启动一个Service的话,那么生命周期是:
onCreate()→ onBind()→ 运行中 →(如果有客户端(Activity)调用了unBindService()方法与Service解除绑定时)→ onUnbind()→ onDestroy()3.有几种控件布局的方式?
1)RelativeLayout:相对布局,可以根据相对位置来调整控件的位置。推荐使用相对布局,更利于屏幕的自适应。2)LinearLayout:线性布局,控件之间的水平排列或者垂直排列。但是如果要想构建复杂布局,要进行多层的LinearLayout布局嵌套,但是这样会运行布局载入效率。
3)FrameLayout:帧布局,控件与控件之间处于上下叠加的状态。
备注:还有两个已经不怎么用的布局:TableLayout:表格布局 AbsoluteLayout 绝对布局。
布局实现方式有两种:xml文件静态实现,代码动态实现。
一般xml文件中可以实现布局控制的话,就不建议放在代码中实现布局控制,因为在xml文件中实现布局控制,可以做到布局与代码分离。4.有几种数据存储方式,分别是什么? 1)SQLite数据库存储结构化数据。
2)文件存储:分为内部存储和外部存储(SD卡)两种存储方式。3)SharedPreferences共享参数,键值对形式存储。4)网络存储。
5.IntentService与Service有什么区别? IntentService是Service的子类
1)Service如果要处理异步请求(如耗时操作)的话,需要自己启动一个worker thread,如果启动多个worker thread来处理相关事务的话,各线程之间无法很好的控制。而IntentService可以将多个异步请求的Intent放入队列中,封装了一个开启worker thread的onHandleIntent()方法,来依次处理放入队列中的Intent,只有一个worker thread在运行,同一时刻只有一个Intent被处理,当一个Intent处理完了之后才会处理另外一个Intent。
2)Service可以通过startService()或者bindService()方法来启动,而IntentService则是通过startService()方法来启动。3)Service适合多线程处理异步请求。而IntentService则适合处理需要排队的请求。
6.StartService与bindService之间的区别?
1)StartService启动了Service之后无法与Activity之间进行通信,与现有的Activity分离,即使Activity被杀掉了之后,Service还可以运行,同时通过设置Service的粘性,还可以让Service被杀掉之后,可以自启动。而bindService启动Service之后,与绑定的Activity之间有关系,可以依据Server/Client模式来进行通信(binder客户端主动请求模式,或者通过信使),但是无法设置Serrvice的粘性。2)StartService启动的Service,Activity中可以调用stopService()方法来结束一个Service,或者通过Service自己调用stopSelf()方法来结束Service。而bindService只能通过Activity()来调用unbindService()方法来结束Service,Service会调用onUnBind()方法,以及onDestroy()方法。
7.ArrayAdapter BaseAdapter CursorAdapter的区别?
ArrayAdpter CursorAdapter都是BaseAdapter的子类。都是用来填充那些含有item的控件。
1)主要区别是数据来源不同。ArrayAdapter数据来源是Object数组,CursorAdapter数据来源是数据库的Cursor,而BaseAdapter适合创建复杂自定义的item内容,通过继承BaseAdapter类,重写相关方法来实现。
8.Handler与Looper之间的关系? 1)Handler和Looper的关系就好比,坐地铁过安检时候:每一个人可以理解为一个Handler,一个人的一个或者多个东西看做Message而循环滚动的检查台装置可以看做是Looper,而要检查的东西排成队列可以理解为MessageQueue消息队列。
2)Looper是Handler和MessageQuene之间的桥梁,Looper将Handler发送过的消息放入MessageQueue,同时Looper也将MessageQueue中的Message发送给Handler来处理。
9.res文件夹与assets文件夹有什么区别? 1)res文件夹中的资源在会在R.java文件中生成ID,代码中可以直接通过R.id的形式来访问。而assets文件夹中的资源不会在R.java文件中生成ID,需要通过AssetsManager通过IO流的方式来访问。
2)res文件夹中的文件会被压缩,而assets文件中的文件不会被压缩。
3)Res不能自定义目录名,不支持多层目录。而assets支持自定义目录名,支持多层目录。
10.广播接收器有几种注册方式,分别是什么?
1)动态注册:在代码中注册,创建一个IntentFilter(意图过滤器)对象,设置想要就收的广播,在onCreate()方法中通过调用registerReceiver()方法来注册广播接收器,在onDestroy()方法中通过调用unregisterReceiver()方法来注销广播接收器。2)静态注册:在AndroidManifest.xml文件中注册,
第二篇:android面试题
选择题(包括多选)
1.下列哪些语句关于内存回收的说明是正确的?
A、程序员必须创建一个线程来释放内存
B、内存回收程序负责释放无用内存
C、内存回收程序允许程序员直接释放内存
D、内存回收程序可以在指定的时间释放内存对象
2.下面异常是属于Runtime Exception 的是
A、ArithmeticException
B、IllegalArgumentException
C、NullPointerException
D、BufferUnderflowException
3.Math.round(-11.5)等于多少
A、11 ,-11
B、11 ,-12
C、12 ,-11
D、12 ,-1
24.下列程序段的输出结果是:
void complicatedexpression_r(){
int x=20, y=30;
boolean b;
b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;
System.out.println(b);
}
A、true
B、false
C、1
D、011.activity
5.对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行
A、onPause()
B、onCreate()
C、onResume()
D、onStart()
6.Intent传递数据时,下列的数据类型哪些可以被传递
A、Serializable
B、charsequence
C、Parcelable
D、Bundle
7.android 中下列属于Intent的作用的是
A、实现应用程序间的数据共享
B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失
C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带
D、处理一个应用程序整体性的工作
8.下列属于SAX解析xml文件的优点的是
A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能
B、不用事先调入整个文档,占用资源少
C、整个文档调入内存,浪费时间和空间
D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会
消失
9.在android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库版本进行管理的方法可以是()
A、getWriteableDatabase()
B、getReadableDatabase()
C、getDatabase()
D、getAbleDatabase()
10.android 关于service生命周期的onCreate()和onStart()说法正确的是
A、当第一次启动的时候先后调用onCreate()和onStart()方法
B、当第一次启动的时候只会调用onCreate()方法
C、如果service已经启动,将先后调用onCreate()和onStart()方法
D、如果service已经启动,只会执行onStart()方法,不在执行onCreate()方法
11.下面是属于GLSurFaceView特性的是
A、管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
B、管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
C、让渲染器在独立的线程里运作,和UI线程分离。
D、可以直接从内存或者DMA等硬件接口取得图像数据
12.下面在AndroidManifest.xml文件中注册BroadcastReceiver方式正确的A、
android:name=“android.provider.action.NewBroad”/> B、 android:name=“android.provider.action.NewBroad”/> C、 android:name=“android.provider.action.NewBroad”/> D、 android:name=“android.provider.action.NewBroad”/> 13.关于ContenValues类说法正确的是 A、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值都是基本类型 B、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是任意类型,而值都是基本类型 C、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名,可以为空,而值都是String类型 D、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值也是String类型 14.我们都知道Hanlder是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会变得越慢,那么线程销毁的方法是 A、onDestroy() B、onClear() C、onFinish() D、onStop() 15.下面退出Activity错误的方法是 A、finish() B、抛异常强制退出 C、System.exit() D、onStop() 16.下面属于android的动画分类的有 A、Tween B、Frame C、Draw D、Animation 17.下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是 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中的一个进程,所以说可以认为是同一个概念.18.Android项目工程下面的assets目录的作用是什么 A、放置应用到的图片资源。 B、主要放置多媒体等数据文件 C、放置字符串,颜色,数组等常量数据 D、放置一些与UI相应的布局文件,都是xml文件 19.关于res/raw目录说法正确的是 A、这里的文件是原封不动的存储到设备上不会转换为二进制的格式 B、这里的文件是原封不动的存储到设备上会转换为二进制的格式 C、这里的文件最终以二进制的格式存储到指定的包中 D、这里的文件最终不会以二进制的格式存储到指定的包中 20.下列对android NDK的理解正确的是 A、NDK是一系列工具的集合B、NDK 提供了一份稳定、功能有限的 API 头文件声明。 C、使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式 D、NDK 将是 Android平台支持 C 开发的开端 问答题: 1.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。 2.Activity和Task的启动模式有哪些? 每种含义是什么? 3.SQLite支持事务吗? 添加删除如何提高性能? 4.对Intent、Activity、广播、Service等的理解 5、handler机制的原理 一.Java的问题 1.回调函数是?有什么用?好处是?一般什么时候用?手写个例子代码。 2.Java抽象类是什么?你怎么理解抽象类?为什么要有抽象类?好处,坏处。3.Public,protected,private,默认 这四个修饰符的区别和范围。4.Java中泛型的概念,如何实现的? 5.Switch中支持的类型(注意string和long)6.内部类有几种?它们的区别。 7.设计模式(单例模式,工场方法模式等,它们的优缺点)8.GC机制,垃圾的清除算法 9.创建线程的几种方式 10.多线程的同步问题 11.写一下socket通信的大致代码 12.单线程和多线程处理哪个好(分单cup和多cpu)13.虚拟内存的概念,内存置换算法 14.强连接,软连接,弱连接,虚连接的概念和使用举例 15.Android开发如何进行算法和界面的优化 16.为什么内部类可以直接访问外边类的成员 17.外部类可以直接访问内部类的成员吗?(不能)为什么?那应该怎样实现访问 18.Hashmap内部是怎么实现的,他的动态内存大小怎么变,和hashtable的区别与联系? 19.Hashmap同步吗?如何实现同步。20.线程之间如何实现通信 21.线程和进程的区别,线程有自己的栈和存储机制吗? 22.Threadlocal知道吗?作用 23.Jvm和dvm的区别与联系 24.线程池,消息池,常量池的概念 25.栈和堆的区别 26.Hashmap的遍历方式有几种,各种的区别,手写下例子代码 27.Java支持中文吗? 28.Volatile的作用,是否可靠它实现同步安全? 29.如何实现同步 30.Android的动画实现有哪几种方式,区别 31.Java中继承有哪些特征 32.抽象类和接口的区别 33.Exception的概念,运行时,非运行时的区别 34.Java中一次跳出多个循环的方式 35.死锁的概念和必要条件,解决方法 36.Tcp和udp的区别 37.Tap的3次握手过程,大概画一画 38.内部碎片与外部碎片的概念和区别 39.反射机制 40.C++与java的区别 二.Android的问题 41.android中内存泄露是?产生原因?解决方法? 42.Android中内存溢出是?产生原因?解决方法?它和内存泄露有什么区别? 43.Activity的生命周期,三种状态 44.Activity的4种启动模式 45.Android的四大组件 46.说说intent 47.Androidmanifest的作用 48.Android系统有几层,了解application framework层吗? 49.Service的启动方式和它们的区别 50.用过自定义控件没?怎么实现自定义控件,手写下例子代码。 51.知道Fragment吗?哪个版本出的?它和activity的区别,它的生命周期?用它的好处?它和activity如何实现通信,相互调用。 52.Fragment怎么实习按back键进行回退而不是一次性退出它所依附的activity? 53.Android如何实现定时器(timer,alarmManager)54.handler机制的概念,应用 55.Handler如何实现定时器效果(3种)56.两个activity之间如何通信(各种方式)57.用过eclipse的debug调试没?怎么用的 58.知道多少eclipse的快捷键 59.结束一个进程的几种方式? 60.进程间如何实现通信 61.Android如何实现信息存储 62.知道volley等一些第三方库吗? 63.Android对view的更新方式 64.知道一些代码优化的方式吗? 65.Handler和thread的区别 66.Android中http访问的两种方式 67.Asynctask的概念,作用,与handler的区别 68.Android中如何实现画图,手写个简单的例子 69.一个子线程是否可用直接修改ui界面?为什么 70.Service和Intentservice的区别与联系 71.Context是什么? 72.Boardcast的概念,作用,有序广播和无序广播的区别,粘性广播的概念 73.Boardcast的静态注册和动态注册的区别 74.Aidl,如何实现进程间通信 75.Contentprovider概念和作用 76.Json比xml的好处,他们的区别 77.Listview的概念,优化,如何实现每项的布局不同 78.Touch事件的分发过程 79.Linearlayout的Weight属性的作用 80.Android有哪几种布局,它们的5种布局的区别 81.Finish和exit(0)的区别 82.Sqlite的事务处理 83.Android实现可滑动tab的3种方式,它们的区别和各种的好处 84.Android中跨进程通信的4种方式,(正好对应四大组件)85.Handler的内存泄露是? 86.Android系统提供的与用户交互的两种机制(回调函数,监听器)87.Ndk的理解,jni的理解 88.Toast的概念,它的时间设置的两种方式 89.Activity的状态保存的方式 90.Activity的5个进程等级 91.Surface了解吗? 92.程序闪退的原因有哪些,怎么解决 93.Get和post的区别 94.Android有哪三种菜单?区别 95.实现序列化的两种方式,比较它们的优缺点 96.Broadcast receiver的生命周期 97.Sharedpreference的作用,底层实现 98.如何实现一个前台的service,简单写下代码例子 99.按home键activity的生命周期变化 100.Activity由a跳到b,哪些生命周期会执行 101.横竖屏切换,activity的生命周期,configchange的应用 102.如何设置activity为对话框风格 103.Activity,window,view的联系和区别 104.Style和theme的联系和区别 105.知道android平台主流的几种消息推送方式吗? 106.Viewstub的概念,作用,好处 107.Android数字签名 108.Zygote的概念 109.Adb的概念,作用。Adb死掉了怎么办? 110.Ddms和teaceview的区别,他们的作用 111.MVC模式概念 112.Android的事件传递机制 113.图片的缓存机制 114.Android内存优化及管理 115.如何实现低版本可用高版本的新的东西 116.Gallery画廊的使用 117.http如何实现长连接 118.Android是不是linux?为什么? 119.三.算法和写代码 74.写数的后序遍历(非递归)75.实现一个字符串的全排列 76.快速排序,堆排序,归并排序 77.如何在大量数据中快速找到中位数? 78.如何判断一个数是不是2的n次方 android面试题总结加强版 (三)(转自CSDN)转载地址:http://blog.csdn.net/itachi85/article/details/7426474 自己总结的最强android应用面试题集 26.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态? 当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行 Java代码 public void onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState);outState.putLong(“id”, 1234567890);} B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回 收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume就好了。 savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会 用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。Java代码 if(savedInstanceState!= null){ long id = savedInstanceState.getLong(“id”);} 就像官方的Notepad教程 里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整 一些。 比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,没准你需要记住滚动条的位置...27.如何退出Activity 对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。现提供几个方法,供参考: 1、抛异常强制退出:该方法通过抛异常,使程序Force Close。验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。 2、记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。 3、发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。 4、递归退出在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。为了编程方便,最好定义一个Activity基类,处理这些共通问题。 28.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。 Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列 Handler:可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息 Looper:是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的 Handler,Handler接受到消息后调用handleMessage进行处理 Message:消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理.29.你如何评价Android系统?优缺点。 1、学习的开源性 2、软件兼容性比较好 3、软件发展迅速 4、界面布局好 缺点: 1、版本过多 2、先有软件少 3、商务性能差 30.谈谈android数据存储方式。 Android提供了5种方式存储数据: (1)使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。 (2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。 (3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。 (4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。 (5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。 31.Android中Activity, Intent, Content Provider, Service各有什么区别。 Activity: 活动,是最基本的android应用程序组件。一个活动就是一个单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。 Intent: 意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。 Content Provider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。 Service:服务,具有一段较长生命周期且没有用户界面的程序。 有什么区别。 view是最基础的,必须在UI主线程内更新画面,速度较慢。 SurfaceView 是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快 GLSurfaceView 是SurfaceView的子类,opengl 专用的 33.Manifest.xml文件中主要包括哪些信息? manifest:根节点,描述了package中所有的内容。 uses-permission:请求你的package正常运作所需赋予的安全许可。 permission: 声明了安全许可来限制哪些程序能你package中的组件和功能。instrumentation:声明了用来测试此package或其他package指令组件的代码。application:包含package中application级别组件声明的根节点。activity:Activity是用来与用户交互的主要工具。 receiver:IntentReceiver能使的application获得数据的改变或者发生的操作,即使它当前不在运行。 service:Service是能在后台运行任意时间的组件。 provider:ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件。 34.根据自己的理解描述下Android数字签名。 (1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证 (3)如果要正式发布一个Android,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。 (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。 35.AIDL的全称是什么?如何工作?能处理哪些类型的数据? AIDL全称Android Interface Definition Language(AndRoid接口描述语言)是一种借口描述语言;编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻 .如果要使用AIDL, 需要完成2件事情: 1.引入AIDL的相关类.;2.调用aidl产生的class.理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数, 具体实现步骤如下: 1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。 2、编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.3、在Java文件中, 实现AIDL中定义的接口.编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind()方法来返回一个实现上述接口的类的实例。 5、在服务器端回调客户端的函数.前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数 AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型: 1.不需要import声明的简单Java编程语言类型(int,boolean等)2.String, CharSequence不需要特殊声明 3.List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.(另外: 我没尝试Parcelables, 在Eclipse+ADT下编译不过, 或许以后会有所支持).实现接口时有几个原则: .抛出的异常不要返回给调用者.跨进程抛异常处理是不可取的..IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。也就是IPC调用会挂起应用程序导致界面失去响应.这种情况应该考虑单起一个线程来处理..不能在AIDL接口中声明静态属性。IPC的调用步骤: 1.声明一个接口类型的变量,该接口类型在.aidl文件中定义。2.实现ServiceConnection。 3.调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.4.在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service).调用 YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。5.调用接口中定义的方法。你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。 6.断开连接,调用接口实例中的ApplicationContext.unbindService()参考:http://buaadallas.blog.51cto.com/399160/372090 36.android:gravity与android:layout_gravity的区别 LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。他们的区别在 于:android:gravity用于设置View组件的对齐方式,而android:layout_gravity用于设置Container组件的 对齐方式。 举个例子,我们可以通过设置android:gravity=“center”来让EditText中的文字在EditText组件中居中显示;同 时我们设置EditText的android:layout_gravity=“right”来让EditText组件在LinearLayout中居中 显示。来实践以下: 正如我们所看到的,在EditText中,其中的文字已经居中显示了,而EditText组件自己也对齐到了LinearLayout的右侧。 [html] view plaincopyprint? 1. 2.xmlns:android=“http://schemas.android.com/apk/res/android” 3.android:orientation=“vertical” 4.android:layout_width=“fill_parent” 5.android:layout_height=“fill_parent”> 6. 7.android:layout_width=“wrap_content” 8.android:gravity=“center” 9.android:layout_height=“wrap_content” 10.android:text=“one” 11.android:layout_gravity=“right”/> 12. 这两个属性也可以用于 Framlayout Textview 等等,表示的意思大同小异 37.padding与margin的区别 padding填充的意思,指的是view中的content与view边缘的距离,类似文本中的indent 而margin表示的是view的左边缘与parent view的左边缘的距离 margin一般用来描述控件间位置关系,而padding一般描述控件内容和控件的位置关系。简单,padding是站在父 view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离。margin则是站在自己的角度描述问题,规定自己和其他(上下左右)的 view之间的距离,如果同一级只有一个view,那么它的效果基本上就和padding一样了。例如我的XML layout代码如下: view plaincopy to clipboardprint? [html] view plaincopyprint? 1. 2. 3.android:orientation=“vertical” 4.android:layout_width=“fill_parent” 5.android:layout_height=“fill_parent” 6.android:paddingLeft=“10dip” 7.android:paddingRight=“10dip” 8.android:paddingTop=“10dip” 9.android:paddingBottom=“10dip” 10.> 11. 12.android:layout_width=“wrap_content” 13.android:layout_height=“wrap_content” 14.android:background=“#FF0000” 15.android:text=“@string/hello” 16.android:paddingLeft=“50dip” 17.android:paddingRight=“50dip” 18.android:paddingTop=“50dip” 19.android:paddingBottom=“50dip” 20.android:layout_marginBottom=“10dip” 21./> 22. 23.android:layout_width=“wrap_content” 24.android:layout_height=“wrap_content” 25.android:background=“#FF0000” 26.android:text=“@string/hello” 27.android:paddingLeft=“50dip” 28.android:paddingRight=“50dip” 29.android:paddingTop=“50dip” 30.android:paddingBottom=“50dip” 31.android:layout_marginBottom=“10dip” 32./> 33. 34.android:layout_width=“wrap_content” 35.android:layout_height=“wrap_content” 36.android:background=“#FF0000” 37.android:text=“@string/hello” 38.android:paddingLeft=“50dip” 39.android:paddingRight=“50dip” 40.android:paddingTop=“50dip” 41.android:paddingBottom=“50dip” 42.android:layout_marginBottom=“10dip” 43./> 44. 45.android:layout_width=“wrap_content” 46.android:layout_height=“wrap_content” 47.android:background=“#FF0000” 48.android:text=“@string/hello” 49.android:paddingLeft=“50dip” 50.android:paddingRight=“50dip” 51.android:paddingTop=“50dip” 52.android:paddingBottom=“50dip” 53.android:layout_marginBottom=“10dip” 54./> 55. 那么我会得到如下的效果,图上已经很明确的标出来区别咯。 38.注册广播接收者两种方式的区别 现在我们就来实现一个简单的广播程序。Android提供了两种注册广播接受者的形式,分别是在程序中动态注册和在xml中指定。他们之间的区别就是作用 的范围不同,程序动态注册的接收者只在程序运行过程中有效,而在xml注册的接收者不管你的程序有没有启动有会起作用。 39.Dalvik基于JVM的改进 1.几个class变为一个dex,constant pool,省内存 2.Zygote,copy-on-write shared,省内存,省cpu,省电 3.基于寄存器的bytecode,省指令,省cpu,省电 4.Trace-based JIT,省cpu,省电,省内存 40.android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别.Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构.2.可以通过该解析器随时访问XML树中的任何一个节点.3.DOM解析器的API在使用上也相对比较简单.缺点:如果XML文档体积比较大时,将文档读入内存是非常消耗系统资源的.使用场景:DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准.DOM 是以层次结构组织的节点的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构,然后才能进行任何工作.DOM是基于对象层次结构的.Ø SAX解析 优点: SAX 对内存的要求比较低,因为它让开发人员自己来决定所要处理的标签.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现.缺点: 用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂.使用场景: 对于含有数据量十分巨大,而又不用对文档的所有数据进行遍历或者分析的时候,使用该方法十分有效.该方法不用将整个文档读入内存,而只需读取到程序所需的文档标签处即可.Ø Xmlpull解析 android SDK提供了xmlpull api,xmlpull和sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序.因为是基于流的处理,因此xmlpull和sax都比较节约内存资源,不会象dom那样要把所有节点以对橡树的形式展现在内存中.xmlpull比sax更简明,而且不需要扫描完整个流.41.Android系统中GC什么情况下会出现内存泄露呢? 出现情况: 1.数据库的cursor没有关闭 2.构造adapter时,没有使用缓存contentview 衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程/ 3.Bitmap对象不使用时采用recycle()释放内存 4.activity中的对象的生命周期大于activity 调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size] 谈谈对Android NDK的理解 NDK 全称: Native Development Kit 2.误解 误解一: NDK 发布之前, Android 不支持进行 C 开发 在Google 中搜索 “NDK” ,很多 “Android 终于可以使用 C++ 开发 ” 之类的标题,这是一种对 Android平台编程方式的误解.其实, Android平台从诞生起,就已经支持 C.C++ 开发.众所周知, Android 的 SDK 基于 Java 实现,这意味着基于 Android SDK 进行开发的第三方应用都必须使用 Java 语言.但这并不等同于 “ 第三方应用只能使用 Java”.在 Android SDK 首次发布时, Google 就宣称其虚拟机 Dalvik 支持 JNI 编程方式,也就是第三方应用完全可以通过 JNI 调用自己的 C 动态库,即在 Android平台上, “Java+C” 的编程方式是一直都可以实现的.当然这种误解的产生是有根源的:在Android SDK 文档里,找不到任何 JNI 方面的帮助.即使第三方应用开发者使用 JNI 完成了自己的 C 动态链接库(so)开发,但是 so 如何和应用程序一起打包成 apk 并发布?这里面也存在技术障碍.我曾经花了不少时间,安装交叉编译器创建 so ,并通过 asset(资源)方式,实现捆绑 so 发布.但这种方式只能属于取巧的方式,并非官方支持.所以,在 NDK 出来之前,我们将 “Java+C” 的开发模式称之为灰色模式,即官方既不声明 “ 支持这种方式 ” ,也不声明 “ 不支持这种方式 ”.误解二:有了 NDK ,我们可以使用纯 C 开发 Android 应用 Android SDK采用 Java 语言发布,把众多的 C 开发人员排除在第三方应用开发外(注意:我们所有讨论都是基于“ 第三方应用开发 ” , Android 系统基于 Linux ,系统级别的开发肯定是支持 C 语言的.).NDK 的发布,许多人会误以为,类似于 Symbian.WM ,在 Android平台上终于可以使用纯 C.C++ 开发第三方应用了!其实不然, NDK 文档明确说明: it is not a good way.因为 NDK 并没有提供各种系统事件处理支持,也没有提供应用程序生命周期维护.此外,在本次发布的 NDK 中,应用程序 UI 方面的 API 也没有提供.至少目前来说,使用纯 C.C++ 开发一个完整应用的条件还不完备.1.NDK 是一系列工具的集合.NDK提供了一系列的工具,帮助开发者快速开发 C(或 C++)的动态库,并能自动将 so 和 java 应用一起打包成 apk.这些工具对开发者的帮助是巨大的.NDK集成了交叉编译器,并提供了相应的 mk 文件隔离 CPU.平台.ABI 等差异,开发人员只需要简单修改 mk 文件(指出 “ 哪些文件需要编译 ”.“ 编译特性要求 ” 等),就可以创建 出 NDK可以自动地将 so 和 Java 应用一起打包,极大地减轻了开发人员的打包工作.2.NDK 提供了一份稳定.功能有限的 API 头文件声明.Google明确声明该 API 是稳定的,在后续所有版本中都稳定支持当前发布的 API.从该版本的 NDK 中看出,这些 API 支持的功能非常有限,包含有: C 标准库(libc).标准数学库(libm).压缩库(libz).Log 库(liblog).3.NDK 带来什么 1.NDK 的发布,使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式.使用NDK ,我们可以将要求高性能的应用逻辑使用 C 开发,从而提高应用程序的执行效率.使用NDK ,我们可以将需要保密的应用逻辑使用 C 开发.毕竟, Java 包都是可以反编译的.NDK促使专业 so 组件商的出现.(乐观猜想,要视乎 Android 用户的数量) 2.NDK 将是 Android平台支持 C 开发的开端.NDK提供了的开发工具集合,使开发人员可以便捷地开发.发布 C 组件.同时, Google承诺在 NDK 后续版本中提高 “ 可调式 ” 能力,即提供远程的 gdb 工具,使我们可以便捷地调试 C 源码.在支持 Android平台 C 开发,我们能感觉到 Google 花费了很大精力,我们有理由憧憬 “C 组件支持 ” 只是 Google Android平台上C 开发的开端.毕竟, C 程序员仍然是码农阵营中的绝对主力,将这部分人排除在 Android 应用开发之外,显然是不利于 Android平台繁荣昌盛的. Android 面试题(有详细答案) 附带答案,共100分 一、选择题(30题,每题1.5分,共45分) 1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分类,按功能分为:(c),如果为读取的内容进行处理后再输出,需要使用下列哪种流?() A、输入流和输出流B、字节流和字符流C、节点流和处理流 D、File streamE、Pipe streamF、Random streamG、Filter stream 2.下列代码的执行结果是:() public class Test3{ public static void main(String args[]){ System.out.print(100%3); System.out.print(“,”); System.out.println(100%3.0); } } A、1,1 B、1,1.0 C、1.0,1 D、1.0,1.0 3.在继承中,关于构造方法的说明,下列说法错误的是() A、子类无条件的继承父类的无参构造方法,B、子类可以引用父类中的有参构造方法,使用super关键字,C、如果子类没有构造方法,则父类无参构造方法作为自已的构造方法,D、如果子类有无参构造方法,而父类的无参构造方法则被覆盖。 4.以下程序的运行结果为() public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x==y) System.out.println(“Not equal”); else System.out.println(“Equal”); } } A、Not equalB、EqualC、无输出D、编译出错 5.Java语言中字符串“学Java”所占的内存空间是() A.6个字节 B.7个字节 C.10个字节 D.11个字节 6.关于下列程序段的输出结果,说法正确的是:() public class MyClass{ static int i; public static void main(String argv[]){ System.out.println(i); } } A、有错误,变量i没有初始化。 B、null C、1 D、0 7.下列哪些语句关于内存回收的说明是正确的?() A、程序员必须创建一个线程来释放内存 B、内存回收程序负责释放无用内存 C、内存回收程序允许程序员直接释放内存 D、内存回收程序可以在指定的时间释放内存对象 8.下面异常是属于Runtime Exception 的是()(多选) A、ArithmeticException B、IllegalArgumentException C、NullPointerException D、BufferUnderflowException 9.Math.round(11.5)等于多少().Math.round(-11.5)等于多少().A、11 ,-11B、11 ,-12C、12 ,-11D、12 ,-12 10.下列程序段的输出结果是:() void complicatedexpression_r(){ int x=20, y=30; boolean b; b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60; System.out.println(b); } A、trueB、falseC、1D、0 11.activity对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行 () A、onPause()B、onCreate()C、onResume()D、onStart() 12.Intent传递数据时,下列的数据类型哪些可以被传递()(多选) A、SerializableB、charsequenceC、ParcelableD、Bundle 13.android 中下列属于Intent的作用的是() A、实现应用程序间的数据共享 B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会 因为切换页面而消失 C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带 D、处理一个应用程序整体性的工作 14.下列属于SAX解析xml文件的优点的是() A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能 B、不用事先调入整个文档,占用资源少 C、整个文档调入内存,浪费时间和空间 D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会 消失 15.下面的对自定style的方式正确的是() A、 B、 C、 D、 16.在android中使用Menu时可能需要重写的方法有()。(多选) A、onCreateOptionsMenu() B、onCreateMenu() C、onOptionsItemSelected() D、onItemSelected() 17.在SQL Server Management Studio 中运行下列T-SQL语句,其输出值()。 SELECT @@IDENTITY A、可能为0.1 B、可能为3 C、不可能为-100 D、肯定为0 18.在SQL Server 2005中运行如下T-SQL语句,假定SALES表中有多行数据,执行查询之后的结果是()。 BEGIN TRANSACTION A Update SALES Set qty=30 WHERE qty<30 BEGIN TRANSACTION B Update SALES Set qty=40 WHERE qty<40 Update SALES Set qty=50 WHERE qty<50 Update SALES Set qty=60 WHERE qty<60 COMMIT TRANSACTION B COMMIT TRANSACTION A A、SALES表中qty列最小值大于等于30 B、SALES表中qty列最小值大于等于40 C、SALES表中qty列的数据全部为50 D、SALES表中qty列最小值大于等于60 19.在android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数 据库版本进行管理的方法可以是() A、getWriteableDatabase() B、getReadableDatabase() C、getDatabase() D、getAbleDatabase() 20.android 关于service生命周期的onCreate()和onStart()说法正确的是()(多选题) A、当第一次启动的时候先后调用onCreate()和onStart()方法 B、当第一次启动的时候只会调用onCreate()方法 C、如果service已经启动,将先后调用onCreate()和onStart()方法 D、如果service已经启动,只会执行onStart()方法,不在执行onCreate()方法 21.下面是属于GLSurFaceView特性的是()(多选) A、管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。 B、管理一个EGL display,它能让opengl把内容渲染到上述的surface上。 C、让渲染器在独立的线程里运作,和UI线程分离。 D、可以直接从内存或者DMA等硬件接口取得图像数据 22.下面在AndroidManifest.xml文件中注册BroadcastReceiver方式正确的是() A、 android:name=“android.provider.action.NewBroad”/> B、 android:name=“android.provider.action.NewBroad”/> C、 android:name=“android.provider.action.NewBroad”/> D、 android:name=“android.provider.action.NewBroad”/> 23.关于ContenValues类说法正确的是() A、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值都是基本类型 B、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是任意类型,而值都是基本类型 C、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名,可以为空,而值都是String类型 D、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值也是String类型 24.我们都知道Hanlder是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会变得越慢,那么线程销毁的方法是() A、onDestroy() B、onClear() C、onFinish() D、onStop() 25.下面退出Activity错误的方法是() A、finish() B、抛异常强制退出 C、System.exit() D、onStop() 26.下面属于android的动画分类的有()(多项) A、TweenB、Frame C、Draw D、Animation 27.下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是() 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 中的一个进程,所以说可以认为是同一个概念.28.Android项目工程下面的assets目录的作用是什么 A、放置应用到的图片资源。 B、主要放置多媒体等数据文件 C、放置字符串,颜色,数组等常量数据 D、放置一些与UI相应的布局文件,都是xml文件 29..关于res/raw目录说法正确的是() A、这里的文件是原封不动的存储到设备上不会转换为二进制的格式 B、这里的文件是原封不动的存储到设备上会转换为二进制的格式 C、这里的文件最终以二进制的格式存储到指定的包中 D、这里的文件最终不会以二进制的格式存储到指定的包中 30.下列对android NDK的理解正确的是() A、NDK是一系列工具的集合B、NDK 提供了一份稳定、功能有限的 API 头文件声明。 C、使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式 D、NDK 将是 Android平台支持 C 开发的开端 二.填空题(每题2分,共20分) 1.我们用___ ____来定义一个整数,用___ ____来定义一个字符类型,称为原始数据类型。 2.android中常用的四个布局是?s 3.android 的四大组件是? 4.java.io包中的__________和______________类主要用于对对象(Object)的读写。 5.android 中service的实现方法是:_______-和___________-。 6.activity一般会重载7个方法用来维护其生命周期,除了onCreate(),onStart(),onDestory()外还有_______-,_________ ,_________ ,_____________。 7.android的数据存储的方式____________,___________,________ ,_______-,________。 8.当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行的回调函数是_____________()。 9.请使用命令行的方式创建一个名字为myAvd,sdk版本为2.2,sd卡是在d盘的根目录下,名字为scard.img,并指定屏幕大小HVGA.____________________________________。 10.程序运行的结果是:_______________。 public class Example{ String str=new String(“good”); char[]ch={'a','b','c'}; public static void main(String args[]){ Example ex=new Example(); ex.change(ex.str,ex.ch); System.out.print(ex.str+“ and ”); Sytem.out.print(ex.ch); } public void change(String str,char ch[]){ str=“test ok”; ch[0]='g'; } } 三 简答编程题(共35分) 1简述Android应用程序结构是哪些?(7分) Android应用程序结构是:请继承SQLiteOpenHelper实现:(10分) 1).创建一个版本为1的“diaryOpenHelper.db”的数据库,2).同时创建一个 “diary” 表(包含一个_id主键并自增长,topic字符型100长度,content字符型1000长度) 3).在数据库版本变化时请删除diary表,并重新创建出diary表。 3.页面上现有ProgressBar控件progressBar,请用书写线程以10秒的的时间完成其进度显示工作。(10分)第三篇:Android最全的面试题总结
第四篇:Android面试题总结强劲版(三)
第五篇:Android面试题(十一)