Android 面试题

1. 请描述Android的系统架构

2. 横竖屏切换时候的activity的生命周期

3. 如何在系统中定义一个系统级的Service

4. 请写出四个系统中定义的常用广播

5. Intent的匹配机制是如何进行的

6. 什么是ANR,如何避免

7. 谈谈Android的IPC机制

8. Android中一般解析XML有哪几种方式?他们的实现原理是?

9. 请代码描述SharedPreferences存储如下信息:Company:CKT

10. 请描述下Android中View与ViewGroup的关系

11. Service和Thread之间的区别

12. Sqlite支持事务么?请问事务具体用在哪些地方

答案如下(从网上找的):

1.请描述Android的系统架构

Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。

 

Android系统架构之应用程序

Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。

Android系统架构之应用程序框架

开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。

隐藏在每个应用后面的是一系列的服务和系统, 其中包括;

* 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。

* 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据

* 资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。

* 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。

* 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。

有关更多的细节和怎样从头写一个应用程序,请参考 如何编写一个 Android 应用程序.

Android系统架构之系统运行库

1)程序库

Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:

* 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。

* 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

* Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。

* LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。

* SGL - 底层的2D图形引擎

* 3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。

* FreeType -位图(bitmap)和矢量(vector)字体显示。

* SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。

2)Android 运行库

Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。

每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。

Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。

Android系统架构之Linux 内核

Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层

