您的位置:首页 > 职场人生

安卓面试必会题

2015-11-22 23:15 435 查看
1.简单的设计模式:
单例模式:在系统中一个类只有一个实例。分为懒汉模式和饿汉模式。饿汉模式的代码如下:

public class Singleten{

private static singleten Instance = new Singleten();

private Singleten(){}

public static getInstance()

{

return Instance ;

}

}
观察者模式:一个对象改变状态,则依赖它的所有对象都会得到通知并改变状态。
迭代器模式:iterator();遍历元素的方法有hasNext(),first(),next(),remove()
模版方法

2.Listview列表效率优化
(1)利用convertview回收视图
(2)采用ViewHolder模式
(3)异步加载图片
(4)快速滑动时不加载图片
(5)如果自定义的item中有图片,需要处理图片(减少图片所占内存)

1.对图片进行边界压缩2.用option类来保存图片大小 3.避免图片的实时缩放,最好预先缩放到视图大小
(6)尽量避免在listview适配器中使用线程,因为线程是产生内存泄露的主要原因在于线程的生命周期不可控。

3.应用内存优化
(1)bitmap设置图片大小(优化内存溢出)

BitmapFactory.Option option = new BitmapFactory.Option();

option.inSampleSize = 2; //将视图宽、高都变为原来的1/2
(2)bitmap对象销毁,可以借助recycle()方法让GC回收bitmap对象。
(3)尽量避免static成员变量引用资源消耗过多的实例,如:context
(4)使用Application的context
(5)及时关闭资源,如在查询数据库时需要及时关闭cursor
(6)对经常使用的图片使用软引用保存
(7)线程也是造成内存泄露的一个重要原因,在于线程的生命周期不可控制,解决方法:

1.将线程内部类改为静态内部类

2.用弱引用来保存context引用
(8)使用.9图片

4.Handler与HandlerThread关系

android消息处理机制:handler、Looper、MessageQueue、Message
将一个线程变为looper线程的方法:Looper.prepare; //初始化MessageQueue与Looper

Looper.loop();//消息循环

5.异常处理

IoException异常是编译器异常,在编译时就会报错

ANR异常解决方法:尽量在主线程只做少量工作,比较耗时的工作单独在一个子线程中完成(或使用异步请求)

6.数据库的优化

1.使用索引

2.使用事务

3.查询时返回更少的结果集和字段

7.数据存储的方法

sharedpreference存储、文件存储、SQLite存储、contentprovide存储、网络存储数据

8.启动服务的两种方法:startservice和bindservice
使用startservice()启动服务,调用者和服务之间没有关联,即使调用者退出了,服务仍然运行;使用bindservice()启动服务,调用者和服务绑定在一起,调用者一旦退出,服务也终止;采用startservice启动服务,只能调用stopservice终止服务。

startservice()启动服务的生命周期:oncreat()、onstart(),ondestroy();第一次startservice()启动服务会调用oncreat()、onstart();后面再使用startservice()启动服务,只会调用onstart()

bindservice()启动服务的生命周期:oncreat()、onbind()、onunbind()、ondestory();第一次bindservice()启动服务调用oncreat()、onbind(),多次调用bindservice()并不会多次创建服务及绑定,如果调用者希望与正在绑定的服务解除绑定,可以调用unbindservice()方法。

8.set、List的区别:Set中元素不重复

9.contentprovide如何实现数据共享
如果想使应用程序的数据公开化:1.自己创建一个contentprovide2.将数据添加到一个已经存在的contentprovide上
如何获取数据:外界程序可以通过contextResolver接口访问contentprovide提供的数据

contentprovide的优点为:为其他程序提供了一个对数据访问的接口,从而实现对数据进行访问和更新的操作

10.在某个activity界面按Home键走的生命周期:onpause(),onstop(),onsaveinstanceState()
在某个activity界面按Home键再点击应用图标走的生命周期:onRestart().onStart(),onResume()

11.在android中的4种Activity启动模式:SingleTask、standard、SingleTop、SingleInstance

12.Http协议HttpClient类Jeson包解析

13.socket协议

android客户端实现:

