Android面试笔试必会系列题目(附答案) - 高飞网
7人看过

Android面试笔试必会系列题目(附答案)

2014-03-20 01:23:15

1.对NDK的理解?

NDK是一系列工具的集合。

* NDK(Native Develop Kit)提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

* NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU、API等差异,开发人员只需要简单修改mk文件(指出”哪些文件需要编译”、”编译特性要求”等),就可以创建出so。

* NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

2.对JNI的理解?

可以用JNI(Java Native Interface)接口。

标准的java类库可能不支持你的程序所需的特性。或许你已经有了一个用其他语言写成的库或程序,而你希望在java程序中使用它。


你可能需要用底层语言实现一个小型的时间敏感代码,比如汇编,然后在你的java程序中调用这些功能。

publicclassHelloWorld {

publicnativevoiddisplayHelloWorld();//所有native关键词修饰的都是对本地的声明

static{

System.loadLibrary(“hello”); //载入本地库

}


publicstaticvoidmain(String[] args) {

newHelloWorld().displayHelloWorld();

}

}

3.继承SQLiteOpenHelper实现?

Class MyDBHelper extends SQLiteOpenHelper{

String sql=”create table TempTbl(_id integer,name text)”;

SQLiteDatabase db;

public void onCreate(SQLiteDatabase db){

db.execSQL(sql);

}

public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){

}

4.代码创建AVD?

名字myAvdsdk版本2.2sd卡根目录在d盘,名字为scard.img,屏幕大小HVGA

android create avd–n myAvd –t 8 –s HVGA –c d:\card.img

N:name, T:target S:skin C:sdcard

5.View, surfaceView, GLSurfaceView有什么区别。

view是最基础的,必须在UI主线程内更新画面,速度较慢。

SurfaceViewview的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。

GLSurfaceViewSurfaceView的子类,opengl 专用的。

6.请写一段代码(SAX, DOM, 或者pull )来解析XML文档。

下面是要解析的XML文件:

person.xml:

<?xml version=”1.0″ encoding=”UTF-8″?>
<persons>
<person id=”1″>
<name>
张三</name>
<age>22</age>
</person>
<person id=”2″>
<name>
李四</name>
<age>23</age>
</person>
</persons>

定义一个名为PersonjavaBean用于存放上面解析出来的xml内容

publicclass Person {
private Integer id;
private String name;
private Short age;
public Integer getId() {
return id;
}
publicvoid setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
publicvoid setName(String name) {
this.name = name;
}
public Short getAge() {
returnage;
}
publicvoid setAge(Short age) {
this.age = age;
}}

DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。

DOMPerson.java

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.sinber.domain.Person;


publicclass DOMPerson {
publicstatic List<Person> getPerson() throws Exception{
List<Person> pers =
new ArrayList<Person>();
InputStream inStream = SAXPersonService.
class.getClassLoader().getResourceAsStream(“person.xml”);
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(inStream);
Element root = dom.getDocumentElement();

NodeList persons =
root.getElementsByTagName(“person”);
for(int i=0;i<persons.getLength();i++){
Element personNode =(Element)persons.item(i);
Person person =
new Person();
person.setId(
new Integer(personNode.getAttribute(“id”)));
NodeList childNodes = personNode.getChildNodes();
for(int j=0;j<childNodes.getLength();j++){
Node childNode = childNodes.item(j);
if(childNode.getNodeType()==Node.ELEMENT_NODE){
Element element
= (Element)childNode;
if(“name”.equals(childNode.getNodeName())){
person.setName(
new String(element.getFirstChild().getNodeValue()));
}
elseif(“age”.equals(childNode.getNodeName())){
person.setAge(
new Short(element.getFirstChild().getNodeValue()));
}
}
}
pers.add(person);
}
inStream.close();
return pers;
}
}


7.已知单链表的头结构head,写一个函数把这个链表逆序。

Node.java

publicclass Node {
private Integer count;
private Node nextNode;

public Node(){

}
public Node(int count){
this.count =new Integer(count);
}
public Integer getCount() {
return count;
}
publicvoid setCount(Integer count) {
this.count = count;
}
public Node getNextNode() {
return nextNode;
}
publicvoid setNextNode(Node nextNode) {
this.nextNode = nextNode;
}
}

ReverseSingleLink.java

