常见面试题

1.请描述下Activity的生命周期和Service的生命周期

答:Activity:创建 onCreate - 启动onStart – 开始 onResume – 暂停 onPause – 结束 onStop – 销毁onDestroy,onCreate只有在第一次运行才执行。

Service:用startService(intent)启动Services,第一次运行执行onCreate---onStartCommand------onStart,之后再运行就不会执行onCreate了,其中onStart其实是被onStartCommand调用的,把onStartCommand的返回值改了,onStart就不会执行了。

用bindService(intent,conn, Context.BIND_AUTO_CREATE)启动Services。第一次运行执行onCreate----onBind。在unbindService(conn)之前再次执行bindService是没用的

 

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

答:在AndroidManifest.xml清单文件中定义Activity的地方加一句话

android:theme="@android:style/Theme.Dialog"或

android:theme="@android:style/Theme.Translucent"

 

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

答:一.SharedPreferences方式

二.文件存储方式

三.SQLite数据库方式

四.内容提供器(Content provider)方式

五. 网络存储方式

 

4.注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意

答:两种,一种是代码动态注册,一种是在AndroidManifest.xml中配置广播。第一种不是常驻型广播,也就是说广播跟随程序的生命周期,第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。缺点:常驻型,占资源比较大

a:引入广播机制可以方便几大组件的信息和数据交互

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

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

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

 

5.请解释下在单线程模型中Message、Handler、MessageQueue、Looper之间的关系

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

Message简介:
Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域,这可以让你在大多数情况下不用作分配的动作。

MessageQueue简介:
这是一个包含message列表的底层类。Looper负责分发这些message。Messages并不是直接加到一个MessageQueue中,而是通过MessageQueue.IdleHandler关联到Looper。

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

6.handler机制的原理

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

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

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

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

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

 

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

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

 

8.Activity和Task的启动模式有哪些?每种含义是什么

答:有关在AndroidManifest.xml中的android:launchMode定义,主要有standardsingleTopsingleTasksingleInstance

 

9.Android都有哪些XML解析器,区别是什么

答:Android解析xml数据格式有三种方式,分别是DOM、SAX以及PULL

dom全称Document Object Model ,为xml文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个主流内存的树结构,然后代码就可以使用dom接口来操作这个树结构,在Dom解析的过程中,是先把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据。这种方式

缺点:1.将整个文档调入内存(包括无用的节点),浪费时间和空间

优点:1.它比较直观,在一些方面比SAX方式比较简单。
              2.整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能
              3.通过树形结构存取xml文档
              4.可以在树的某个节点上向前或向后移动

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于android等移动设备
         SAX全称是Simple API for Xml,既是指一种接口,也是一个软件包,作为接口,sax是事件驱动型xml解析的一个标准接口

Sax的工作原理简单的说,就是对文档进行顺序扫描,扫描到文档(document)开始与结束,扫描到元素(element)开始、结束等地方时调用事件处理,处理函数做相应动作,然后继续扫描,直到文档结束。

Sax特点
        1. 解析效率高,占用内存少
        2.可以随时停止解析
        3.不能载入整个文档到内存
        4.不能写入xml
        5.SAX解析xml文件采用的是事件驱动

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

pull与sax的不同之处
          1.pull读取xml文件后触发相应的事件调用方法返回的是数字。
          2.pull可以在程序中控制,想解析到哪里就可以停止到哪里
          3.Android中更推荐使用pull解析

 

10.什么是ANR,如何避免它

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

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

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

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

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

 

11.android:paddingLeft与android:layout_marginLeft的区别

答:当你在LinearLayout中分别设置 android:layout_marginLeft="52dip"和android:paddingLeft="52dip"的时候,android:layout_marginLef是设置整个布局离左边的距离是52像素,而android:paddingLeft是设置布局里面的内容距离左边是52像素

 

12.通过Intent传递一些二进制数据的方法有哪些

答: 1). 使用Serializable接口实现序列化,这是Java常用的方法。

2). 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。

 

13.能说下Android应用的入口点吗

答: Android入口点是清单文件android:manifest.xml下的application的main

 

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

答:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)

 

15.简要解释一下activity、intent、intent fileter、service、Broadcast、BroadcastReceiver

答:一个activity呈现了一个用户可以操作的可视化用户界面

  一个service不包含可见的用户界面,而是在后台无限地运行

  可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信

  一个broadcast receiver是一个接收广播消息并作出回应的component,broadcastreceiver没有界面

  intent:content provider在接收到ContentResolver的请求时被激活。

  activity, service和broadcastreceiver是被称为intents的异步消息激活的。

一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI

  Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。

  它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intentfilter告诉android该component能处理的intent。intentfilter也是在manifest文件中声明的。

 

16.String和StringBuffer、StringBuilder的区别

答:String 字符串常量
StringBuffer字符串变量(线程安全)
StringBuilder字符串变量(非线程安全)

String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都是String类的对象。字符串是常量;它们的值在创建之后不能改变。所以可以共享它们。StringBuffer是字符串缓存区,它的内容可以被修改,长度也可以改变,StringBuffer类是线程安全的,也就是说多个线程可以安全的访问StringBuffer对象。StringBuilder与StringBuffer类似,都是字符串缓冲区,但StringBuilder不是线程安全的,如果你只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。值得注意的是StringBuilder是在JDK1.5版本中增加的。以前版本的JDK不能使用该类。

17.AIDL的全程是什么?如何工作?能处理哪些类型的数据?

AIDL的英文全称是Android Interface Define Language

当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的

 

18. 谈谈Android的IPC(进程间通信)机制

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

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

   1).创建一个版本为1的“diaryOpenHelper.db”的数据库,

   2).同时创建一个 “diary” 表(包含一个_id主键并自增长,topic字符型100

      长度, content字符型1000长度)

   3).在数据库版本变化时请删除diary表,并重新创建出diary表。

publicclass DBHelper extends SQLiteOpenHelper {

 

         public StudentSQLiteHelper(Contextcontext) {

                   super(context, " diaryOpenHelper.db ",null,1);

                   // TODO Auto-generatedconstructor stub

         }

 

         @Override

         public void onCreate(SQLiteDatabase db){

                   // TODO Auto-generated methodstub

                   //创建数据库表

                   db.execSQL("create tablediary(id integer primary key autoincrement,topic varchar(100),contentvarchar(100)");

         }

 

         @Override

         public void onUpgrade(SQLiteDatabasedb, int oldVersion, int newVersion) {

                   // TODO Auto-generated methodstub

                   db.execSQL("drop tableif exists diary");

                   this.onCreate(db);

         }

}

 

20. 在android中,请简述jni的调用过程。

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

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

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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值