2. 横竖屏切换时候的activity的生命周期

      1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次        (onSaveInstanceState-->
  onPause-->
  onStop-->
  onDestroy-->
  onCreate-->
  onStart-->
  onRestoreInstanceState-->
  onResume-->

 

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

 

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

3. 如何在系统中定义一个系统级的Service

     转自:http://blog.csdn.net/jinliang_890905/article/details/7320234

一.添加java 系统级服务:
      目前网站上介绍的比较多,但是没有很详细的步骤和流程。现总结如下:
	以 AlarmManagerService为例
	Java层服务顾名思义即为从 Java层提供的服务,它与 C++层的服务不同之处在于其服务进程的运行由系统( ServiceManager)统一维护。在文件 frameworks /base /services /java /com /android /server /SystemServer.java 中我们可以看到以下代码:

AlarmManagerService alarm = new AlarmManagerService (context );
ServiceManager .addService (Context .ALARM_SERVICE , alarm );
         这个操作在系统启动时完成,由 ServiceManager 负责创建服务进程并运行之。
        在目录/frameworks/base/core/java中IAlarmManager.aidl文件.
	在目录frameworks/base/services/java/com/android/server中AlarmManagerService的aidl的实现类,
	在目录frameworks/base/services/java/com/android/server增加 service的实现文件.

二.实验测试添加java 系统级服务步骤:
1.增加aidl文件
在目录/frameworks/base/core/java/android/app下增加中IDvbService.aidl.

package android.app;

interface IDvbService {
	int countTest(in int testvalue);
}
2.在目录frameworks/base/services/java/com/android/server中增加DvbManagerService实现IDvbService.aidl类

package com.android.server;


import android.content.Context;
import android.util.Slog;
import android.app.IDvbService;

class DvbManagerService extends IDvbService.Stub {
 
    private static final String TAG = "DvbManagerService";
    private static final boolean localLOGV = false;

    private final Context mContext;
    
    public DvbManagerService(Context context) {
        super();
        mContext = context;
        Slog.w(TAG, "DvbManagerService");
    }
    
    public int countTest(int value){
    	return value*2;
    }
    
}

3.在文件 frameworks /base /services /java /com /android /server /SystemServer.java 类中run()方法中增加
   Slog.i(TAG, "Alarm DvbManagerService");
   DvbManagerService dvb = new DvbManagerService(context);//dvb
   Slog.i(TAG, "Alarm DvbManagerService dvb ="+dvb);
   ServiceManager.addService(Context.DVB_SERVICE, dvb);
4.在文件/frameworks/base/core/java/android/content/Context.java中增加
   public static final String DVB_SERVICE = "dvb";//dvb
5.在文件/frameworks/base/core/java/android/app中增加DvbManager.java
package android.app;

import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.os.ServiceManager;


public class DvbManager{
	//dvb

    private final IDvbService mService;

    /**
     * package private on purpose
     */
    DvbManager(IDvbService service) {
        mService = service;
    }
    

    public int count(int value) {
        try {
        	return mService.countTest(value);
        } catch (RemoteException ex) {
        }
        return -1;
    }

    
}
6.在文件/frameworks/base/core/java/android/app/ContextImpl.java中
新增加属性

    private static DvbManager sDvbManager;//dvb

    在getSystemService(String name)方中增加

    else if (DVB_SERVICE.equals(name)) {//dvb
	return getDvbManager();
} 另外增加方法 private DvbManager getDvbManager() {//dvb Log.e(TAG, "getDvbManager sSync = "+sSync); Log.e(TAG, "getDvbManager sDvbManager = "+sDvbManager); synchronized (sSync) { if (sDvbManager == null) { IBinder b = ServiceManager.getService(DVB_SERVICE); Log.e(TAG, "getDvbManager IBinder = "+b); IDvbService service = IDvbService.Stub.asInterface(b); Log.e(TAG, "getDvbManager IDvbService = "+service); sDvbManager = new DvbManager(service); } } return sDvbManager; } 7.在/frameworks/base/Android.mk中 LOCAL_SRC_FILES += \ 下增加 core/java/android/app/IDvbService.aidl \ 8.在应用调用如下: 导入import android.app.DvbManager; 用法 DvbManager dvb=(DvbManager)getSystemService(DVB_SERVICE);
int count = dvb.count(9);
Toast.makeText( TVMainActivity.this,"dvb.count(9) back = "+count, Toast.LENGTH_SHORT).show(); 9.编译如下: (1)首先编译 frameworks . build/envsetup.sh choosecombo make -j4 framework 编译后会生成framework.jar (2)然后编译frameworks/base/services/java的service make -j4 frameworks/base/services/java 编译后会生成services.jar (3)编译应用 因为服务是自定义的,所有必须在自定义的sdk中编译才能使用。

4. 请写出四个系统中定义的常用广播

String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式。. "android.intent.action.ADD_SHORTCUT" 
String ALL_APPS_ACTION 动作:列举所有可用的应用。 
输入:无。 "android.intent.action.ALL_APPS" 
String ALTERNATIVE_CATEGORY 类别:说明 activity 是用户正在浏览的数据的一个可选操作。 "android.intent.category.ALTERNATIVE" 
String ANSWER_ACTION 动作:处理拨入的电话。 "android.intent.action.ANSWER" 
String BATTERY_CHANGED_ACTION 广播:充电状态,或者电池的电量发生变化。 "android.intent.action.BATTERY_CHANGED" 
String BOOT_COMPLETED_ACTION 广播:在系统启动后,这个动作被广播一次(只有一次)。 "android.intent.action.BOOT_COMPLETED" 
String BROWSABLE_CATEGORY 类别:能够被浏览器安全使用的 activities 必须支持这个类别。 "android.intent.category.BROWSABLE" 
String BUG_REPORT_ACTION 动作:显示 activity 报告错误。 "android.intent.action.BUG_REPORT" 
String CALL_ACTION 动作:拨打电话,被呼叫的联系人在数据中指定。 "android.intent.action.CALL" 
String CALL_FORWARDING_STATE_CHANGED_ACTION 广播:语音电话的呼叫转移状态已经改变。 "android.intent.action.CFF" 
String CLEAR_CREDENTIALS_ACTION 动作:清除登陆凭证 (credential)。 "android.intent.action.CLEAR_CREDENTIALS" 
String CONFIGURATION_CHANGED_ACTION 广播:设备的配置信息已经改变,参见 Resources.Configuration. "android.intent.action.CONFIGURATION_CHANGED" 
Creator CREATOR 无 无 
String DATA_ACTIVITY_STATE_CHANGED_ACTION 广播:电话的数据活动(data activity)状态(即收发数据的状态)已经改变。 "android.intent.action.DATA_ACTIVITY" 
String DATA_CONNECTION_STATE_CHANGED_ACTION 广播:电话的数据连接状态已经改变。 "android.intent.action.DATA_STATE" 
String DATE_CHANGED_ACTION 广播:日期被改变。 "android.intent.action.DATE_CHANGED" 
String DEFAULT_ACTION 动作:和 VIEW_ACTION 相同,是在数据上执行的标准动作。 "android.intent.action.VIEW" 
String DEFAULT_CATEGORY 类别:如果 activity 是对数据执行确省动作(点击, center press)的一个选项,需要设置这个类别。 "android.intent.category.DEFAULT" 
String DELETE_ACTION 动作:从容器中删除给定的数据。 "android.intent.action.DELETE" 
String DEVELOPMENT_PREFERENCE_CATEGORY 类别:说明 activity 是一个设置面板 (development preference panel). "android.intent.category.DEVELOPMENT_PREFERENCE" 
String DIAL_ACTION 动作:拨打数据中指定的电话号码。 "android.intent.action.DIAL" 
String EDIT_ACTION 动作:为制定的数据显示可编辑界面。 "android.intent.action.EDIT" 
String EMBED_CATEGORY 类别:能够在上级(父)activity 中运行。 "android.intent.category.EMBED" 
String EMERGENCY_DIAL_ACTION 动作:拨打紧急电话号码。 "android.intent.action.EMERGENCY_DIAL" 
int FORWARD_RESULT_LAUNCH 启动标记:如果这个标记被设置,而且被一个已经存在的 activity 用来启动新的 activity,已有 activity 的回复目标 (reply target) 会被转移给新的 activity。 16 0x00000010 
String FOTA_CANCEL_ACTION 广播:取消所有被挂起的 (pending) 更新下载。 "android.server.checkin.FOTA_CANCEL" 
String FOTA_INSTALL_ACTION 广播:更新已经被确认,马上就要开始安装。 "android.server.checkin.FOTA_INSTALL" 
String FOTA_READY_ACTION 广播:更新已经被下载,可以开始安装。 "android.server.checkin.FOTA_READY" 
String FOTA_RESTART_ACTION 广播:恢复已经停止的更新下载。 "android.server.checkin.FOTA_RESTART"
String FOTA_UPDATE_ACTION 广播:通过 OTA 下载并安装操作系统更新。 "android.server.checkin.FOTA_UPDATE" 
String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 类别:To be used as code under test for framework instrumentation tests. "android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" 
String GADGET_CATEGORY 类别:这个 activity 可以被嵌入宿主 activity (activity that is hosting gadgets)。 "android.intent.category.GADGET" 
String GET_CONTENT_ACTION 动作:让用户选择数据并返回。 "android.intent.action.GET_CONTENT" 
String HOME_CATEGORY 类别:主屏幕 (activity),设备启动后显示的第一个 activity。 "android.intent.category.HOME" 
String INSERT_ACTION 动作:在容器中插入一个空项 (item)。 "android.intent.action.INSERT" 
String INTENT_EXTRA 附加数据:和 PICK_ACTIVITY_ACTION 一起使用时,说明用户选择的用来显示的 activity;和 ADD_SHORTCUT_ACTION 一起使用的时候,描述要添加的快捷方式。 "android.intent.extra.INTENT" 
String LABEL_EXTRA 附加数据:大写字母开头的字符标签,和 ADD_SHORTCUT_ACTION 一起使用。 "android.intent.extra.LABEL" 
String LAUNCHER_CATEGORY 类别:Activity 应该被显示在顶级的 launcher 中。 "android.intent.category.LAUNCHER" 
String LOGIN_ACTION 动作:获取登录凭证。 "android.intent.action.LOGIN" 
String MAIN_ACTION 动作:作为主入口点启动,不需要数据。 "android.intent.action.MAIN" 
String MEDIABUTTON_ACTION 广播:用户按下了“Media Button”。 "android.intent.action.MEDIABUTTON" 
String MEDIA_BAD_REMOVAL_ACTION 广播:扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)。 "android.intent.action.MEDIA_BAD_REMOVAL" 
String MEDIA_EJECT_ACTION 广播:用户想要移除扩展介质(拔掉扩展卡)。 "android.intent.action.MEDIA_EJECT" 
String MEDIA_MOUNTED_ACTION 广播:扩展介质被插入,而且已经被挂载。 "android.intent.action.MEDIA_MOUNTED" 
String MEDIA_REMOVED_ACTION 广播:扩展介质被移除。 "android.intent.action.MEDIA_REMOVED" 
String MEDIA_SCANNER_FINISHED_ACTION 广播:已经扫描完介质的一个目录。 "android.intent.action.MEDIA_SCANNER_FINISHED" 
String MEDIA_SCANNER_STARTED_ACTION 广播:开始扫描介质的一个目录。 "android.intent.action.MEDIA_SCANNER_STARTED" 
String MEDIA_SHARED_ACTION 广播:扩展介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享。 "android.intent.action.MEDIA_SHARED" 
String MEDIA_UNMOUNTED_ACTION 广播:扩展介质存在,但是还没有被挂载 (mount)。 "android.intent.action.MEDIA_UNMOUNTED" 
String MESSAGE_WAITING_STATE_CHANGED_ACTION 广播:电话的消息等待(语音邮件)状态已经改变。 "android.intent.action.MWI" 
int MULTIPLE_TASK_LAUNCH 启动标记:和 NEW_TASK_LAUNCH 联合使用,禁止将已有的任务改变为前景任务 (foreground)。 8 0x00000008 
String NETWORK_TICKLE_RECEIVED_ACTION 广播:设备收到了新的网络 "tickle" 通知。 "android.intent.action.NETWORK_TICKLE_RECEIVED" 
int NEW_TASK_LAUNCH 启动标记:设置以后,activity 将成为历史堆栈中的第一个新任务(栈顶)。 4 0x00000004 
int NO_HISTORY_LAUNCH 启动标记:设置以后,新的 activity 不会被保存在历史堆栈中。 1 0x00000001 
String PACKAGE_ADDED_ACTION 广播:设备上新安装了一个应用程序包。 "android.intent.action.PACKAGE_ADDED" 
String PACKAGE_REMOVED_ACTION 广播:设备上删除了一个应用程序包。 "android.intent.action.PACKAGE_REMOVED" 
String PHONE_STATE_CHANGED_ACTION 广播:电话状态已经改变。 "android.intent.action.PHONE_STATE" 
String PICK_ACTION 动作:从数据中选择一个项目 (item),将被选中的项目返回。 "android.intent.action.PICK" 
String PICK_ACTIVITY_ACTION 动作:选择一个 activity,返回被选择的 activity 的类(名)。 "android.intent.action.PICK_ACTIVITY" 
String PREFERENCE_CATEGORY 类别:activity是一个设置面板 (preference panel)。 "android.intent.category.PREFERENCE" 
String PROVIDER_CHANGED_ACTION 广播:更新将要(真正)被安装。 "android.intent.action.PROVIDER_CHANGED" 
String PROVISIONING_CHECK_ACTION 广播:要求 polling of provisioning service 下载最新的设置。 "android.intent.action.PROVISIONING_CHECK" 
String RUN_ACTION 动作:运行数据(指定的应用),无论它(应用)是什么。 "android.intent.action.RUN" 
String SAMPLE_CODE_CATEGORY 类别:To be used as an sample code example (not part of the normal user experience). "android.intent.category.SAMPLE_CODE" 
String SCREEN_OFF_ACTION 广播:屏幕被关闭。 "android.intent.action.SCREEN_OFF" 
String SCREEN_ON_ACTION 广播:屏幕已经被打开。 "android.intent.action.SCREEN_ON" 
String SELECTED_ALTERNATIVE_CATEGORY 类别:对于被用户选中的数据,activity 是它的一个可选操作。 "android.intent.category.SELECTED_ALTERNATIVE" 
String SENDTO_ACTION 动作:向 data 指定的接收者发送一个消息。 "android.intent.action.SENDTO" 
String SERVICE_STATE_CHANGED_ACTION 广播:电话服务的状态已经改变。 "android.intent.action.SERVICE_STATE" 
String SETTINGS_ACTION 动作:显示系统设置。输入:无。 "android.intent.action.SETTINGS" 
String SIGNAL_STRENGTH_CHANGED_ACTION 广播:电话的信号强度已经改变。 "android.intent.action.SIG_STR" 
int SINGLE_TOP_LAUNCH 启动标记:设置以后,如果 activity 已经启动,而且位于历史堆栈的顶端,将不再启动(不重新启动) activity。 2 0x00000002 
String STATISTICS_REPORT_ACTION 广播:要求 receivers 报告自己的统计信息。 "android.intent.action.STATISTICS_REPORT" 
String STATISTICS_STATE_CHANGED_ACTION 广播:统计信息服务的状态已经改变。 "android.intent.action.STATISTICS_STATE_CHANGED" 
String SYNC_ACTION 动作:执行数据同步。 "android.intent.action.SYNC" 
String TAB_CATEGORY 类别:这个 activity 应该在 TabActivity 中作为一个 tab 使用。 "android.intent.category.TAB" 
String TEMPLATE_EXTRA 附加数据:新记录的初始化模板。 "android.intent.extra.TEMPLATE" 
String TEST_CATEGORY 类别:作为测试目的使用,不是正常的用户体验的一部分。 "android.intent.category.TEST" 
String TIMEZONE_CHANGED_ACTION 广播:时区已经改变。 "android.intent.action.TIMEZONE_CHANGED" 
String TIME_CHANGED_ACTION 广播:时间已经改变(重新设置)。 "android.intent.action.TIME_SET" 
String TIME_TICK_ACTION 广播:当前时间已经变化(正常的时间流逝)。 "android.intent.action.TIME_TICK" 
String UMS_CONNECTED_ACTION 广播:设备进入 USB 大容量存储模式。 "android.intent.action.UMS_CONNECTED" 
String UMS_DISCONNECTED_ACTION 广播:设备从 USB 大容量存储模式退出。 "android.intent.action.UMS_DISCONNECTED" 
String UNIT_TEST_CATEGORY 类别:应该被用作单元测试(通过 test harness 运行)。 "android.intent.category.UNIT_TEST" 
String VIEW_ACTION 动作:向用户显示数据。 "android.intent.action.VIEW" 
String WALLPAPER_CATEGORY 类别:这个 activity 能过为设备设置墙纸。 "android.intent.category.WALLPAPER" 
String WALLPAPER_CHANGED_ACTION 广播:系统的墙纸已经改变。 "android.intent.action.WALLPAPER_CHANGED" 
String WALLPAPER_SETTINGS_ACTION 动作:显示选择墙纸的设置界面。输入:无。 "android.intent.action.WALLPAPER_SETTINGS" 
String WEB_SEARCH_ACTION 动作:执行 web 搜索。 "android.intent.action.WEB_SEARCH" 
String XMPP_CONNECTED_ACTION 广播:XMPP 连接已经被建立。 "android.intent.action.XMPP_CONNECTED" 
String XMPP_DISCONNECTED_ACTION 广播:XMPP 连接已经被断开。 "android.intent.action.XMP"

5. Intent的匹配机制是如何进行的

      Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有<intent-filter>及其中定义的Intent,通过PackageManager(注:PackageManager能够得到当前设备上所安装的application package的信息)来查找能处理这个Intent的component。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
      1.  如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
      2.  如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
      3.  如果Intent中的数据不是content:类型的URI,而且Intent也没有明确指定type,将根据Intent中数据的scheme(比如 http:或者mailto:)进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
     4. 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

 6. 什么是ANR,如何避免

  ANR:Application Not Responding。在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应,当用户操作的在5s内应用程序没能做出反应,BroadcastReceiver在10秒内没有执行完毕,就会出现应用程序无响应对话框,这既是ANR。
  避免方法:Activity应该在它的关键生命周期方法里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者异步方式)来完成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。

