Android面试宝典(更新中)

Java知识点包括:接口与抽象的使用及区别,多线程,socket基础,集合类,也有个别公司考察定义,很无语.

C/C++知识点包括:指针的移动,排序算法,链表,有时还会有二叉树的遍历或图的遍历.

1.Android 手机操作系统的四层架构

Applications  Application Framework  Android RunTime Libraries   Liunx Kernel 

  架构框架以此从上到下

   1.Applications   (应用程序(应用层))

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

  2.Application FrameWork    (应用程序扩展层(框架))

 由于 Android 的手机操作系统是,基于Liunx 2.6系统之上封装而成.所以开发人员可也

以直接访问核心程序所使用的API框架,该核心应用程序的API框架设计简化了组件的重用任何一个核心应用程序(模块)都暴露出它的功能作用,并且其他应用程序也都可以使用该核心应用程序(模块)的功能(不过的遵守该核心应用程序框架的安全性限制).同样,该应用程序的重用机制也使用户方便使用应程序的相关组件

  API框架隐藏的核心应用程序是一系列的应用程序的服务和系统应用,其中包括如下

  (Android手机中的View 是最基本的一个 UI

 丰富而又可扩展的视图(手机界面所显示的组件(Activity上所显示的))组件,可以用

来构建应用程序 :(视图)Views, 网格(grids), 文本框(text boxes), 按钮(button), 

置图片区(imageview),文本编辑区  (edittext), 文本显示区(textview ), 

  3.Android RunTime Libraries  (Android系统运行库) 

  4.Liunx Kernel  (Android 系统最底层核心系统 Liunx) 

2. Android dvm的进程和Linux的进程,应用程序的进程是否为同一个概念?

DVMdalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念.

3. SIM卡的EF文件有何作用?

SIM卡的文件系统有自己规范,主要是为了和手机通讯,SIM卡本身可以有自己的操作系统,EF就是作存储并和手机通讯用的.

4. 一条最长的短信息约占多少byte?  

中文70(包括标点),英文160个字节.

5. Android中的动画有哪几类,它们的特点和区别是什么?

  两种.一种是Tween动画.还有一种是Frame动画.

  Tween动画,这种实现方式可以使视图组件移动.放大.缩小以及产生透明度的变化另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影.

6. 什么是嵌入式实时操作系统,Android操作系统属于实时操作系统吗?

   嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统.主要用于工业控制,军事设备,航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统.又可分为软实时和硬实时两种,Android是基于linux内核的,因此属于软实时.

7. Handler机制的原理?

    Andriod提供了HandlerLooper来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message Exchange).

1)Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列).

2)Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue;或者接收LooperMessage Queue取出)所送来的消息.

3) Message Queue(消息队列):用来存放线程放入的消息.

4)线程:UI thread通常就是main thread,Android启动程序时会替它建立一个Message Queue.

8. 嵌入式操作系统内存管理有哪几种,各有何特性?

页式,段式,段页,用到了MMU,虚拟空间等技术

9.说说mvc模式的原理,它在android中的运用

MVC(Model_view_contraller)”模型_视图_控制器”. MVC  应用程序总是由这三个部

分组成.Event(事件)导致Controller改变Model View,或者同时改变两者.只要  Controller改变了Models 的数据或者属性,所有依赖的View都会自动更新.类似的,只要Controller改变了View,View 会从潜在的Model中获取数据来刷新自己.

10.  Activity的生命周期,两个Activity之间跳转时必然会执行的是那几个方法?

onCreate() //activity生命周期开始时被调用.

onRestoreInstanceState()//onCreate完成后被调用,用来恢复UI状态.

onRestart() //activity从停止状态重新启动时调用.

onStart() //activity对用户即将可见的时候调用.

onResume() //activity与用户交互的时候,重绘屏幕.

onSaveInstanceState() //activity即将移出栈顶保留UI状态时调用此方法.

onPause() //当系统要启动一个其他的activity时调用(其他的activity显示之前,这个方法被用来提交那些持久数据的改变.停止动画.和其他占用 CPU资源的东西.由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快.

onStop() //用户不再可见时调用

onDestroy //activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况

     1.完整生命周期即一个activity从出现到消失,对应的周期方法是从onCreateonDestroy
     2. 
可见生命周期:onStart()onStop()方法,在这个周期中,用户可以看见Activity,但不一定能够与之交互,这两个方法可以随着状态的变化被执行多次.
     3. 
前景生命周期:onResume()onPause()方法,在这个周期中,Activity处在其它Activity之前,即在Activity栈的最顶端,负责与用户进行交互,伴随着状态的变化,这两个方法可以被执行多次

11. 两个Activity之间跳转时必然会执行的是哪几个方法.
1.启动一个Activity

   启动一个新的Activity需调用StartActivity(Intent )函数.参数 Intent  一个Intent对象,

    若要在两个Activity之间进行跳转我们还得借助Intent类中另的外一个函数.

      public Intent setClass(Context packageContext,Class<?>cls)其返回值为一个Intent对象(即你要跳转到得ActivityIntent对象)

