经典Android面试题x100
Android开发工程师经典面试题(附参考答案)
‣下列哪些语句关于内存回收的说明是正确的? (B)
A、 程序员必须创建一个线程来释放内存
B、内存回收程序负责释放无用内存
C、内存回收程序允许程序员直接释放内存
D、内存回收程序可以在指定的时间释放内存对象
‣下面异常是属于Runtime Exception 的是(ABCD)(多选)
A、ArithmeticException
B、IllegalArgumentException
C、NullPointerException
D、BufferUnderflowException
‣Math.round(11.5)等于多少.?Math.round(-11.5)等于多少?(C)
A、11 ,-11
B、11 ,-12
C、12 ,-11
D、12 ,-12
‣对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行(D)
A、onPause() B、onCreate() C、 onResume() D、onStart()
‣Intent传递数据时,下列的数据类型哪些可以被传递(ABCD)(多选)
A、Serializable B、charsequence C、Parcelable D、Bundle
‣下列程序段的输出结果是:(B)
void complicatedexpression_r(){
int x=20, y=30;
boolean b;
b=x>50&&y>60||x>50&&y60||x
System.out.println(b);
}
A、true B、false C、1 D、011.activity
‣Android 中下列属于Intent的作用的是(C)
A、实现应用程序间的数据共享
B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失
C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带
D、处理一个应用程序整体性的工作
‣下列属于SAX解析xml文件的优点的是(B)
A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能
B、不用事先调入整个文档,占用资源少
C、整个文档调入内存,浪费时间和空间
D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会 消失
‣下面退出Activity错误的方法是(C)
A、finish() B、抛异常强制退出
C、System.exit() D、onStop()
‣下面的对自定style的方式正确的是(A)
A、
B、
C、
fill_parent
D、
‣在Android中使用Menu时可能需要重写的方法有(AC)(多选)
A、onCreateOptionsMenu()
B、onCreateMenu()
C、onOptionsItemSelected()
D、onItemSelected()
‣在SQL Server Management Studio 中运行下列T-SQL语句,其输出值
(C)。SELECT @@IDENTITY
A、可能为0.1 B、可能为3
C、不可能为-100 D、肯定为0
‣在SQL Server 2005中运行如下T-SQL语句,假定SALES表中有多行数据,执行查询之后的结果是(D)。
BEGIN TRANSACTION A
Update SALES Set qty=30 WHERE qty
BEGIN TRANSACTION B
Update SALES Set qty=40 WHEREqty
Update SALES Set qty=50 WHEREqty
Update SALES Set qty=60 WHEREqty
COMMIT TRANSACTION B
COMMIT TRANSACTION A
A、SALES表中qty列最小值大于等于30
B、SALES表中qty列最小值大于等于40
C、SALES表中qty列的数据全部为50
D、SALES表中qty列最小值大于等于60
‣在Android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库版本进行管理的方法可以是(AB)
A、getWriteableDatabase() B、getReadableDatabase()
C、getDatabase() D、getAbleDatabase()
‣Android 关于service生命周期的onCreate()和onStart()说法正确的是(AD)(多选题)
A、当第一次启动的时候先后调用onCreate()和onStart()方法
B、当第一次启动的时候只会调用onCreate()方法
C、如果service已经启动,将先后调用onCreate()和onStart()方法
D、如果service已经启动,只会执行onStart()方法,不在执行onCreate()方法
‣下面是属于GLSurFaceView特性的是(ABC)(多选)
A、管理一个surface,这个surface就是一块特殊的内存,能直接排版到Android的视图view上。
B、管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
C、让渲染器在独立的线程里运作,和UI线程分离。
D、可以直接从内存或者DMA等硬件接口取得图像数据
‣下面属于Android的动画分类的有(AB)(多项)
A、Tween B、Frame C、Draw D、Animation
‣关于ContenValues类说法正确的是(A)
A、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名是String类型,而值都是基本类型
B、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名是任意类型,而值都是基本类型
C、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名,可以为空,而值都是String类型
D、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中 的名是String类型,而值也是String类型
‣我们都知道Hanlder是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会变得越慢,那么线程销毁的方法是(A)
A、onDestroy()
B、onClear()
C、onFinish()
D、onStop()
‣下面关于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中的一个进程,所以说可以认为是同一个概念.
‣Android项目工程下面的assets目录的作用是什么(B)
A、放置应用到的图片资源。
B、主要放置多媒体等数据文件
C、放置字符串,颜色,数组等常量数据
D、放置一些与UI相应的布局文件,都是xml文件
‣关于res/raw目录说法正确的是(A)
A、这里的文件是原封不动的存储到设备上不会转换为二进制的格式
B、这里的文件是原封不动的存储到设备上会转换为二进制的格式
C、这里的文件最终以二进制的格式存储到指定的包中
D、这里的文件最终不会以二进制的格式存储到指定的包中
‣下列对Android NDK的理解正确的是(ABCD)
A、 NDK是一系列工具的集合
B、 NDK 提供了一份稳定、功能有限的 API 头文件声明。
C、 使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式
D、 NDK 将是 Android 平台支持 C 开发的开端
‣Android的自动恢复功能能够完成?(D)
A、回复地址簿
B、修复丢失的文字信息
C、回复删除的信息
D、恢复备份设置和数据来重新安装程序
‣为满足线程间通信,Android提供了(A)
A、Handler和Looper
B、Handler
C、Message Queue
D、Looper
‣下面哪种进程最重要,最后被销毁?(D)
A、服务进程
B、后台进程
C、可见进程
D、前台进程
‣在Android中,在屏幕密度为160时,1pt大概等于(B)sp。
A、1.22 B、2.22
C、2.12 D、1.12
‣下列关于数据持久化的描述正确的有:(BD)
A、在内存中缓存多个Bitmap对象是一种数据持久化方法
B、SQLite数据库文件可以保存在SD卡中
C、ContentProvider的主要目的是为了将Android应用的数据持久化
D、数据持久化就是将内存的数据保存到外存
‣Android 默认使用__作为字号单位(B)
A、dip B、px C、sp D、pt
‣下列哪些情况下,系统可能会弹出ANR对话框(ABC)
A、在Activity中,Main线程消息队列中的消息在5s内没有得到相应
B、在Service中,onStartCommand()方法执行超过5s
C、在BroadcastReceive中,onReceive()方法执行时间超过10s
D、在启动的新线程中,run()方法执行时间超过5s
‣下列关于IntentService与Service的关系描述错误的是(CD)
A、IntentService是Service的子类
B、IntentService在运行时会启动新的线程来执行任务
C、启动方式不同
D、没有区别
‣在多个应用中读取共享存储数据时,需要用到query()方法,这是哪个对象的方法
(A)
A、ContentResolver
B、ContentProvider
C、Cursor
D、SQLiteHelper
‣关于ServiceConnection接口的onServiceConnected()方法的触发条件描述正确的是(B)
A、bindService()方法执行成功后
B、bindService()方法执行成功同时onBInd()方法返回非空IBinder对象
C、Service的onCreate()方法和onBind()方法执行成功后
D、Service的onCreate()和onStartCommand()方法启动成功后
‣在一个ListView中,显示的布局有多种不同的形式,例如某些行只有ImageView,而另外一些行只有TextView.需要重写哪几个方法?(ABCD)
A、getCount()
B、getItemId()
C、getItemViewType()
D、getViewTypeCount()
‣下面关于Android中定义style和theme的描述正确的是(AD)
A、都可以减少重复属性设置
B、style可以作用在Activity上
C、theme可以继承
D、一个TextView的style中定义了textColor属性,TextView本身也设置textColor属性,那么TextView本身定义的优先级较高。
‣Android中MVC模式C层指的是?(A)
A、Activity
B、Service
C、Content
D、Intent
‣RemoteView在哪些功能中使用?(BD)
A、Toast
B、AppWidget
C、ListView
D、Notification
‣Android系统对下列哪些对象提供了资源池(AC)
A、Message
B、Thread
C、Async Task
D、Looper
‣使用AIDL完成远程service方法调用下列说法不正确的是(A)
A、AIDL对应的接口名称不能与AIDL文件名相同
B、AIDL的文件的额内容类似java代码
C、创建一个Service(服务),在服务的onBind(Intent intent)方法中返回实现了AIDL接口的对象
D、AIDL对应的接口的方法前面不能加访问权限修饰符
‣从架构图看,android分为几个层?(C)
A、5 B、2 C、4 D、3
‣对于一个已经存在的SharedPreferences对象setting,想向其中存入一个字符串"person",setting应该先调用什么方法(A).
A、edit() B、save() C、commit() D、putString()
‣如果在android应用程序中需要发送短信,那么需要在AndroidManifest.xml文件中增加什么样的权限(D).
A. 发送短信,无需配置权限
B. permission.SMS
C. android.permission.RECEIVE_SMS
D. android.permission.SEND_SMS
‣下列哪一项是manifest 文件的功能(A)
A. 都是
B. 声明要求的最低API级别
C. 声明要求的用户权限的级别
D. 记录程序中使用的Activity等资源
‣关于intent的说法,错误的是?(C)
A.可以用来激活一些组件
B.表示程序想做某事的意图
C.只能用于一个组件内部
D.是一个简单的消息对象
‣通过Intent传递一些二进制数据的方法有哪些? (C)
A.使用Serializable接口实现序列化,这是java常用的方法
B.实现Parcelable接口,这里Andriod的部分分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见
C.以上都是
‣如何把一个字符串转换成URI (B)
A.uri new uri=uri.parse(“content://
com.changcheng.provider.contactprovider/contact”)
B.uri uri=uri.parse(“content://com.changcheng.provider.contactprovider/contact")
C.android.uri uri=uri.parse(“content://
com.changcheng.provider.contactprovider/contact")
D.uri uri=android.uri.parse(“content://
com.changcheng.provider.contactprovider/contact")
‣使用Toast提示时,关于提示时长,下面说法正确的是(A).
A.显示时长只有2种设置
B.可以自定义显示时长
C.传入30时,提示会显示30秒钟
D.当自定义显示时长时,比如传入30,程序会抛出异常
‣在一个布局文件中,对一个EditText进行设置,以下哪项设置能实现输入框默认提示内容的效果(B).
A.android:capitalize B.android:hint
C.android:singleLine D.android:text
‣关于AlertDialog描述错误的是(D).
A.show()方法只显示对话框
B.AlertDialog.Builder的create() 和show()方法都返回AlertDialog对象
C.AlertDialog不能直接用new关键字构建对象,而必须使用其内部类Builder
D.create()方法创建并显示对话框
‣使用SimpleAdapter作为 ListView的适配器,行布局中支持下列哪些组件?(ACD)
A.TextView
B.ProgressBar
C.CompoundButton
D.ImageView
‣Android中常用的四个布局:
framlayout,linenarlayout,relativelayout和tablelayout。
‣Android 的四大组件:
activiey,service,broadcast和contentprovide。
‣Android 中service的实现方法是:
startservice和bindservice。
‣Android的数据存储的方式:
sharedpreference,文件,SQlite,contentprovider,网络。
‣在Android中,请简述jni的调用过程。
1)安装和下载Cygwin,下载 Android NDK
2)在ndk项目中JNI接口的设计
3)使用C/C++实现本地方法
4)JNI生成动态链接库.so文件
5)将动态链接库复制到java工程,在java工程中调用,运行java工程即可
‣简述Android应用程序结构是哪些?
Android应用程序结构是:
Linux Kernel(Linux内核)、Libraries(系统运行库或者是c/c++核心库)、Application Framework(开发框架包)、Applications (核心应用程序)
‣请描述下Activity的生命周期。
必调用的三个方法:onCreate() --> onStart() --> onResume(),用AAA表示
(1)父Activity启动子Activity,子Actvity退出,父Activity调用顺序如下
AAA --> onFreeze() --> onPause() --> onStop() --> onRestart()-->
onStart(),onResume() …
(2)用户点击Home,Actvity调用顺序如下
AAA --> onFreeze() --> onPause() --> onStop() -- Maybe -->onDestroy() – Maybe
(3)调用finish(), Activity调用顺序如下
AAA --> onPause() --> onStop() --> onDestroy()
(4)在Activity上显示dialog,Activity调用顺序如下
AAA
(5)在父Activity上显示透明的或非全屏的activity,Activity调用顺序如下
AAA --> onFreeze() --> onPause()
(6)设备进入睡眠状态,Activity调用顺序如下
AAA --> onFreeze() --> onPause()
‣请介绍下ContentProvider是如何实现数据共享的?
创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的
Contentprovider中,前提是有相同数据类型并且有写入Content provider的权限。
一.SharedPreferences方式
二.文件存储方式
三.SQLite数据库方式
四.内容提供器(Content provider)方式
五. 网络存储方式
‣如何将一个Activity设置成窗口的样式。
在AndroidManifest.xml 中定义Activity的地方一句话
Android:theme=“@Android:style/Theme.Dialog"或
Android:theme="@Android:style/Theme.Translucent"就变成半透明的
‣如何退出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基类,处理这些共通问题。
FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)
‣请解释下Android程序运行时权限与文件系统权限的区别。
运行时权限Dalvik( Android授权)
文件系统 linux 内核授权
‣系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。 通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性 ‣什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?
一般像空指针啊,可以看起logcat,然后对应到程序中 来解决错误
‣横竖屏切换时候activity的生命周期?
1、不设置Activity的Android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的Android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的Android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法 如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?
解答:可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中
‣简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver
一个activity呈现了一个用户可以操作的可视化用户界面
一个service不包含可见的用户界面,而是在后台无限地运行
可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信
一个broadcast receiver是一个接收广播消息并作出回应的component,
broadcastreceiver没有界面
intent:content provider在接收到ContentResolver的请求时被激活。
activity, service和broadcast receiver是被称为intents的异步消息激活的。
一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI
Intent对象可以显式的指定一个目标component。如果这样的话,Android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,Android必须找到响应intent的最佳component。
它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intent filter告诉Android该component能处理的intent。intent filter也是在manifest文件中声明的。
‣IntentService有何优点?
IntentService 的好处
* Acitivity的进程,当处理Intent的时候,会产生一个对应的Service
* Android的进程处理器现在会尽可能的不kill掉你
* 非常容易使用
‣如何将打开res aw目录中的数据库文件?
解答:在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
‣Android引入广播机制的用意?
答:a:从MVC的角度考虑(应用程序内)
其实回答这个问题的时候还可以这样问,Android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。Android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。
b:程序间互通消息(例如在自己的应用程序内监听系统来电)
c:效率上(参考UDP的广播协议在局域网的方便性)
d:设计模式上(反转控制的一种应用,类似监听者模式)
‣Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念?
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。
‣sim卡的EF文件有何作用
sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本身可以有自己的操作系统,EF就是作存储并和手机通讯用的
‣嵌入式操作系统内存管理有哪几种,各有何特性?
页式,段式,段页,用到了MMU,虚拟空间等技术。
‣什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而Android是基于linux内核的,因此属于软实时。
‣一条最长的短信息约占多少byte?
中文70(包括标点),英文160,160个字节。
‣Android中的动画有哪几类,它们的特点和区别是什么?
两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
‣说说mvc模式的原理,它在Android中的运用。
MVC(Model_view_contraller)”模型_视图_控制器”。 MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。 ‣DDMS和TraceView的区别?
DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器。
‣handler机制的原理
Android提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的
MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到
MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。
‣Java中如何引用本地语言?
可以用JNI(Java nativeinterface Java 本地接口)接口。
‣谈谈Android的IPC(进程间通信)机制。
IPC是内部进程通信的简称,是共享”命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。
‣NDK是什么?
NDK是一些列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和Java 应用打成apk包。
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so
‣Android中Activity, Intent, Content Provider, Service各有什么区别。 Activity: 活动,是最基本的Android应用程序组件。一个活动就是一个用户可以操作的可视化用户界面,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。 Intent: 意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。
Content Provider:内容提供器,Android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。
Service:服务,具有一段较长生命周期且没有用户界面的程序组件。
‣根据自己的理解描述下Android数字签名。
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android程序,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。 ‣Android中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别:
XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处 理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。
‣Android系统中GC什么情况下会出现内存泄露呢?
出现情况:
1. 数据库的cursor没有关闭
2.构造adapter时,没有使用缓存contentview
衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程
3.Bitmap对象不使用时采用recycle()释放内存
4.activity中的对象的生命周期大于activity
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]
‣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中值就会改变。
‣Android客户端如何实现自动登录
通过SharedPreferences存储用户名,密码,当存储不为空时实现自动登录功能。
‣Android SDK 3.0(HoneyComb)及4.0(Ice Cream)新特性
新版SDK发布的同时也发布了一个扩展包Android-support-v4,把部分特性单独的抽出来,使低版本的SDK也可以使用这些特性,主要支持以下特性:
Fragment: 3.0引入,碎片管理,可以局部刷新UI,它设计的功能和Activity一样强大,包括生命周期、导航等,Fragment的每次导航都可以记录下来用于返回。
ViewPager: 提供了多界面切换的新效果
GridLayout: 4.0引入, 网格布局, Android第六大布局
Loader: 装载器从Android3.0开始引进。它使得在activity或fragment中异步加载数据变得简单。
‣播放视频有哪些实现方式?
1.使用系统自带的播放器来播放,指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。
//调用系统自带的播放器
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/mp4");
startActivity(intent);
2. 使用VideoView组件来播放, 可以结合MediaController来实现播控, 只是不能随意更改视频的大小及位置。
3. 使用MediaPlayer和SurfaceView来实现,这种方式很灵活,可以自定义视频播放的大小和位置。
‣版本更新的实现思路
在服务器相应URL上有版本文件, 客户端同时存储该应用当前版本号
(SharedPreferences/Sqlite), 每次打开应用,去检测服务器版本号与本地版本号是否一致,如果不一 致,则自定义对话框提示是否下载更新。
‣Android自定义组件实现思路
Android自定义组件有三种实现思路:
1) 继承某个现有组件,在其基础上添加额外功能,如继承Gallery实现CoverFlow效果
2) 继承某个Layout,实现复合组件自定义,如TextView和EditText组合实现登录注册组件
3) 继承View,实现onDraw()方法,实现自己绘制组件,如翻页效果组件
‣如何实现消息推送,有哪些方式,各自优缺点,最常使用哪种?
实现消息推送的方式有五种,分别是轮询,SMS,C2DM,MQTT,XMPP最常使用的是XMPP, 我们做项目时采用的是XMPP协议
1.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性。它的特点是将复杂性从客户端转移到了服务器端。GTalk、QQ、IM等都用这个协议。
2.轮询:客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送, 而是去服务端拽数据。但是实现简单,主要缺点:耗电,浪费用户流量等
3.Google的C2DM,具体不细说,缺点,服务器在国外,不是很稳定。
4.通过短信方式, 但是很难找到免费短信平台
5. MQTT协议, IBM提供的一种推送服务,不太灵活
‣listview优化策略?
答:1)、对convetView进行判空,是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建
2)定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
3)、当ListView加载数据量较大时可以采用分页加载和图片异步加载
客户端缓存机制是Android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择,比如有 些新闻客户端支持离线模式,也是通过缓存机制实现的.缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存.
文字缓存有两种实现:
1)可以将与服务器交互得到的json数据或者xml数据存入sd卡中,并在数据库添加该数据的记录.添加数据库记录时,提供两个关键字段,一个是请求的URL,另一个则是本地保存后的文件地址,每次加载数据之前都会根据URL在数据库中检索
2)将JSON数据解析后装入List对象中,然后遍历List,将数据统统写入相应的数据库表结构中,以后每次向服务器发起请求之前可以先在数据库中检索,如果有直接返回. 多媒体文件缓存:主要指图片缓存
图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录,同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该 图 片的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索,如果没有则连接服务器下载,下载之后再服务器中作出相应记录
缓存文件删除策略:
1. 每一个模块在每次客户端自动或者用户手动更新的时候删除相应模块的缓存文件,并重新下载新的缓存文件。
2. 在设置界面中提供删除缓存的功能,点击后删除本机所有缓存。
‣GC内存泄露在什么情况下回出现?怎么解决?
(一) 查询数据库没有关闭游标
(二) 构造Adapter时,没有使用缓存的 convertView
(三) Bitmap对象不在使用时调用recycle()释放内存
(四) 不用的对象没有及时释放对象的引用
Android内存泄露容易导致内存溢出,又称为OOM。
Android内存优化策略:
1)在循环内尽量不要使用局部变量
2)不用的对象即时释放,即指向NULL
3)数据库的cursor即时关闭。
4)构造adapter时使用缓存contentview
5)调用registerReceiver()后在对应的生命周期方法中调用unregisterReceiver()
6)即时关闭InputStream/OutputStream。
7)Android系统给图片分配的内存只有8M, 图片尽量使用软引用, 较大图片可通过BitmapFactory缩放后再使用,并及时recycle
8)尽量避免static成员变量引用资源耗费过多的实例。
‣Android程序入口如何判断?
action节点中的Android.intent.action.MAIN表明它所在的Activity是整个应用程序的入口点。
‣ListView分页加载实现思路?
实现OnScrollListener 接口重写onScrollStateChanged 和onScroll方法,使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,调用
addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了,把自定义的mFooterView去掉。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然 后执行加载
‣Android哪几种方式访问网络?
HttpURLConnection
HttpClient方式(HttpGet和HttpPost类)