publicclass ReverseSingleLink {
publicstatic Node revSingleLink(Node head){
if(head ==null){
//链表为空不能逆序
return head;
}
if(head.getNextNode()==null){
//如果只有一个结点,当然逆过来也是同一个
return head;
}
Node rhead = revSingleLink(head.getNextNode());
head.getNextNode().setNextNode(head);
head.setNextNode(
null);
return rhead;
}
publicstaticvoid main(String[] args){
Node head =
new Node(0);
Node temp1 =
null,temp2 =null;
for(int i=1;i<100;i++){
temp1 =
new Node(i);
if(i==1){
head.setNextNode(temp1);
}
else{
temp2.setNextNode(temp1);
}
temp2 = temp1;
}
head = revSingleLink(head);
while(head!=null){
head = head.getNextNode();
}
}
}

8.10个常用linux命令和常用Android相关命令?

ls cd rm find cp cat grepmore whovi

1.cd目录名 2.vi 文件名

3.rm [选项] 文件列表 4.cat[选项]文件列表(如:cat userinfo.xml)

5.cp[选项] 源文件目标文件6.find目录列表匹配标准

7.grep [选项] 正则表达式文件列表 8.ls [选项] [文件列表](如:ls)

9.more [选项] 文件名 10.who [选项] utmp式的文件

android create avd –n <name> -t <targetID>

android list target

adb push d:\test.txt /sdcard/

adb pull /sdcard/test.txt d:/

adb install test.apk

ls

sqlite3 studDB.db

cat userinfo.xml

9.Socket实现客户端-服务器通信?

服务器端:

ServerSocket server=new ServerSocket(8888);

While(true){

Socketclient=server.accept();//侦听并接受到此套接字的连接

OutputStream out=client.getOutputStream();//返回此套接字的输出流

String msg=”Hello”;

out.write(msg.getBytes());

client.close();

}

客户端:

Socket socket=new Socket(“192.168.1.101″,8888);

InputStream in=socket.getInputStream();

byte[] buffer=new byte[in.avaiable()];

in.read(buffer);

String msg=new String(buffer);

10.定义一个ProgressBar用线程完成下载?

<ProgressBar

android:id=”@+id/bar”

android:layout_width=”fill_parent”

android:layout_height=”wrap_content”

android:max=”100″

android:style=”@android:style/Widget.ProgressBar.Horizontal”

/>

bar=(ProgressBar)findViewById(R.id.bar);

Handler handler=new Handler(){

public void handleMessage(Message msg){

If(msg.what==0×111){

bar.setProgress(status);

}

}

}

new Thread(){

public void run(){

while(status<100){

status+=5;

Thread.sleep(100);

Message m=new Message();

m.what=0×111;

handler.sendMessage(m);

}

}

}

也可Timer timer=new Timer();

timer.schedule(new TimerTask(){runnable}, long delay, long period)

也可handler.postDelayed(runnable, long delayMillis);

11.dp和 px转换关系?

px = dp*dpi/160

QVGA density=0.75 densityDpi=120 QVGA240*320 (Quarter:1/4)

HVGAdensity=1.0 densityDpi=160 HVGA320*480 (Half:1/2)

VGAdensity=1.0 densityDpi=160 VGA480*640

WVGA:density = 1.5 densityDpi=240 WVGA(480*800) (Wide)

WQVGAdensity=2.0 densityDpi=120 WQVGA240*400(Wide Quarter)

dip值表示每英寸有多少个显示点(像素密度)。当densityDip=160时,1dp=1px。

12.Android SDK 下的常用工具有哪些?

platform-tools目录下常用的工具有:

aapt、adb、dx、aidl

tools目录下常用的工具有:

android、apkbuilder、ddms、draw9patch、emulator、mksdcard、sqlite3

13. Android线程涉及的技术有哪些?它们间的关系怎样。

MessageHandlerMessageQueueLooper

Message:就是Handler接收和处理的消息。

Looper:每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,读到信息之后就把消息交给发送该消息的Handler进行处理。

MessageQueue:消息队列,它采用先进先出的方式来管理Message。程序创建Looper对象时会在它的构造器中创建Looper对象。Looper提供的构造器代码如下:

private Looper() {

mQueue = new MessageQueue();

mRun = true;

mThread = Thread.currentThread();

}

从上面代码不难看出程序在初始化Looper时会创建一个与之关联的MessageQueue,这个MessageQueue就负责管理消息。