2.从一个Activity获取另外一个Activity中的数据结果

   例如:你在某个app 中点击了按键跳转到了另外一个Activity(此处我暂称为子Activity)中,在此Activity中你让用户选择联系人列表中的联系人,而在此Activity结束后需要在上层Activity(此处我暂称为父Activity)中需显示子Activity中返回的联系人名字.

   要想做到上述功能,我们需做一下三件事

   (a)在父Activity中调用StartActivityForResult(Intent ,int ;

   (b)在父Activity中实现OnActivityResult(int requestCode, int resultCode, Intent Date

       参数分析:requestCode:此参数传个StartActivityForResult 为了确定是谁请求的.

       resultCode:此参数是SetReuslt(Intent Date)的返回值为Intent对象.

       Date :Intent对象返回给调用者.

   (c)在子Activity快要退出时调用SetReuslt(Intent Date)函数用于回调父Activity中的

          OnActivityResult(int requestCode, int resultCode, Intent Date)函数.

12. 横竖屏切换时候Activity的生命周期.

1. 不设置Activityandroid:configChanges,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

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

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

13. 如何将一个Activity设置成窗口的样式.

1.在你的styles.xml文件中可以新建一如下的style:

    <style name="Theme.FloatActivity" parent="android:style/Theme.Dialog">
        <!-- float_box为我们定义的窗口背景,这个不是必须的-->
        <item name="android:windowBackground">@drawable/float_box</item>
    </style>如果窗口要添加窗口背景,可以在drawable中新建一个叫float_box.xml的文件,内容可以如下(自定义):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff" />
    <stroke android:width="3dp" color="#000000" />
    <corners android:radius="3dp" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
</shape>

2.AndroidManifest.xml中在你需要显示为窗口的activity中添加如果属性:android:theme="@style/Theme.FloatActivity"即可

如果说您觉得新建style.xmlfloat_box.xml文件的方式麻烦或者只想Test一下,那么可以直接添加您对应需要展示为Dialog styleActivityandroid:theme属性值为android:theme="@android:style/Theme.Dialog".

14.如何退出Activity?如何安全退出已调用多个ActivityApplication?

对于单一Activity的应用来说,退出很简单,直接finish()即可.当然,也可以用killProcess()System.exit()方法.

15.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

onSaveInstanceState()

当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState().B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate().

14.   两个Activity之间怎么传递数据? 

 邮递员Intent

15.  怎么让在启动一个Activity是就启动一个service?  IntentService

同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?

task就好像是能包含很多activity的栈.默认情况下,一个activity启动另外一个activity,两个activity是放在同一个task栈中的,第二个activity压入第一个 activity所在的task.当用户按下返回键时,第二个activity从栈中弹出,第一个activity又在当前屏幕显示.这样,从用户角度来看,这两个activity就好像是属于同一个应用程序的,即使第二个activity是属于另外一个应用程序的.当然,这是指默认情况下. task栈包含的是activity的对象.如果一个activity有多个实例在运行,那么栈中保存的是每个实例的实体.栈中的activity不会重新排列,只有弹出和压入操作.一个task中的所有activity都以整体的形式移动.整个task可以被移到前台或后台.打个比方,当前的task包含4activity–当前 activity下面有3activity.当用户按下HOME键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的task,当前的task就被转移到后台,新的task中的根activity将被显示在屏幕上.过了一段时间,用户按返回键回到了程序启动器界面,选择了之前运行的程序(之前的task.那个task,仍然包含着4 activity.当用户再次按下返回键时,屏幕不会显示之前留下的那个activity(之前的task的根activity,而显示当前 activitytask栈中移出后栈顶的那个activity.刚刚描述的行为是默认的activitytask的行为.有很多方法能够改变这种行为.activitytask之间的联系,以及task中的 activity的行为可以通过intent中的标记以及在manifest中的<activity>元素的属性控制.其中,主要的Intent标记有:

FLAG_ACTIVITY_NEW_TASK        FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED  FLAG_ACTIVITY_SINGLE_TOP

主要的<activity>属性有: taskAffinity   launchMode   allowTaskReparenting

clearTaskOnLaunch  alwaysRetainTaskState       finishOnTaskLaunch

默认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属性同一个task.然而,每个activity可以通过<activity>中的taskAffinity属性设置单独的affinity.不同应用程序中的activity可以共享同一个 affinity,同一个应用程序中的不同activity也可以设置成不同的affinity.affinity属性决定了:启动activity Intent对象需包含FLAG_ACTIVITY_NEW_TASK标记,activityallowTaskReparenting被认为是设置成 true.

FLAG_ACTIVITY_NEW_TASK标记

当传递给startActivity()Intent对象包含 FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的activity寻找与当前activity不同的task.如果要启动的 activityaffinity属性与当前所有的taskaffinity属性都不相同,系统会新建一个带那个affinity属性的task,并将要启动的activity压到新建的task栈中;否则将activity压入那个affinity属性相同的栈中.

allowTaskReparenting属性

如果一个activityallowTaskReparenting属性为true,那么它可以从一个taskTASK1)移到另外一个有相同affinitytaskTASK2)中(TASK2带到前台时).

如果一个.apk文件从用户角度来看包含了多个应用程序”,你可能需要对那些activity赋不同的affinity.

运行模式

activitylaunchMode属性可以有四种值:

“standard” (默认)  “singleTop“     “singleTask”     “singleInstance“

什么是Service以及描述下它的生命周期.

Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里.需要通过某一个Activity或者其他Context对象来调用, Context.startService() Context.bindService().  如果在Service执行耗时的操作需要启动一个新线程来执行.

Android Service只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service,先后调用了onCreate(),onStart()这两个方法,当停止Service,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启Service,不会在执行onCreate()方法,而是直接执行onStart()方法.

启动一个Service的过程如下:context.startService() |->onCreate()->onStart()->Servicerunning其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务.

停止一个Service的过程如下:context.stopService() |->onDestroy() ->Service stop 

16.  什么是IntentService?有何优点?

 

优点:Acitivity的进程,当处理Intent的时候,会产生一个对应的Service

Android的进程处理器现在会尽可能的不kill掉你.非常容易使用

日历中IntentService的应用

17.  请描述一下Intent Intent Filter.

IntentAndroid中被翻译为"意图",熟语来讲就是目的,他们是三种应用程序基本组件—activity,servicebroadcast receiver之间互相激活的手段.在调用Intent名称时使用ComponentName也就是类的全名时为显示调用.:  

setComponent("org.rickystudio.intentActivity") setClass("org.rickystudio.intentActivity")  setClassName("org.rickystudio.intentActivity")这种方式一般用于应用程序的内部调用,因为你不一定会知道别人写的类的全名.那我们怎么调用呢?有显就有隐嘛.我们来看看隐式Intent怎么用?

 首先我们先配置我们的ActivityIntent Filter <intent-filter>
    <action android:name="com.example.project.SHOW_CURRENT" />
</intent-filter>
这样在调用的时候指定Intentaction,系统就是自动的去对比是哪个intent-filter符合我们的Activity,找到后就会启动Activity.

一个intent filterIntentFilter类的实例,但是它一般不出现在代码中,而是出现在android Manifest文件中,<intent-filter>的形式. (有一个例外是broadcast receiverintent filter是使用Context.registerReceiver()来动态设定的,intent filter也是在代码中创建的.)

一个filteraction, data, category等字段.一个隐式intent为了能被某个intent filter接受,必须通过3个测试.一个intent为了被某个组件接受,则必须通过它所有的intent filter中的一个.

Intent传递数据时,可以传递哪些类型数据?

 Intent传递方式和参数类型:

1.Extra:String[].Parcelable.long.boolean.double.CharSequence[].Parcelable[].char.int[].int.double[].float.short.long[].boolean[].short[].String.Serializable.float[].Bundle.byte[].byte.CharSequence.char[] .  2.Data: URI

请描述一下Broadcast Receiver.

Broadcast Receiver用来接收并处理广播.可以接收系统的广播例如:电量不足.来电来信等.程序也可以播放广播.Broadcast Receiver可以通过多种方式通知用户:启动activity.使用NotificationManager.开启背景灯.振动设备.播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容.

    通常我们的某个应用或系统本身在某些事件(电池电量不足.来电来短信)来临时会广播一个Intent出去,我们可以利用注册一个Broadcast Receiver来监听到这些Intent并获取Intent中的数据.

manifest和代码中如何注册和使用 BroadcastReceiver.

<receiver android:name=".xxReceiver">

   <intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/>

   </intent-filter> </receiver>

请介绍下Android的数据存储方式.

Android中的数据存储方式有以下五种:

1.SharedPreferences:用来存储”key-value paires“格式的数据,它是一个轻量级的键值存储机制,只可以存储基本数据类型.

2.文件存储:通过FileInputStreamFileOutputStream对文件进行操作.Android,文件是一个应用程序私有的,一个应用无法读写其他应用程序的文件.

3.SQLite数据库存储:Android提供的一个标准数据库,支持SQL语句.

4. 网络:通过网络来存储和获得数据.

5.ContentProvider:是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数据共享.它是一个特殊的存储数据的类型,它提供了一套标准的接口用来获取数据.操作数据.系统也提供了音频.视频.图像和个人信息等几个常用的Content Providers.如果你想公开自己的私有数据,可以创建自己的Content Provider,或者当你对这些数据拥有控制.写入的权限时讲这些数据添加到Content Provider中实现共享.外部访问通过ContentResolver去访问并操作这些被暴露的数据.组织数据主要包括:存储数据,读取数据,以数据库的方式暴露数据.数据的存储需要根据设计的需求,选择合适的存储结构,首选数据库,当然也可以选择本地其他文件,甚至可以是网络上的数据.数据的读取,以数据库的方式暴露数据这就要求,无论数据是如何存储的,数据最后必须以数据的方式访问.

请介绍下Android中常用的五种布局.

最常用的布局方式为LinearLayout.RelativeLayout.FrameLayout.TableLayout AbsoluteLayout.其中LinearLayoutRelativeLayout是最常用的方式,他们可以通过在xml配置文件或者代码中进行布局.

1.      FrameLayout 最简单的布局方式,放置的控件都只能罗列到左上角,控件会有重叠,不能进行复杂的布局.

2.      LinearLayou可以通过orientation属性设置线性排列的方向是垂直(vertical)还是纵向(horizontal).每行或每列只有一个元素,可以进行复杂的布局.

3.      AbsoluteLayout 可以让子元素指定准确的x/y坐标值,并显示在屏幕上.AbsoluteLayout没有页边框,允许元素之间互相重叠(尽管不推荐).他是绝对坐标,所以在实际中不提倡使用.

4.      RelativeLayout 允许子元素指定他们相对于其它元素或父元素的位置(通过ID指定).因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素.元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位置来排列.这个是相对于 AbsoluteLayout ,采用的相对坐标,所以在实际中比较常用.

5.      TableLayout 将子元素的位置分配到行或列中.一个TableLayout由许多的TableRow组成,每个TableRow都会定义一个 row .TableLayout容器不会显示row .columncell的边框线.每个 row拥有0个或多个的cell;和html中的table差不多.在实际中也经常使用.有的时候我们也会用到GridView,就像我们手机屏幕上摆放的各个图标应该就是用GridView排版的. Padding是文字相对于边框,Margin是边框相对于父窗体.

LinearLayout TableLayout  FrameLayout   AbsoluteLayout   RelativeLayout

27.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?暂停 onPause” 状态将数据保存.

如何判断是否有SD?

在程序中访问SDCard,你需要申请访问SDCard的权限.

AndroidManifest.xml中加入访问SDCard的权限如下:

<!--SDCard中创建与删除文件权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!--SDCard写入数据权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED.

28.  什么是嵌入式实时操作系统, Android操作系统属于实时操作系统吗?

  嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统.主要用于工业控制,军事设备,航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统.又可分为软实时和硬实时两种,Android是基于linux内核的,因此属于软实时.

29.  Linux中跨进程通信的几种方式 .

1.管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.

2.有名管道 (named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信.

3.信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段.

4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少.管道只能承载无格式字节流以及缓冲区大小受限等缺点.

5.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.

6.共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信.

7.套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信.

30.  谈谈对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提供了的开发工具集合,使开发人员可以便捷地开发.发布组件.同时, Google承诺在 NDK 后续版本中提高 “可调式 ”能力,即提供远程的 gdb工具,使我们可以便捷地调试 C源码.在支持 Android平台 C开发,我们能感觉到 Google花费了很大精力,我们有理由憧憬 “C组件支持 ”只是 Google Android平台上C开发的开端.毕竟, C程序员仍然是码农阵营中的绝对主力,将这部分人排除在Android应用开发之外,显然是不利于 Android平台繁荣昌盛的.

31.  谈谈Android的优点和不足之处.

Android平台手机 5大优势:

.开放性

  在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来.显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟开发性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源.开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机.

.挣脱运营商的束缚

  在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制.从去年iPhone上市 ,用户可以更加方便地连接网络,运营商的制约减少.随着EDGE.HSDPA这些2G3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近.

.丰富的硬件选择

  这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品.功能上的差异和特色,却不会影响到数据同步.甚至软件的兼容,好比你从诺基亚 Symbian风格手机一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用.联系人等资料更是可以方便地转移,是不是非常方便呢?

.不受任何限制的开发商

  Android平台提供给第三方开发商一个十分宽泛.自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生.但也有其两面性,血腥.暴力.情色方面的程序和游戏如可控制正是留给Android难题之一.

.无缝结合的Google应用

 Android5大不足:

.安全和隐私

 由于手机与互联网的紧密联系,个人隐私很难得到保守.除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机.

.首先开卖Android手机的不是最大运营商

 众所周知,T-Mobile23,于美国纽约发布Android首款手机G1.但是在北美市场,最大的两家运营商乃AT&TVerizon,而目前所知取得Android手机销售权的仅有T-MobileSprint,其中T-Mobile3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服务则要另当别论了!

.运营商仍然能够影响到Android手机

  在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般.这样的情况在国外市场同样出现.Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序.

.同类机型用户减少

 在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源.而对于Android平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化.

.过分依赖开发商缺少标准配置

  在使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,Realplay或暴风影音等.但入手开始使用默认的程序同样可以应付多样的需要. Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐播放器,全部依赖第三方开发,缺少了产品的统一性.

32.  Android系统中GC什么情况下会出现内存泄露呢?

出现情况:
1. 
数据库的cursor没有关闭

2.
构造adapter,没有使用缓存contentview
   
衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程/
3.Bitmap
对象不使用时采用recycle()释放内存

4.activity
中的对象的生命周期大于activity
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]

33.  Android UI中的View如何刷新.

Android中对View的更新有很多种方式,使用时要区分不同的应用场合.我感觉最要紧的是分清:多线程和双缓冲的使用情况.

现在可以尝试理解下面的模拟场景:

        两个人:一对夫妻,老公上班,老婆在家,现在他们都要吃饭.

     “不使用多线程和双缓冲的情况是:老公在公司吃,老婆在家吃,互不干扰,吃就是了.

     “使用多线程和不使用双缓冲的情况是:老婆做好饭,另外让人送一份到公司,老公收到饭就可以吃了.

     “使用多线程和使用双缓冲的情况是:老婆做好饭,等老公回家一起吃.

1.不使用多线程和双缓冲

     这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘.你只需在Activity中显式地调用View对象中的invalidate()方法即可.系统会自动调用 ViewonDraw()方法.

2.使用多线程和不使用双缓冲

     这种情况需要开启新的线程,新开的线程就不好访问View对象了.强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadExceptionOnly the original thread that created a view hierarchy can touch its views.

     这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法.android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量,你可以直接调用View对象中的invalidate()方法.也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息.

3.使用多线程和双缓冲

    AndroidSurfaceViewView的子类,她同时也实现了双缓冲.你可以定义一个她的子类并实现SurfaceHolder.Callback接口.由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了.SurfaceHolderlockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得.

34.  简单描述下Android数字签名.

  Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permissionprotectionLevelsignature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限.Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制.Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中.Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序.这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的.

Ø  同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处.

(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本.如果新版程序和旧版程序的数字证书不相同,Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名.

(2)有利于程序的模块化设计和开发.Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序.所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块.

(3)可以通过权限(permission)的方式在多个程序间共享数据和代码.Android提供了基于数字证书的权限赋予机制,应用程序可以和其他的程序共享概功能或者数据给那那些与自己拥有相同数字证书的程序.如果某个权限(permission)protectionLevelsignature,则这个权限就只能授予那些跟该权限所在的包拥有同一个数字证书的程序.

Ø  在签名时,需要考虑数字证书的有效期:

(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级.

(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期.

(3)Android Market强制要求所有应用程序数字证书的有效期要持续到20331022日以后.

Android数字证书包含以下几个要点:

 (1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序

 (2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证

 (3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布.

 (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期.如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能.

35.  android中的动画有哪几类,它们的特点和区别是什么?

 两种.一种是Tween动画.还有一种是Frame动画.

 Tween动画,这种实现方式可以使视图组件移动.放大.缩小以及产生                  透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影. Tween  Frame

 

36.  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,xmlpullsax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序.因为是基于流的处理,因此xmlpullsax都比较节约内存资源,不会象dom那样要把所有节点以对橡树的形式展现在内存中.xmlpullsax更简明,而且不需要扫描完整个流.

37.  DDMSTraceView的区别?

Traceviewandroid平台配备一个很好的性能分析的工具.它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method.

http://wbdban.iteye.com/blog/564309

DDMS为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息.Logcat……

39.也谈android屏幕多分辨率下开发

  1. dpi(Dots Per Inch,点每英寸): 是指输出分辨率,针对于输出设备而言的,在这里是指每英寸的物理光点数,用来表示手机的分辨率,可以反映屏幕的清晰度.
  2. ppi(Pixels Per Inch,像素每英寸):  是指输入分辨率,针对于输入设备而言的,图像ppi值越高,画面的细节就越丰富,因为单位面积的像素数量更多,数码相机拍出来的图片常见的有72ppi,180ppi300ppi.
  3. dip(Device Independent Pixels,设备独立像素): 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGAQVGA推荐使用这个,不依赖像素.(VGA在这是指像素总数640*480)  
  4. density像素密度:   android160DPI密度系数是1.(个人感觉这里和dpi是一个概念,只是单位不同)

   这里提到的WVGA.HVGA.QVGA,通常被表示为手机的分辨率,实则不然.率中文字典中的解释为比值,两数之比.VGA只是一个数值,不是一个比值.而上文提到的dpi确是一个比值.它的计算方法为:dpi=对角线的像素值/屏幕尺寸.

   实战篇    布局中使用dip,layout.xml中使用dp单位,比如10dp.如果在java代码中则需要通过一个计算.首先计算出屏幕的density :  

   如果你的图片大小是10*20像素,那么实际显示 widthpx = 10*density,heightpx = 20*density. 我们也需要为android手机提供3套布局文件和3UI图标.

40. Service有几种启动方式,区别是什么?

启动:Context.startService()   Context.bindService().

关闭: Context.stopService().   Service.stopSelf()    Service.stopSelfResult()

    1.我们用__int_____来定义一个整数,用__char_____来定义一个字符类型,称为原始数据类型。

    2.android中常用的四个布局是_____linearlayout______Framelayout____________Absolutelayout________Tablelayout_____Relativelayout____

    3.android的四大组件是____Activity_______Service___________BroadCastRe____________CotentProiver______

    4.java.io包中的________________________类主要用于对对象(Object)的读写。

    5.androidservice的实现方法是:___StartService____________bindService___________

    6.activity一般会重载7个方法用来维护其生命周期,除了onCreate(),onStart(),onDestory()    外还有_____________,______________,____________,___________

    7.android的数据存储的方式__wenjian_______,__SDcard_________,_SQlite_________,__ContentProvider_______,__wangluo______

8.当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行

 的回调函数是_____onRestart()___________onRestoreInstanceState() startActivityResult

    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';      contentProvider

  }

}

   1. int char        Applications         ApplicationFramework      Libraries   Liunx Kernel

 2.FrameLayout,LilnearLayout,RelativeLayout,TableLayout

 3.Activity,Broadcast,Service,ContentProvide

 4.ObjectInputStream ObjectOutputSteam             contentProvider

 5.startService ,bindService

 6.onRestart(),onResume(),onPause(),onStop()

 7.SharedPreferences存储,文件存储,SQLite存储,ContentProvider,网络存储

 8.startActivityResult()       ContentProvider   SharedPerences

 9.adnroid create acd -n myAvd -t 8 -s HVDA - C d:\card.img

 10.good and gbc

SharedPerences存储

一、简答编程题

 1.jni的调用过程

  1)安装和下载Cygwin,下载 Android NDK

  2)ndk项目中JNI接口的设计

  3)使用C/C++实现本地方法

  4)JNI生成动态链接库.so文件

  5)将动态链接库复制到java工程,在java工程中调用,运行java工程即可

 2.Android应用程序结构是:

  Linux Kernel(Linux内核)Libraries(系统运行库或者是c/c++核心库)Application 

  Framework(开发框架包)Applications     (核心应用程序)

1.        下列哪些语句关于内存回收的说明是正确的? (b ) 

  A、 程序员必须创建一个线程来释放内存

  B、内存回收程序负责释放无用内存 
  C、内存回收程序允许程序员直接释放内存 
  D、内存回收程序可以在指定的时间释放内存对象 

2.        下面异常是属于Runtime Exception 的是(abcd)(多选)    

     A、ArithmeticException

      B、IllegalArgumentException 
      C、NullPointerException 
      D、BufferUnderflowException 

3.         Math.round(11.5)等于多少(). Math.round(-11.5)等于多少(c). 

  A、11 ,-11   B、11 ,-12   C、12 ,-11   D、12 ,-12

4.        下列程序段的输出结果是:(b )
     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.        对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行(d)  

 A、onPause()  B、onCreate()   C、 onResume()   D、onStart()

6.        Intent传递数据时,下列的数据类型哪些可以被传递(abcd)(多选)     

  A、Serializable  B、charsequence  C、Parcelable  D、Bundle

7.        android 中下列属于Intent的作用的是(c)  

A、实现应用程序间的数据共享

  B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失
  C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带
  D、处理一个应用程序整体性的工作

8.        下列属于SAX解析xml文件的优点的是(b)     

 A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能

      B、不用事先调入整个文档,占用资源少
      C、整个文档调入内存,浪费时间和空间
      D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会
  消失

9.         下面的对自定style的方式正确的是(a)    

A、 <resources>

       <style name="myStyle">
                            <itemname="android:layout_width">fill_parent</item>
                     </style>
</resources>
     B、 <style name="myStyle">
                            <itemname="android:layout_width">fill_parent</item>
   </style>
     C、 <resources>
                            <itemname="android:layout_width">fill_parent</item>
  </resources>
     D、 <resources>
                            <stylename="android:layout_width">fill_parent</style>
  </resources>

10.       在android中使用Menu时可能需要重写的方法有(ac)。(多选)    

  A、onCreateOptionsMenu()

  B、onCreateMenu()
  C、onOptionsItemSelected()
  D、onItemSelected()
11.      在SQL Server Management Studio 中运行下列T-SQL语句,其输出值(c) 
     A、      可能为0.1
     B、       可能为3
     C、      不可能为-100
     D、      肯定为0
12.     在SQL Server 2005中运行如下T-SQL语句,假定SALES表中有多行数据,执行查询之     后的结果是(d)。 BEGIN TRANSACTION A
       Update SALES Set qty=30 WHERE qty<30
        BEGIN TRANSACTION B
              Update SALES Set qty=40 WHEREqty<40
              Update SALES Set qty=50 WHEREqty<50
              Update SALES Set qty=60 WHEREqty<60
        COMMIT TRANSACTION B
        COMMIT TRANSACTION A
A、SALES表中qty列最小值大于等于30
B、SALES表中qty列最小值大于等于40
C、SALES表中qty列的数据全部为50
D、SALES表中qty列最小值大于等于60

13.      在android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库版本进行管理的方法可以是(ab)    

A、getWriteableDatabase()

B、getReadableDatabase()
C、getDatabase()
D、getAbleDatabase()

14.     android 关于service生命周期的onCreate()和onStart()说法正确的是(ad)(多选题)    

   A、当第一次启动的时候先后调用onCreate()和onStart()方法

    B、当第一次启动的时候只会调用onCreate()方法
    C、如果service已经启动,将先后调用onCreate()和onStart()方法
    D、如果service已经启动,只会执行onStart()方法,不在执行onCreate()方法

15.     下面是属于GLSurFaceView特性的是(abc)(多选) 

A、管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图

    view上。
B、管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
C、让渲染器在独立的线程里运作,和UI线程分离。
D、可以直接从内存或者DMA等硬件接口取得图像数据

16.     下面在AndroidManifest.xml文件中注册BroadcastReceiver方式正确的(a)    

  A、<receiver android:name="NewBroad">

                     <intent-filter>
                            <action  
                   android:name="android.provider.action.NewBroad"/>
                <action>
                     </intent-filter>
              </receiver>
     B、<receiver android:name="NewBroad">
                     <intent-filter>
                   android:name="android.provider.action.NewBroad"/>
                     </intent-filter>
              </receiver>
     C、<receiver android:name="NewBroad">
                     <action  
                  android:name="android.provider.action.NewBroad"/>
             <action>
              </receiver>
     D、<intent-filter>
         <receiver android:name="NewBroad">
                           <action>
                   android:name="android.provider.action.NewBroad"/>
                  <action>
                     </receiver>
</intent-filter>

17.     关于ContenValues类说法正确的是(a)     

     A、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的

        名是String类型,而值都是基本类型
     B、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的
        名是任意类型,而值都是基本类型
     C、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的
        名,可以为空,而值都是String类型     
     D、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中
        的名是String类型,而值也是String类型

18.     我们都知道Hanlder是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会变得越慢,那么线程销毁的方法是(a)     

     A、onDestroy()

      B、onClear()
      C、onFinish() 
      D、onStop()

19.     下面退出Activity错误的方法是(c)    

        A、finish()

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

20.     下面属于android的动画分类的有(ab)(多项)     

  A、Tween  B、Frame C、Draw D、Animation

21.     下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是(d)     

       ADVMdalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,不一定拥有一个独立Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念.

        BDVMdalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例.而每一个DVM不一定都是在Linux中的一个进程,所以说不是一个概念.
        CDVMdalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例.而每一个DVM不一定都是在Linux中的一个进程,所以说不是一个概念.
        DDVMdalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念.

22.       Android项目工程下面的assets目录的作用是什么B

A、放置应用到的图片资源。

B、主要放置多媒体等数据文件
C、放置字符串,颜色,数组等常量数据
D、放置一些与UI相应的布局文件,都是xml文件

23.       关于res/raw目录说法正确的是(a)

A、这里的文件是原封不动的存储到设备上不会转换为二进制的格式

B、这里的文件是原封不动的存储到设备上会转换为二进制的格式

C、这里的文件最终以二进制的格式存储到指定的包中

D、这里的文件最终不会以二进制的格式存储到指定的包中

24.      下列对android NDK的理解正确的是(abcd )

A、 NDK是一系列工具的集合

B、 NDK 提供了一份稳定、功能有限的 API 头文件声明。
C、 使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式
D、 NDK 将是 Android 平台支持 C 开发的开端

二.填空题
25.      android中常用的四个布局是framlayoutlinenarlayoutrelativelayouttablelayout26.      android 的四大组件是activieyservicebroadcastcontentprovide27.      java.io包中的objectinputstreamobjectoutputstream类主要用于对对象(Object)的读写。28.      android 中service的实现方法是startservicebindservice。29.      activity一般会重载7个方法用来维护其生命周期,除了onCreate(),onStart(),onDestory()  外还有onrestart,onresume,onpause,onstop30.      android的数据存储的方式sharedpreference,文件,SQlite,contentprovider,网络。31.     当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行的回调函数是startActivityResult()32.     请使用命令行的方式创建一个名字为myAvd,sdk版本为2.2,sd卡是在d盘的根目录下,名字为scard.img,并指定屏幕大小HVGA.____________________________________33.       程序运行的结果是:_____good and gbc__________。
   public classExample{
  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'; 
  } 


34.      在android中,请简述jni的调用过程。(8分)

1)安装和下载Cygwin,下载 Android NDK
  2)在ndk项目中JNI接口的设计
  3)使用C/C++实现本地方法
  4)JNI生成动态链接库.so文件
  5)将动态链接库复制到java工程,在java工程中调用,运行java工程即可

35.     简述Android应用程序结构是哪些?(7分)

  Android应用程序结构是:
  Linux Kernel(Linux内核)、Libraries(系统运行库或者是c/c++核心库)、Application  
  Framework(开发框架包)、Applications  (核心应用程序)

36.     请继承SQLiteOpenHelper实现:(10分)  

 1).创建一个版本为1的“diaryOpenHelper.db”的数据库,
   2).同时创建一个 “diary” 表(包含一个_id主键并自增长,topic字符型100
       长度, content字符型1000长度)
    3).在数据库版本变化时请删除diary表,并重新创建出diary表。

publicclass DBHelper  extends SQLiteOpenHelper{

       public final static String DATABASENAME ="diaryOpenHelper.db";
       public final static int DATABASEVERSION =1;

       //创建数据库
       public DBHelper(Context context,Stringname,CursorFactory factory,int version)
       {
              super(context, name, factory,version);
       }
       //创建表等机构性文件
       public void onCreate(SQLiteDatabase db)
       {
              String sql ="create tablediary"+
                                   "("+
                                   "_idinteger primary key autoincrement,"+
                                   "topicvarchar(100),"+
                                   "contentvarchar(1000)"+
                                   ")";
              db.execSQL(sql);
       }
       //若数据库版本有更新,则调用此方法
       public void onUpgrade(SQLiteDatabasedb,int oldVersion,int newVersion)
       {
              
              String sql = "drop table ifexists diary";
              db.execSQL(sql);
              this.onCreate(db);
       }
}

