Andrroid 面试问题问答

1. 如果后台的 Activit由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
onSaveInstanceState() 当你的程序中某一个Activity A 在运行时,主动或被动地运行另一个新的 Activity B,
这个时候A 会执行 onSaveInstanceState()。B 完成以后又会来找A,这个时候就有两种情况:
一是A 被回收,二是 A没有被回收,被回收的 A就要重新调用 onCreate()方法,不同于直
接启动的是这回onCreate()里是带上了参数 savedInstanceState;而没被收回的就直接执行
onResume(),跳过 onCreate()了。
-----------------------------------------------------------------------------------
2。如何将一个设置成窗口的样式。
在AndroidManifest.xml 中定义 Activity 的地方一句话
android:theme="@android:style/Theme.Dialog"或
android:theme="@android:style/Theme.Translucent"就变成半透明的

-----------------------------------------------------------------------------------
3. 如何退出 Activity,如何安全退出已调多个Activity的 的 Application?
对于单一Activity 的应用来说,退出很简单,直接finish()即可。
当然,也可以用killProcess()和 System.exit()这样的方法。
但是,对于多Activity 的应用来说,在打开多个Activity 后,如果想在最后打开的Activity
直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity 而已。
当然,网上也有人说可以。
就好像有人问,在应用里如何捕获Home 键,有人就会说用 keyCode 比较 KEYCODE_HOME
即可,而事实上如果不修改framework,根本不可能做到这一点一样。
所以,最好还是自己亲自试一下。
那么,有没有办法直接退出整个应用呢?
在2.1之前,可以使用 ActivityManager 的 restartPackage 方法。
它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。
可是,在2.2,这个方法失效了。
在2.2添加了一个新的方法,killBackgroundProcesses(),需要权限
android.permission.KILL_BACKGROUND_PROCESSES。
可惜的是,它和2.2的 restartPackage一样,根本起不到应有的效果。
另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,
forceStopPackage()。
它需要权限android.permission.FORCE_STOP_PACKAGES。
并且需要添加android:sharedUserId="android.uid.system"属性
同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。
因为需要在Android.mk 中添加 LOCAL_CERTIFICATE:= platform。
而Android.mk 是用于在 Android 源码下编译程序用的。
从以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。
现提供几个方法,供参考:
1、抛异常强制退出:
该方法通过抛异常,使程序Force Close。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。
3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity 收到广播后,关闭即可。
4、递归退出
在打开新的Activity 时使用startActivityForResult,然后自己加标志,在onActivityResult 中
处理,递归关闭。
除了第一个,都是想办法把每一个Activity 都结束掉,间接达到目的。
但是这样做同样不完美。
你会发现,如果自己的应用程序对每一个Activity 都设置了nosensor,在两个 Activity 结束
的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。
为了编程方便,最好定义一个Activity 基类,处理这些共通问题。
-----------------------------------------------------------------------------------
4请介绍下Android中常用的五种布局
FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),
RelativeLayout(相对布局),TableLayout(表格布局)
6.请介绍下 Android 的数据存储方式。
一.SharedPreferences方式
二.文件存储方式
三.SQLite 数据库方式
四.内容提供器(Content provider)方式

五. 网络存储方式



1.什么是 Service 以及描述下它的生命周期。
2. Service 有哪些启动方法,有什么区别,怎样停用 Service?
3.  不用 service,B 页面为音乐播放,从 A 跳转到 B,再返回,如何使音乐继续播放?
4.什么是 IntentService?有何优点?
5.  什么时候使用 Service?
6.  请描述一下 Intent 和 Intent Filter。
7。  Intent 传递数据时,可以传递哪些类型数据
8.  说说 Activity,Intent,Service 是什么关系 。
<<<<<<<<<<<<<答案<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1.Android Service 是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以 运行在其他应用程序进程的上下文里。需要通过某一个 Activity 或者其他 Context 对象来调 用, Context.startService() 和 Context.bindService()。  如果在 Service 执行耗时的操作 需要启动一个新线程来执行。 Android Service 只继承了 onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动 Service 时,先后调用了 onCreate(),onStart()这两个方法,当停止 Service 时,则执行 onDestroy()方法,这里需要注意的是,如果 Service 已经启动了,当我们再次启 Service 时, 不会在执行 onCreate()方法,而是直接执行 onStart()方法。

