Android基础部分
1.请列出Android的四大组件。
解答:Activity,Service,Broadcast Receiver和Content Provider。
2.请问Activity一般会重载哪7个方法用来维护其生命周期。
解答: onCreate(),onStart()/onRestart(),onResume(),onPause(),onStop(),onDestory()
3.请问一条最长的短信息约占多少byte?
解答:中文70(包括标点),英文160,160个字节。
4.请说明android中的动画有哪几类,它们的特点和区别是什么?
解答:
(1)Frame Animation(帧动画)
传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。主要用于播放一帧帧准备好的图片,类似GIF图片,优点是使用简单方便、缺点是需要事先准备好每一帧图片
(2)Tween Animation(补间动画)
这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化,仅需定义开始与结束的关键帧,而变化的中间帧由系统补上,优点是不用准备每一帧,缺点是只改变了对象绘制,而没有改变View本身属性。因此如果改变了按钮的位置,还是需要点击原来按钮所在位置才有效。
(3)Property Animation(属性动画)是3.0后推出的动画,优点是使用简单、降低实现的复杂度、直接更改对象的属性、几乎可适用于任何对象而仅非View类
5.请简单说明在UI布局中,Android的控件属性padding和margin有什么区别?
解答:
通俗的理解
Padding 为内边框,指该控件内部内容,如文本/图片距离该控件的边距
Margin 为外边框,指该控件距离边父控件的边距
6.请简述Android的数据存储方式有哪几种。
解答:
(1)SharedPreferences方式
(2)文件存储方式
(3)SQLite数据库方式
(4)Content provider
(5)网络存储方式
7.请写出Button点击事件的代码。
解答:
button.setOnClickListener(newandroid.view.View.OnClickListener(){
@Override
public voidonClick(View arg0) {
// TODOAuto-generated method stub
……
}
});
8.请说明在单线程模型中,Message、Handler、Message Queue、Looper之间的关系。
解答:
1.Handler简介:
handler是android给我们提供用来更新UI的一套机制,也是消息处理的机制,我们可以发送消息,也可以通过它处理消息。
一个Handler允许你发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的MessageQueue相关联。当你创建一个新的Handler时,它就和创建它的线程绑定在一起了。这里,线程我们也可以理解为线程的MessageQueue。从这一点上来看,Handler把Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责执行他们。
Handler有两个主要的用途:
(1)确定在将来的某个时间点执行一个或者一些Message和Runnable对象。
(2)在其他线程(不是Handler绑定线程)中排入一些要执行的动作。
Scheduling Message,即(1),可以通过以下方法完成:
post(Runnable):Runnable在handler绑定的线程上执行,也就是说不创建新线程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post这个动作让你把Runnable对象排入MessageQueue,MessageQueue受到这些消息的时候执行他们,当然以一定的排序。sendMessage这个动作允许你把Message对象排成队列,这些Message对象包含一些信息,Handler的hanlerMessage(Message)会处理这些Message.当然,handlerMessage(Message)必须由Handler的子类来重写。这是编程人员需要作的事。
当posting或者sending到一个Hanler时,你可以有三种行为:当MessageQueue准备好就处理,定义一个延迟时间,定义一个精确的时间去处理。后两者允许你实现timeout,tick,和基于时间的行为。
当你的应用创建一个新的进程时,主线程(也就是UI线程)自带一个MessageQueue,这个MessageQueue管理顶层的应用对象(像activities,broadcastreceivers等)和主线程创建的窗体。你可以创建自己的线程,并通过一个Handler和主线程进行通信。这和之前一样,通过post和sendmessage来完成,差别在于在哪一个线程中执行这么方法。在恰当的时候,给定的Runnable和Message将在Handler的MessageQueue中被Scheduled。
消息的处理者。通过Handler对象我们可以封装Message对象,然后通过sendMessage(msg)把Message对象添加到 MessageQueue中;当MessageQueue循环到该Message时,就会调用该Message对象对应的handler对象的 handleMessage()方法对其进行处理。由于是在handleMessage()方法中处理消息,因此我们应该编写一个类继承自 Handler,然后在handleMessage()处理我们需要的操作。
2.Message简介:
Message类就是定义了一个消息,这个消息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.这个类有几个比较重要的字段:
(1)arg1和arg2:我们可以使用两个字段用来存放我们需要传递的整型值,在Service中,我们可以用来存放Service的ID。
(2)obj:该字段是Object类型,我们可以让该字段传递某个多项到消息的接受者中。
(3)what:这个字段是消息的标志,在消息处理中,可以根据这个字段的不同值进行不同的处理,类似于我们在处理Button事件时,通过switch(v.getId())判断是点击了哪个按钮。
在使用Message时,我们可以通过new Message()创建一个Message实例,但是Android更推荐我们通过Message.obtain()或者 Handler.obtainMessage()获取Message对象。这并不一定是直接创建一个新的实例,而是先从消息池中看有没有可用的Message实例,存在则直接取出并返回这个实例。反之如果消息池中没有可用的Message实例,则根据给定的参数new一个新Message对象。 Android系统默认情况下在消息池中实例化10个Message对象。
3.MessageQueue简介:
消息队列,这是一个包含Message列表的底层类,用来存放Message对象的数据结构,它将Message对象以链表的方式串联起来。Looper负责分发这些message。Messages并不是直接加到一个MessageQueue中,而是通过MessageQueue.IdleHandler关联到Looper。MessageQueue对象不需要我们自己创建,而是有Looper对象对其进行管理,一个线程最多只可以拥有一个MessageQueue。我们可以通过Looper.myQueue()获取当前线程中的MessageQueue。
4.Looper简介:
MessageQueue的管理者,Looper类被用来执行一个线程中的Message循环。在一个线程中,如果存在Looper对象,则必定存在MessageQueue对象,并且只存在一个Looper对象和一个MessageQueue对象。倘若我们的线程中存在Looper对象,则我们可以通过Looper.myLooper()获取,此外我们还可以通过Looper.getMainLooper()获取当前应用系统中主线程的Looper对象。假如Looper对象位于应用程序主线程中,则Looper.myLooper()和Looper.getMainLooper()获取的是同一个对象。
下面是一个典型的带有Looper的线程实现。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public voidhandleMessage(Message msg) {
// process incomingmessages here
}
};
Looper.loop();
}
}