37.     页面上现有ProgressBar控件progressBar,请用书写线程以10秒的的时间完成其进度显示工作。(10分)答案
publicclass ProgressBarStu extends Activity {

       private ProgressBar progressBar = null;
       protected void onCreate(BundlesavedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.progressbar);
              //从这到下是关键
              progressBar = (ProgressBar)findViewById(R.id.progressBar);
              
              Thread thread = new Thread(newRunnable() {
                     
                     @Override
                     public void run() {
                            int progressBarMax =progressBar.getMax();
                            try {
                                   while(progressBarMax!=progressBar.getProgress())
                                   {
                                          
                                          intstepProgress = progressBarMax/10;
                                          intcurrentprogress = progressBar.getProgress();
                                          progressBar.setProgress(currentprogress+stepProgress);
                                          Thread.sleep(1000);
                                   }
                                   
                            } catch(InterruptedException e) {
                                   // TODO Auto-generatedcatch block
                                   e.printStackTrace();
                            }
                            
                     }
              });
              
              thread.start();

              //关键结束
       }
       
}
38.        请描述下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()
39.      如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?      onSaveInstanceState()
      当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。
40.       如何将一个Activity设置成窗口的样式。      在AndroidManifest.xml 中定义Activity的地方一句话android:theme="@android:style/Theme.Dialog"或android:theme="@android:style/Theme.Translucent"就变成半透明的
41.     如何退出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、抛异常强制退出:
该方法通过抛异常,使程序ForceClose。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。
但是这样做同样不完美。
你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。