7. 谈谈Android的IPC机制

      IPC是内部进程通信的简称,是共享"命名管道"的资源。Android中的IPC机制是为了让ActivityService之间可以随时的进行交互,故在Android中该机制,只适用于ActivityService之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。

8. Android中一般解析XML有哪几种方式?他们的实现原理是?

  Android解析XML的方式有:SAX(Simple API for XML),DOM(Document Object Model),android自带的PULL。

  SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

  DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大

  Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

9.请代码描述SharedPreferences存储如下信息:Company:CKT

  SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:

  一、根据Context获取SharedPreferences对象

  二、利用edit()方法获取Editor对象。

  三、通过Editor对象存储key-value键值对数据。

  四、通过commit()方法提交数据。

   

  1.  SharedPreferences companyInfo = getSharedPreferences("company_info"0);  
  2.  userInfo.edit().putString("Company""CKT")commit();  
  3.    

10. 请描述下Android中View与ViewGroup的关系

Android中的View与我们以前理解的“视图”不同。在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window。

ViewGroup是一个可以包含子View的容器,是布局文件和View容器的基类。在这个类里定义了ViewGroup.LayoutParams类,这个类是布局参数的子类。

       其实ViewGroup也就是View的容器。通过ViewGroup.LayoutParams来指定子View的参数。

