Android面试宝典(转)

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

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

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

Applications  Application Framework  Android RunTime Libraries   Liunx Kernel android

  架构框架以此从上到下c++

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

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

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

 因为 Android 的手机操做系统是,基于Liunx 2.6系统之上封装而成.因此开发人员可也编程

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

  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提供了的开发工具集合,使开发人员能够便捷地开发.发布 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、简答编程题

 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     (核心应用程序)

相关文章
相关标签/搜索