为了编程方便,最好定义一个Activity基类,处理这些共通问题。 
42.    请介绍下Android中常用的五种布局。FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)
43.    请介绍下Android的数据存储方式。一.SharedPreferences方式
二.文件存储方式
三.SQLite数据库方式
四.内容提供器(Content provider)方式
五. 网络存储方式
44.     请介绍下ContentProvider是如何实现数据共享的。创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Contentprovider中,前提是有相同数据类型并且有写入Content provider的权限。
45.    如何启用Service,如何停用Service。Android中的service类似于windows中的service,service一般没有用户操作界面,它运行于系统中不容易被用户发觉,
可以使用它开发如监控之类的程序。
一。步骤
第一步:继承Service
public class SMSService extends Service { }
第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置:
<service android:name=".DemoService" />
二。Context.startService()Context.bindService
服务不能自己运行,需要通过调用Context.startService()Context.bindService()方法启动服务。这两个方法都可
以启动Service,但是它们的使用场合有所不同。
1.使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。
使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。
2.采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并
不会导致多次创建服务,但会导致多次调用onStart()方法。
采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用
onDestroy()方法。


3.采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,
。接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会
导致多次创建服务及绑定(也就是说onCreate()onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务
解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。
三。Service的生命周期
1.Service常用生命周期回调方法如下:

onCreate() 
该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()bindService()方法,
服务也只被创建一次。 onDestroy()该方法在服务被终止时调用。


2. Context.startService()启动Service有关的生命周期方法
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。
多次调用startService()方法尽管不会多次创建服务,但onStart()方法会被多次调用。

3. Context.bindService()
启动Service有关的生命周期方法
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,
当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
备注:
1. 采用startService()启动服务
     Intent intent =new Intent(DemoActivity.this, DemoService.class);
    startService(intent);
2.Context.bindService()启动
    Intent intent =new Intent(DemoActivity.this, DemoService.class);
   bindService(intent, conn, Context.BIND_AUTO_CREATE);
   //unbindService(conn);//解除绑定
46.    注册广播有几种方式,这些方式有何优缺点?请谈谈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<object.length;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中配置广播

<?xml version="1.0"encoding="utf-8"?>  
<manifestxmlns:android="http://schemas.android.com/apk/res/android"  
     package="spl.broadCastReceiver"  
     android:versionCode="1" 
     android:versionName="1.0"> 
   <application android:icon="@drawable/icon"android:label="@string/app_name">
       <activity android:name=".BroadCastReceiverActivity"  
                  android:label="@string/app_name">  
            <intent-filter>  
                <actionandroid:name="android.intent.action.MAIN" />  
                <categoryandroid:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
       </activity>  
           
       <!--广播注册-->  
       <receiver android:name=".SmsBroadCastReceiver">  
            <intent-filterandroid:priority="20">  
                <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>  
            </intent-filter>  
       </receiver>  
           
   </application>  
      
   <uses-sdk android:minSdkVersion="7" />  
      
   <!-- 权限申请 -->  
   <uses-permissionandroid:name="android.permission.RECEIVE_SMS"></uses-permission>  
      
</manifest>   

两种注册类型的区别是:

    1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。

    2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
47.    请解释下在单线程模型中Message、Handler、MessageQueue、Looper之间的关系。Handler简介:

一个Handler允许你发送和处理MessageRunable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的MessageQueue相关联。当你创建一个新的Handler时,它就和创建它的线程绑定在一起了。这里,线程我们也可以理解为线程的MessageQueue。从这一点上来看,HandlerMessageRunable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责执行他们。

Handler
有两个主要的用途:(1)确定在将来的某个时间点执行一个或者一些MessageRunnable对象。(2)在其他线程(不是Handler绑定线程)中排入一些要执行的动作。

Scheduling Message
,即(1),可以通过以下方法完成:
post(Runnable):Runnable
handler绑定的线程上执行,也就是说不创建新线程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post
这个动作让你把Runnable对象排入MessageQueue,MessageQueue受到这些消息的时候执行他们,当然以一定的排序。sendMessage这个动作允许你把Message对象排成队列,这些Message对象包含一些信息,HandlerhanlerMessage(Message)会处理这些Message.当然,handlerMessage(Message)必须由Handler的子类来重写。这是编程人员需要作的事。

posting或者sending到一个Hanler时,你可以有三种行为:当MessageQueue准备好就处理,定义一个延迟时间,定义一个精确的时间去处理。后两者允许你实现timeout,tick,和基于时间的行为。

当你的应用创建一个新的进程时,主线程(也就是UI线程)自带一个MessageQueue,这个MessageQueue管理顶层的应用对象(像activities,broadcast receivers等)和主线程创建的窗体。你可以创建自己的线程,并通过一个Handler和主线程进行通信。这和之前一样,通过postsendmessage来完成,差别在于在哪一个线程中执行这么方法。在恰当的时候,给定的RunnableMessage将在HandlerMessageQueue中被Scheduled


Message
简介:
Message
类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域,这可以让你在大多数情况下不用作分配的动作。
尽管Message的构造函数是public的,但是获取Message实例的最好方法是调用Message.obtain(),或者Handler.obtainMessage()方法,这些方法会从回收对象池中获取一个。


MessageQueue
简介:
这是一个包含message列表的底层类。Looper负责分发这些messageMessages并不是直接加到一个MessageQueue中,而是通过MessageQueue.IdleHandler关联到Looper
你可以通过Looper.myQueue()从当前线程中获取MessageQueue


Looper
简介:
Looper
类被用来执行一个线程中的message循环。默认情况,没有一个消息循环关联到线程。在线程中调用prepare()创建一个Looper,然后用loop()来处理messages,直到循环终止。

大多数和message loop的交互是通过Handler

下面是一个典型的带有Looper的线程实现。
  class LooperThread extends Thread {
      public Handler mHandler;
      
      public void run() {
          Looper.prepare();
          
          mHandler = new Handler() {
              public voidhandleMessage(Message msg) {
                  // process incomingmessages here
              }
          };
          
          Looper.loop();
      }
  }


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

50.     系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性

51.    你如何评价Android系统?优缺点。答:Android平台手机 5大优势: 
一、开放性 
在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。
二、挣脱运营商的束缚 
在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。
三、丰富的硬件选择 
这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢?
四、不受任何限制的开发商 
Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。
五、无缝结合的Google应用 
如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。
再说Android的5大不足:
一、安全和隐私 
由于手机与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。
二、首先开卖Android手机的不是最大运营商 
众所周知,T-Mobile在23日,于美国纽约发布了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服务则要另当别论了!
三、运营商仍然能够影响到Android手机 
在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。
四、同类机型用户减少 
在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型以外。
五、过分依赖开发商缺少标准配置 
在使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐播放器,全部依赖第三方开发,缺少了产品的统一性。

52.  什么是ANR 如何避免它? 
  答:ANR:Application NotResponding,五秒 

在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了: 

  对输入事件(如按键、触摸屏事件)的响应超过5秒 

  意向接受器(intentReceiver)超过10秒钟仍未执行完毕 

  Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intentbroadcast)。

  因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成(或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 -- 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时问题。

53.     什么情况会导致Force Close ?如何避免?能否捕获导致其的异常? 
  答:一般像空指针啊,可以看起logcat,然后对应到程序中 来解决错误 

54.     Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?
55.     简要解释一下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文件中声明的。
56.      IntentService有何优点? 
  答:IntentService 的好处 

  * Acitivity的进程,当处理Intent的时候,会产生一个对应的Service 

  * Android的进程处理器现在会尽可能的不kill掉你 

  * 非常容易使用 

57.     横竖屏切换时候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目录中

58.     如何将打开res aw目录中的数据库文件? 
  解答:在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

59.     Android引入广播机制的用意? 
  答:a:从MVC的角度考虑(应用程序内) 

 其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。

  b:程序间互通消息(例如在自己的应用程序内监听系统来电) 

  c:效率上(参考UDP的广播协议在局域网的方便性) 

  d:设计模式上(反转控制的一种应用,类似监听者模式)


60.     Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 
  DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。

61.     sim卡的EF 文件有何作用 
  sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本身可以有自己的操作系统,EF就是作存储并和手机通讯用的 

62.     嵌入式操作系统内存管理有哪几种,各有何特性 
  页式,段式,段页,用到了MMU,虚拟空间等技术 

63.      什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗? 
  嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

64.     一条最长的短信息约占多少byte? 
  中文70(包括标点),英文160,160个字节。 

65.     android中的动画有哪几类,它们的特点和区别是什么? 
  两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

66.     handler机制的原理 
  andriod提供了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。 
67.     说说mvc模式的原理,它在android中的运用 
 MVC(Model_view_contraller)”模型_视图_控制器”。 MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Contro
68.    DDMS和TraceView的区别? DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器。
69.    java中如何引用本地语言 可以用JNI(java nativeinterface  java 本地接口)接口。

70.    谈谈Android的IPC(进程间通信)机制 IPC是内部进程通信的简称,是共享"命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。
71.    NDK是什么NDK是一些列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so


你可能感兴趣的:(android,面试,宝典)