2.两种启动 Service 的方式 Context.startService() 和 Context.bindService()。 区别 为 Context.startService():Service 会经历 onCreate -> onStart(如果 Service 还没有运行, 则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(), 所以一个 Service 的 onStart 方法可能会重复调用多次 ); stopService 的时候直接 onDestroy,如果是调用者自己直接退出而没有调用 stopService 的话,Service 会一直在后 台运行。该 Service 的调用者再启动起来后可以通过 stopService 关闭 Service   Context.bindService():Service 会经历 onCreate() -> onBind(),onBind 将返回给客户端 一个 IBind 接口实例,IBind 允许客户端回调服务的方法,比如得到 Service 运行的状态或其 他操作。这个时候把调用者(Context,例如 Activity)会和 Service 绑定在一起,Context 退出了,Srevice 就会调用 onUnbind -> onDestroyed 相应退出,所谓绑定在一起就共存亡 了 。 停用 service 使用 context.stopService()

3.a 使用 startActivityForResult() 方法开启 b,b 类结束时调用 finish(); a 类的 intent 有一个子 activity 结束事件 onActivityResult(),在事件里继续播放音乐  

4.IntentService 也是一个 Service,是 Service 的子类, IntentService 和 Service 有所不同,通过 Looper 和 Thread 来解决标准 Service 中处理逻辑 的阻塞问题。 优点:Acitivity 的进程,当处理 Intent 的时候,会产生一个对应的 Service Android 的进程处理器现在会尽可能的不 kill 掉你 非常容易使用 日历中 IntentService 的应用

5.比如播放多媒体的时候用户启动了其他 Activity 这个时候程序要在后台继续播放,比如检测 SD 卡上文件的变化,再或者在后台记 录你地理信息位置的改变等等,总之服务嘛,总是藏 在后头的。   

6.Intent 在 Android 中被翻译为"意图",熟语来讲就是目的,他们是三种应用程序基本组件 —activity,service 和 broadcast receiver 之间互相激活的手段。 在调用 Intent 名称时使用 ComponentName 也就是类的全名时为显示调用。这种方式一般用于应用程序的内部调用, 因为你不一定会知道别人写的类的全名。我们来看看隐式 Intent 怎么用? 首先我们先配置 我们的 Activity 的 Intent Filter <intent-filter>     <action android:name="com.example.project.SHOW_CURRENT" /> </intent-filter> 这样在调用的时候指定 Intent 的 action,系统就是自动的去对比是哪个 intent-filter 符合我 们的 Activity,找到后就会启动 Activity。 一个 intent filter 是 IntentFilter 类的实例, 但是它一般不出现在代码中,而是出现在 android Manifest文件中, 以<intent-filter>的形式. (有一个例外是broadcast receiver的intent filter 是使用 Context.registerReceiver()来动态设定的, 其 intent filter 也是在代码中创建的.) 一个filter有action, data, category等字段. 一个隐式intent为了能被某个intent filter接受, 必须通过 3 个测试. 一个 intent 为了被某个组件接受, 则必须通过它所有的 intent filter 中 的一个.  

7.Intent 间传送数据一般有两种常用的办法:  1.extra  2.data.  extra 可以用 Intent.putExtra 放入数据。新启动的 Activity 可用 Intent.getExtras 取出来 Bundle, 然后用 Bundles.getLong, getInt, getBoolean, getString 等函数来取放进入的值。  而 data 则是传输 url。url 可以是指我们熟悉的 http, ftp 等网络地址, 也可以指 content 来指向 ContentProvider 提供的资源。Intent.setData 可以放入数据,Intent.getData 可以取 出数据。  