Handler:它的作用有两个:发送消息,程序使用Handler发送消息,被Handler发送的消息必须被送到指定的MessageQueue。也就是说,如果希望Handler正常工作,必须在当前线程中有一个MessageQueue,否则消息就没有MessageQueue进行保存了。不过MessageQueue是由Looper负责管理的,也就是说,如果希望Handler正常工作,必须在当前线程中有一个Looper对象。为了保证当前线程中有Looper对象,可以分两种情况处理:

-程序UI线程中,系统已经初始化了一个Looper对象,因此程序直接创建Handler即可,然后就可通过Handler来发送消息、处理消息。

-程序员自己启动的子线程,程序员必须自己创建一个Looper对象,并启动它。创建Looper对象调用它的prepare()方法即可。prepare方法保证每个线程最多只有一个Looper对象,prepare方法的源代码如下:

public static final void prepare() {

if (sThreadLocal.get() != null) {

throw new RuntimeException(“Only one Looper may be created per thread”);

}

sThreadLocal.set(new Looper());

}

然后调用Looper的静态loop()方法来启动它,loop方法就是使用一个死循环不断都取出MessageQueue中的消息,并将取出的消息分给该消息对应的Handler进行处理。

归纳起来:

Looper:每个线程只有一个,它负责管理MessageQueue,它会负责不断的从MessageQueue中取出消息,并将消息分给对应的Handler处理。

MessageQueue:由Looper负责管理。它采用先进先出的方式来管理所有Message。

Handler:它能把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息。

14. TCP/IP协议

这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。
TCP/IP整体构架概述:

TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层数据链路层、网路层、传输层、话路层、表示层应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:
应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
TCP/IP中的协议
以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的:
1. IP
网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。
IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层—TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵
2. TCP
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向’上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。
面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

15. AIDL简单描述

AIDL全称Android Interface Definition Language(Android接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的。它使用代理类在客户端和实现层间传递值。

16.产生死锁的条件

‰1、相互排斥:一个线程或者进程永远占有共享资源,例如,独占该资源。

‰2、循环等待:进程A等待进程B,而后者又在等待进程C,而进程C又在等待进程A。

‰3、部分分配:资源被部分分配,例如,进程A和B都需要访问一个文件,并且都要

用到打印机,进程A获得了文件资源,进程B获得了打印机资源,但是两个进程

不能获得全部的资源。

‰4、缺少优先权:一个进程访问了某个资源,但是一直不释放该资源,即使该进程处于

阻塞状态。

17.如何适配不同分辨率、不同语言环境

分辨率:

drawable-hdpi/ldpi/mdpi/xhdpi/xxhdpi/640×360(图片分辨率适配)

values-sw600dp/v11/640×360(dimen.xml适配尺寸下的资源)

注:-sw[N]dp:要求N小于你的屏幕高度或宽度二者中的最小值。

layout-land/port/hdpi/large/640×360(横竖屏、布局文件分辨率适配)

语言环境:

values-en-rUS/-zh-rCN

18.Android系统架构及简介

Android 是由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。

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

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

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

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


20.Service的生命周期

21.DDMS的作用

DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务。它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。

22.继承ContentProvider类要重写的方法有哪些

public boolean onCreate();

public Uri insert(Uri uri, ContentValues initialValues);

public int delete(Uri uri, String selection, String[] selectionArgs);

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs);

/*参数values:更新的数据*/

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) ;