ViewGroup作为一个容器,为了制定这个容器应有的标准所以为其指定了接口

11. Service和Thread之间的区别

1.Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上,service和调用者之间的通讯都是同步的(不论是远程service还是本地service),它跟线程一点关系都没有!

2.Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用,也就是你下次启动的时候,无法控制之前创建的线程,而service则可以。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。

3.你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,这些是 Thread 做不到的。   

12. Sqlite支持事务么?请问事务具体用在哪些地方

     Sqlite支持事务,使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果为成功则提交事务,否则回滚事务。当应用需要提交事务,必须在程序执行到endTransaction()方法之前使用setTransactionSuccessful() 方法设置事务的标志为成功,如果不调用setTransactionSuccessful() 方法,默认会回滚事务。

如果你知道你要同步删除很多数据,不仿把它们做成一个统一的事务。

通常一次 sqlite3_exec 就是一次事务,如果你要删除1万条数据,sqlite就做了1万次:开始新事务->删除一条数据->提交事务->开始新事务->… 的过程。这个操作是很慢的。因为时间都花在了开始事务、提交事务上。

你可以把这些同类操作做成一个事务,这样如果操作错误,还能够回滚事务。

事务的操作没有特别的接口函数,它就是一个普通的 sql 语句而已:

分别如下:

int result; 

result = sqlite3_exec( db, "begin transaction", 0, 0, &zErrorMsg ); //开始一个事务

result = sqlite3_exec( db, "commit transaction", 0, 0, &zErrorMsg ); //提交事务

result = sqlite3_exec( db, "rollback transaction", 0, 0, &zErrorMsg ); //回滚事务

 

posted @ 2013-06-25 20:36  天涯雪  阅读(467)  评论(0编辑  收藏  举报