8.一个 Activity 通常是一个单独的屏幕,每一个 Activity 都被实现为一个单独的类,这些类都 是从 Activity 基类中继承来的,Activity 类会显示由视图控件组成的用户接口,并对视图控 件的事件做出响应。 Intent 的调用是用来进行架构屏幕之间的切换的。Intent 是描述应用想要做什么。Intent 数 据结构中两个最重要的部分是动作和动作对应的数据,一个动作对应一个动作数据。 Android Service 是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以 运行在其他应用程序进程的上下文里。需要通过某一个 Activity 或者其他 Context 对象来调 用。 Activity 跳转到 Activity,Activity 启动 Service,Service 打开 Activity 都需要 Intent 表明跳转 的意图,以及传递参数,Intent 是这些组件间信号传递的承载者。 



1.请描述一下 Activity 生命周期
2,  两个 Activity 之间跳转时必然会执行的是哪几个方法。
3.  横竖屏切换时候 Activity 的生命周期。
4.  请描述一下 Broadcast Receiver。
5. 在 manifest 和代码中如何注册和使 用 broadcast receiver 。
6.请介绍下 ContentProvider 是如何实现数据共享的。  为什么要用 ContentProvider?它和 sql 的实现上有什么差别?
<<<<<<<<<<答案<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1.onCreate(Bundle savedInstanceState):创建 activity 时调用。设置在该方法中,还以 Bundle 的形式提供对以前储存的任何状态的访问!  onStart():activity 变为在屏幕上对用户可见时调用。  onResume():activity 开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法 总是被调用的)。  onPause():activity 被暂停或收回 cpu 和其他资源时调用,该方法用于保存活动状态的,也 是保护现场,压栈吧!  onStop():activity 被停止并转为不可见阶段及后续的生命周期事件时调用。  onRestart():重新启动 activity 时调用。该活动仍在栈中,而不是启动新的活动。  onDestroy():activity 被完全从系统内存中移除时调用,该方法被调用  

2.onCrante() //在 Activity 生命周期开始时调用 onRestoreInstanceState()//用来恢复 UI 状态 onReStart()//当 Activity 重新启动时调用 onStart()//Activity 对用户即将可见时调用 onResume()//当 Activity 与用户交互时,绘制界面 onSaveInstanceState()//activity 即将移出栈顶保留 UI 状态时调用 onPause()//暂停当前活动 activity,提交持久数据的改变,停止动画和其他占用 CPU 资源的 东西,由于下一个 activity 在这个方法返回之前不会 resume,所以这个方法的代码执行要快。 onStop()//activity 不再可见时调用 onDestroy()//在 Activity 销毁钱被调用的最后一个方法

3.1、不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期,切横屏时 会执行一次,切竖屏时会执行两次 2、设置 Activity 的 android:configChanges="orientation"时,切屏还是会重新调用各个生命 周期,切横、竖屏时只会执行一次 3、设置 Activity 的 android:configChanges="orientation|keyboardHidden"时,切屏不会重 新调用各个生命周期,只会执行 onConfigurationChanged 方法  

4.Broadcast Receiver 用于接收并处理广播通知(broadcast announcements)。多数的广播是 系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有 任意数量的 broadcast receivers 来响应它觉得重要的通知。broadcast receiver 可以通过多 种方式通知用户:启动 activity、使用 NotificationManager、开启背景灯、振动设备、播放
声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。通常我 们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个 Intent 出去,我们可以利用注册一个 Broadcast Receiver 来监听到这些 Intent 并获取 Intent 中的 数据。  

5.1)在 AndroidManifest.xml 中注册
<receiver android:name="Receiver1">  <intent-filter>                <!-- 和 Intent 中的 action 对应 -->   <action android:name="com.forrest.action.mybroadcast"/>  </intent-filter> </receiver>
 2)在代码中注册
1. IntentFilter filter = new IntentFilter("com.forrest.action.mybroadcast"); // 和广播 中 Intent 的 action 对应    2. MyBroadcastReceiver br = new MyBroadcastReceiver();    3. registerReceiver(new MyBroadcastReceiver(), filter);   
6.ContentProvider 是通过提供 Uri 来实现数据共享  .使用 ContentProvider 可以将数据共享给其他应用,让除本应用之外的应用也可以访问本应 用的数据。它的底层是用 SQLite 数据库实现的,所以其对数据做的各种操作都是以 Sql 实 现,只是在上层提供的是 Uri。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