/*参数说明:

uri:表名,如:Contacts.People.CONTENT_URI

projection:列名,如:{Contacts.PeopleColumns.NAME,Contacts.PeopleColumns.NOTES}。

selection:条件,如:Contacts.PeopleColumns.NAME + ” = ? ”

selectionArgs:条件参数,如:{“akuan”}

sortOrder:排序方式,如:Contacts.PeopleColumns.NAME

/*

public String getType(Uri uri)

如:private void insert(){

ContentResolver cr=getContentResolver();

ContentValues values=new ContentValues();

Uri uri=Contacts.People.CONTENT_URI;

values.put(People.NAME,”tom”);

values.put(People.NOTES,”I’m tom!”);

cr.insert(uri,values);

}

表:Contacts.People.CONTENT_URI

People.NAME

People.NOTES

……

akuan

Information tech

……

tom

I’m tom!

……

……

……

……

一旦某个应用程序提供了ContentProvider,其他程序就可通过ContentResolver来访问ContentProvider所暴露的数据。归纳起来说:ContentResolver负责向指定Uri执行C、R、U、D操作,而实际上这些操作将会由系统委托给该Uri对应的ContentProvider来去执行,ContentProvider执行完成后会把结果返回给ContentResolver。

<provider android:name=”PersonContentProvider”

android:authorities=”com.xxxx.xxxx”/>

23. Adapter有什么作用?常见的Adapter有哪些?

Adapter是连接后端数据和前端显示的适配器接口。

常见的Adapter子接口包括ListAdapter和SpinnerAdapter。其中ListAdapter接口主要为ListView、GridView这种AdapterView提供数据和显示组件。而SpinnerAdapter主要为Spinner、Gallery这种AdapterView提供数据和显示组件。

ListAdapter、SpinnerAdapter它们有如下实现类:

ArrayAdapter:用法比较简单。功能也比较简单,只要传入数组或List集合作为列表组件的数据即可。

SimpleAdapter:用法略显复杂,但功能比较强大。程序需要传入一个List集合(List集合元素为Map)作为列表组件的数据。

SimpleCursorAdapter:功能和用法与SimpleAdapter十分相似。只是程序使用Cursor作为列表组件的数据。

BaseAdapter:这个Adapter主要供用户继承,然后需要重写它提供的getCount()、getItem()、getItemId、getView等方法。

如:String[] strs={“java”,”C”,”C++”,”VB”};

ArrayAdapter<String> adapter

=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,strs);

listView.setAdapter(adapter);

Cursor cursor

=getContentResolver().query(People.CONTENT_URI,null,null,null,null);

ListAdapter adapter=new SimpleCursorAdapter(this,

android.R.layout.simple_list_item_1,

cursor,

new String[]{People.NAME},

new int[]{android.R.id.text1});

24.判断手机是否有SD卡

if(

Environment.getExternalStorageState.equals(Environment.MEDIA_MOUNTED))

)//装入有SD卡

{… …}

25.Android工程中的目录结构

assets用于存放需要打包到应用程序的静态文件,以便部署到设备中。与res/raw不同点在于,assets支持任意深度的子目录。这些文件不会生成任何资源ID,必须使用/assets开始(不包含它)的相对路径名。

res/raw存放通用的文件,该文件夹内的文件将不会被编译成二进制文件,按原样复制到设备上。

bin/res:编译后只有原来的图片drawable-hdpi/ldpi/mdp目录。

classes.dex:.class文件编译后打包成.dex文件

First.apk:全局生成的apk应用

resources.ap_:资源打包文件,如layout、values目录下的资源

proguard.cfg:代码混淆,使难反编译

project.properties:编译API版本,如:target=android-15

26.什么叫内存泄露

内存空间在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

27.静态块的执行顺序

public class A {

static{

System.out.print(1);

}

public A(){

System.out.print(2);

}

}

public class B extends A{

static{

System.out.print(“a”);

}

public B(){

System.out.print(“b”);

}

}

public class C {

public static void main(String[] args){

A a = new B();

a = new B();

}

}

当父类与子类都有静态代码块和构造函数的时候,执行顺序如下:

父类静态代码块>子类静态代码块

父类构造函数>子类构造函数(先有父亲,后有孩子)

静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次

=>结果为:1a2b2b

28.Android 中有哪几种解析XML的类?官方推荐哪种?以及它们的原理和区别。

XML解析主要有三种方式,SAX、DOM、Pull。

常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方式。

SAX读取是单向的,优点是不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。

DOM方式会把整个XML文件加载到内存中去,因此比较耗费内存空间。

官方推荐使用:Pull。它对于节点处理比较好,类似SAX方式,同样很节省内存。

29.Intent能携带的数据有哪些

Intent包括Component、 Action、Category、Data、Type、Extra、Flag这些数据,其中Component、 Action、Category、Data、Type主要用于匹配该Intent想要启动的程序组件,Extra属性是一个Bundle对象,该对象主要用于携带多个组件交互的数据。Flag则用于指定一些启动程序的”旗标”信息,比如启动Activity时可指定如下常用Flag:

FLAG_ACTIVITY_NEW_TASK:使用一个新的Task来装载该Activity。

FLAG_ACTIVITY_NO_HISTORY:通过该Flag启动的Activity不会保存在历史Stack中。

FLAG_ACTIVITY_SINGLE_TOP:如果当前Task中已有该Activity,通过该Flag启动的

Activity将不会被启动(因为要保持只有一个实例)。

30.Android中四种启动模式

http://www.2cto.com/kf/201205/132154.html

还没有评论!
23.20.129.162