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,Classcls)其返回值为一个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:

    如果窗口要添加窗口背景,可以在drawable中新建一个叫float_box.xml的文件,内容可以如下(自定义):



   
   
   
   

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中的元素的属性控制.其中,主要的Intent标记有:

FLAG_ACTIVITY_NEW_TASK        FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED  FLAG_ACTIVITY_SINGLE_TOP

主要的属性有: taskAffinity   launchMode   allowTaskReparenting

clearTaskOnLaunch  alwaysRetainTaskState       finishOnTaskLaunch

默认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属性同一个task.然而,每个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
   
这样在调用的时候指定Intentaction,系统就是自动的去对比是哪个intent-filter符合我们的Activity,找到后就会启动Activity.

一个intent filterIntentFilter类的实例,但是它一般不出现在代码中,而是出现在android Manifest文件中,的形式. (有一个例外是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.

   

   

请介绍下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的权限如下:

  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提供了的开发工具集合,使开发人员可以便捷地开发.发布 C 组件.同时, 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     (核心应用程序)

 

 

 

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