1.谈谈 UI 中, Padding 和 Margin 有什么区别?
2.AIDL 的全称是什么?如何工作?能处理哪些类型的数据?
3.请解释下 Android 程序运行时权限与文件系统权限的区别。
4.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?
5.如何加载的音乐信息,如何改善其效率。
6.启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别
<<<<<<<<<<答案<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1.Padding 是文字相对于边框,而 Margin 是边框相对于父窗体。
2.AIDL 是一种接口定义语言,用于约束两个进程间的通信规则,供编译器生成代码,实现 Android 设备上的进程间通信。 进程之间的通信信息首先会被转换成 AIDL 协议消息,然后发送给对方,对方受到 AIDL 协 议消息后再转换成相应的对象。 AIDL 支持的类型包括 Java 基础类型和 String,List,Map,CharSequence,如果使用自定 义类型,必须实现 Parcelable 接口。  
3.运行时 Dalvik( android 授权)  文件系统 linux 内核授权  
4.在action 赋值为”android.intent.action.VIEW“ 时可接收如下scheme 为"http" 等等类型的 data 。所以突发奇想,启动该程序后,指定 action 及 Uri ,即访问指定网页。
5.Android 系统提供了 MediaScanner,MediaProvider,MediaStore 等接口,并且提供了一套 数据库表格,通过 Content Provider 的方式提供给用户。当手机开机或者有 SD 卡插拔等事 件发生时,系统将会自动扫描 SD 卡和手机内存上的媒体文件,如 audio,video,图片等, 将相应的信息放到定义好的数据库表格中。 改善效率可以从界面需要查询必备数据,不需要的不进行查询。  
6.从主界面启动一个应用程序是通过快捷方式直接调用 mainActivity 启动的,从其他应用程序 调用需要隐式的通过 Action 或者在 Intent 中需要使用 setClass(),且要写明包路径。


1,常用的设计模式有哪些?简单说一下单例模式?
答:5种,
单例模式:构造方法私有化
适配器
工厂模式:负责将大量有共同接口的类实例化  
代理模式:中介作用
观察者模式:ContentProvider 中的一个相关类:contentObservier

2,对适配器了解吗?分几种?
答:是数据在列表试图上显示的一个桥梁,适配器就像一个显示器,
把复杂的数据按我们自己的要求去排列 显示在界面上;
常用的适配器:ArrayAdapter:以数组为数据源                             SimpleAdapter:以集合为数据源
         SimpleCursorAdapter:一般用于数据库,以数据库里查询得到的Cursor为数据源
         自定义适配器: 继承BaseAdapter

3,说说mvc模式的原理,它在android中的运用
答:android的官方建议应用程序的开发采用mvc模式。何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
 l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
2视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
3控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
  在android中mvc的具体体现如下:
    1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。
 2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
 3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。

4, 当调用startActivityForResult时,如何获取并处理返回的结构
答:通过onActivityResult(int requestCode, int resultCode, Intent data)处理返回的数据
requestCode:调用startActivityForResult(Intent intent, int requestCode)时传递过去的请求码。
resultCode:被调用的Activity执行setResult(int resultCode, Intent intent)时传递的结果码,一般有RESULT_CANCELED,RESULT_OK等,用于区分被调用的Activity传回的不同结果
data:被调用的Activity传回来的数据,可以用data.getExtras()得到数据,用Bundle类型的变量来接收,调用get…(String key)来获取对应的值


1. 请介绍下ContentProvider是如何实现数据共享的。创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Contentprovider中,前提是有相同数据类型并且有写入Content provider的权限。

 2. 注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。 Android广播机制(两种注册方法)
  在android下,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承BroadcastReceiver,就可以有一个广播接受器了。有个接受器还不够,我们还得重写BroadcastReceiver里面的onReceiver方法,当来广播的时候我们要干什么,这就要我们自己来实现,不过我们可以搞一个信息防火墙。具体的代码:
  public class SmsBroadCastReceiverextends BroadcastReceiver
  {
  @Override
  public void onReceive(Context context, Intent intent)
  {
  Bundle bundle = intent.getExtras();
  Object[] object = (Object[])bundle.get("pdus");
  SmsMessage sms[]=new SmsMessage[object.length];
  for(int i=0;i
  {
  sms[0] =SmsMessage.createFromPdu((byte[])object);
  Toast.makeText(context, "来自"+sms.getDisplayOriginatingAddress()+"的消息是:"+sms.getDisplayMessageBody(),Toast.LENGTH_SHORT).show();
  }
  //终止广播,在这里我们可以稍微处理,根据用户输入的号码可以实现短信防火墙。
  abortBroadcast();
  }
  }
  当实现了广播接收器,还要设置广播接收器接收广播信息的类型,这里是信息:android.provider.Telephony.SMS_RECEIVED
  我们就可以把广播接收器注册到系统里面,可以让系统知道我们有个广播接收器。这里有两种,一种是代码动态注册:
  //生成广播处理
  smsBroadCastReceiver = newSmsBroadCastReceiver();
  //实例化过滤器并设置要过滤的广播
  IntentFilter intentFilter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
  //注册广播
  BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,intentFilter);
  一种是在AndroidManifest.xml中配置广播
  package="spl.broadCastReceiver"
  android:versionCode="1"
  android:versionName="1.0">
  android:label="@string/app_name">
  两种注册类型的区别是:
  1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
  2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

3. AIDL的全称是什么?如何工作?能处理哪些类型的数据?AIDL的英文全称是Android Interface Define Language
  当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的
  A工程:
  首先我们在net.blogjava.mobile.aidlservice包中创建一个RemoteService.aidl文件,在里面我们自定义一个接口,含有方法get。ADT插件会在gen目录下自动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.stub的内部类,该内部类中含有aidl文件接口的get方法。
  说明一:aidl文件的位置不固定,可以任意
  然后定义自己的MyService类,在MyService类中自定义一个内部类去继承RemoteService.stub这个内部类,实现get方法。在onBind方法中返回这个内部类的对象,系统会自动将这个对象封装成IBinder对象,传递给他的调用者。
  其次需要在AndroidManifest.xml文件中配置MyService类,代码如下:
  为什么要指定调用AIDL服务的ID,就是要告诉外界MyService这个类能够被别的进程访问,只要别的进程知道这个ID,正是有了这个ID,B工程才能找到A工程实现通信。
  说明:AIDL并不需要权限
  B工程:
  首先我们要将A工程中生成的RemoteService.java文件拷贝到B工程中,在bindService方法中绑定aidl服务
  绑定AIDL服务就是将RemoteService的ID作为intent的action参数。
  说明:如果我们单独将RemoteService.aidl文件放在一个包里,那个在我们将gen目录下的该包拷贝到B工程中。如果我们将RemoteService.aidl文件和我们的其他类存放在一起,那么我们在B工程中就要建立相应的包,以保证RmoteService.java文件的报名正确,我们不能修改RemoteService.java文件
  bindService(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection, Context.BIND_AUTO_CREATE);
  ServiceConnection的onServiceConnected(ComponentName name, IBinderservice)方法中的service参数就是A工程中MyService类中继承了RemoteService.stub类的内部类的对象。

4. 请解释下Android程序运行时权限与文件系统权限的区别。
运行时权限Dalvik( android授权)
  文件系统 linux 内核授权


1. Intent传递数据时,可以传递哪些类型数据?
Intent间传送数据一般有两种常用的办法:
1.extra
2.data.
extra可以用Intent.putExtra放入数据。新启动的Activity可用Intent.getExtras取出来Bundle, 然后用Bundles.getLong, getInt, getBoolean, getString等函数来取放进入的值。
而data则是传输url。url可以是指我们熟悉的http, ftp 等网络地址,也可以指content来指向ContentProvider提供的资源。Intent.setData可以放入数据,Intent.getData可以取出数据。

2.Android系统中GC什么情况下会出现内存泄露呢?
出现情况:1. 数据库的cursor没有关闭2.构造adapter时,没有使用缓存contentview衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程/3.Bitmap对象不使用时采用recycle()释放内存4.activity中的对象的生命周期大于activity调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]

3.Android UI中的View如何刷新。
一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用View的onDraw()方法。

4.android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别。
DOM解析
优点: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更简明,而且不需要扫描完整个流。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值