try{

socket = new Socket(“192.168.1.32″,1989);

InputStream inputStream = new FileInputStream (“e://a.txt”);

OutputStream outputStream = socket.getoutputStream() ;

byte buffer[] = new byte[4*1024];

int temp = 0;

while((temp = inputStream .read(buffer))!=-1){

outputStream.write(buffer,0,temp);

}

outputStream.flush();

}
服务器端:

try{

serverSocket = new serverSocket (989);

Socket socket = serverSocket.accept();

InputStream inputStream = newFileInputStream (“e://a.txt”);

InputStream inputStream = socket.getinputStream() ;

byte buffer[] = new byte[4*1024];

int temp = 0;

while((temp = inputStream .read(buffer))!=-1){

system.out.println(new String(buffer,0,temp));

}

serverSocket.close();

}

14.AIDL android内部进程通信接口的描述语言

15.强引用:内存不足时,不会回收强引用的对象
软引用:内存不足时,会回收软引用的对象
弱引用:垃圾回收每次都会回收弱引用的对象

16.android view的刷新机制

17.静态内部类
(1)非静态内部类中bunengdingy静态成员变量和方法
(2)外部类和非静态内部类之间可以互相访问自己的私有成员
(3)静态内部类只能访问外部类的静态成员

 

NDK是一系列工具的集合。
* NDK(NativeDevelop 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(_idinteger,name text)”;
SQLiteDatabase db;
public void onCreate(SQLiteDatabase
db)
{
db.execSQL(sql);
}
public void onUpgrade(SQLiteDatabase
db
,int oldVersion,int newVersion){
}
4.代码创建AVD?
名字myAvd,sdk版本2.2,sd卡根目录在d盘,名字为scard.img,屏幕大小HVGA
android create avd–n myAvd –t 8 –s HVGA –c d:\card.img
N:name, T:targetS:skin C:sdcard
5.View, surfaceView, GLSurfaceView有什么区别。
view是最基础的,必须在UI主线程内更新画面,速度较慢。
SurfaceView是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。
GLSurfaceView是SurfaceView的子类,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>
定义一个名为Person的javaBean用于存放上面解析出来的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>();

InputStreaminStream = 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=newSocket(“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 voidhandleMessage(Message msg){
        If(msg.what==0×111){
            bar.setProgress(status);
        }
    }
}
new Thread(){
    public void run(){
        while(status<100){
            status+=5;
            Thread.sleep(100);
            Messagem=new Message();
            m.what=0×111;
            handler.sendMessage(m);
        }
    }
}
也可Timertimer=new Timer();
timer.schedule(new TimerTask(){runnable}, long delay, long period)
也可handler.postDelayed(runnable, longdelayMillis);
11.dp和 px转换关系?
px = dp*(dpi/160)
QVGA: density=0.75 densityDpi=120 QVGA(240*320) (Quarter:1/4)
HVGA:density=1.0densityDpi=160 HVGA(320*480) (Half:1/2)
VGA:density=1.0densityDpi=160 VGA(480*640)
WVGA:density= 1.5 densityDpi=240 WVGA(480*800) (Wide)
WQVGA:density=2.0densityDpi=120 WQVGA(240*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线程涉及的技术有哪些?它们间的关系怎样。
Message、Handler、MessageQueue、Looper。
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) {
            thrownew 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(UserDatagram
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
dp:要求N小于你的屏幕高度或宽度二者中的最小值。
layout-land/port/hdpi/large/640×360(横竖屏、布局文件分辨率适配)
语言环境:
values-en-rUS/-zh-rCN
18.Android系统架构及简介
Android 是由5部分组成,分别是:Linux Kernel、Android
Runtime、Libraries、ApplicationFramework、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, Stringselection,
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)
如:privatevoid insert(){
ContentResolver cr=getContentResolver();
        ContentValuesvalues=new ContentValues();
        Uriuri=Contacts.People.CONTENT_URI;
        values.put(People.NAME,”tom”);
        values.put(People.NOTES,”I’mtom!”);
        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。
<providerandroid: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将不会被启动(因为要保持只有一个实例)。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: