1、 Android

四大组件是哪些,它们的作用? 2

2、 请介绍下Android中常用的五种布局。 2

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

4、 android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别。 2

5、 ListView的优化方案 3

6、 请介绍下Android的数据存储方式。 3

7、 activity的启动模式有哪些?是什么含义? 5

8 activityTask 有关的 Intent启动方式有哪些?其含义? 6

9、 请描述下Activity的生命周期。 8

10、 activity在屏幕旋转时的生命周期 9

11、 如何启用Service,如何停用Service 9

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

13、 请解释下在单线程模型中MessageHandlerMessage QueueLooper之间的关系。 10

14、 简要解释一下activity intent intent filterserviceBroadcaseBroadcaseReceiver 12

15、 说说mvc模式的原理,它在android中的运用,android的官方建议应用程序的开发采用mvc模式。何谓mvc 12

1、 

1、 Android的四大组件是哪些,它们的作用?

答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑

service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的食物,定义好需要接受的Intent提供同步和异步的接口

Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的借口模型,大大简化上层应用,对数据的整合提供了更方便的途径

BroadCast Receiver:接受一种或者多种Intent作触发事件,接受相关消转换成一条Notification,统一了Android的事件广播模型

2、 请介绍下Android中常用的五种布局。

常用五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。

一、FrameLayout:所有东西依次都放在左上角,会重叠,这个布局比较简单,也只能放一点比较简单的东西。二、LinearLayout:线性布局,每一个LinearLayout里面又可分为垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。三、AbsoluteLayout:绝对布局用X,Y坐标来指定元素的位置,这种布局方式也比较简单,但是在屏幕旋转时,往往会出问题,而且多个元素的时候,计算比较麻烦。四、RelativeLayout:相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:相对于某一个元素android:layout_below、      android:layout_toLeftOf相对于父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;五、TableLayout:表格布局,每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。每一个布局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。

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

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

4、 android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别。

答:XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。

5、 ListView的优化方案

答:1、如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。

2、给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。

3、如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。

6、 请介绍下Android的数据存储方式。

答:使用SharedPreferences存储数据;文件存储数据;SQLite数据库存储数据;使用ContentProvider存储数据;网络存储数据;

Preference,File, DataBase这三种方式分别对应的目录是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。

一:使用SharedPreferences存储数据

首先说明SharedPreferences存储方式,它是 Android提供的用来存储一些简单配置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,具体实例如下:

void ReadSharedPreferences(){

String strName,strPassword;

SharedPreferences   user = getSharedPreferences(“user_info”,0);

strName = user.getString(“NAME”,””);

strPassword = user getString(“PASSWORD”,””);

}

void WriteSharedPreferences(String strName,String strPassword){

SharedPreferences   user = getSharedPreferences(“user_info”,0);

uer.edit();

user.putString(“NAME”, strName);

user.putString(“PASSWORD” ,strPassword);

user.commit();

}

数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改的数据。实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data//shares_prefs下。使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的包之间使用。

二:文件存储数据

文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与 Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。具体实例如下:

String fn = “moandroid.log”;

FileInputStream fis = openFileInput(fn);

FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);

三:网络存储数据

网络存储方式,需要与Android 网络数据包打交道,关于Android 网络数据包的详细说明,请阅读Android SDK引用了Java SDK的哪些package?。

四:ContentProvider

1、ContentProvider简介

当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

2、Uri类简介

Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://…

2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

要操作contact表中id为10的记录,可以构建这样的路径:/contact/10

要操作contact表中id为10的记录的name字段, contact/10/name

要操作contact表中的所有记录,可以构建这样的路径:/contact?

要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:

要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")

3、UriMatcher、ContentUrist和ContentResolver简介

因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从 Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。

UriMatcher:用于匹配Uri,它的用法如下:

1.首先把你需要匹配Uri路径全部给注册上,如下:

//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。

UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路径,返回匹配码为1

uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码

//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2

uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符

2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。

ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:

withAppendedId(uri, id)用于为路径加上ID部分

parseId(uri)方法用于从路径中获取ID部分

ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用 ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。

7、 activity的启动模式有哪些?是什么含义?

答:在android里,有4种activity的启动模式,分别为: 

“standard” (默认) 

“singleTop” 

“singleTask” 

“singleInstance”

它们主要有如下不同:

1. 如何决定所属task 

“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。 

如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。 

“singleTask”和”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。

2. 是否允许多个实例 

“standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例; 

“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。 singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

3. 是否允许其它activity存在于本task内 

“singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。 

而另外三种模式,则可以和其它activity共存。

4. 是否每次都生成新实例 

“standard”对于没一个启动Intent都会生成一个activity的新实例; 

“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。 

比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。 

如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D 

如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。

“singleInstance”是其所在栈的唯一activity,它会每次都被重用。

“singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。

当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

8、 跟activity和Task 有关的 Intent启动方式有哪些?其含义?

核心的Intent Flag有: 

FLAG_ACTIVITY_NEW_TASK 

FLAG_ACTIVITY_CLEAR_TOP 

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_NEW_TASK 

  如果设置,这个Activity会成为历史stack中一个新Task的开始。一个Task(从启动它的Activity到下一个Task中的 Activity)定义了用户可以迁移的Activity原子组。Task可以移动到前台和后台;在某个特定Task中的所有Activity总是保持相同的次序。 

  这个标志一般用于呈现“启动”类型的行为:它们提供用户一系列可以单独完成的事情,与启动它们的Activity完全无关。 

  使用这个标志,如果正在启动的Activity的Task已经在运行的话,那么,新的Activity将不会启动;代替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志,可以禁用这一行为。 

  这个标志不能用于调用方对已经启动的Activity请求结果。

FLAG_ACTIVITY_CLEAR_TOP 
  如果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重新启动一个这个Activity的实例,而是在这个Activity上方的所有Activity都将关闭,然后这个Intent会作为一个新的Intent投递到老的Activity(现在位于顶端)中。 
  例如,假设一个Task中包含这些Activity:A,B,C,D。如果D调用了startActivity(),并且包含一个指向Activity B的Intent,那么,C和D都将结束,然后B接收到这个Intent,因此,目前stack的状况是:A,B。 
  上例中正在运行的Activity B既可以在onNewIntent()中接收到这个新的Intent,也可以把自己关闭然后重新启动来接收这个Intent。如果它的启动模式声明为 “multiple”(默认值),并且你没有在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,那么它将关闭然后重新创建;对于其它的启动模式,或者在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,都将把这个Intent投递到当前这个实例的onNewIntent()中。 
  这个启动模式还可以与FLAG_ACTIVITY_NEW_TASK结合起来使用:用于启动一个Task中的根Activity,它会把那个Task中任何运行的实例带入前台,然后清除它直到根Activity。这非常有用,例如,当从Notification Manager处启动一个Activity。 

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 

    如果设置这个标志,这个activity不管是从一个新的栈启动还是从已有栈推到栈顶,它都将以the front door of the task的方式启动。这就讲导致任何与应用相关的栈都讲重置到正常状态(不管是正在讲activity移入还是移除),如果需要,或者直接重置该栈为初始状态。

FLAG_ACTIVITY_SINGLE_TOP 
  如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的

FLAG_ACTIVITY_BROUGHT_TO_FRONT 
  这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。 

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 
  如果设置,这将在Task的Activity stack中设置一个还原点,当Task恢复时,需要清理Activity。也就是说,下一次Task带着 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记进入前台时(典型的操作是用户在主画面重启它),这个Activity和它之上的都将关闭,以至于用户不能再返回到它们,但是可以回到之前的Activity。 
  这在你的程序有分割点的时候很有用。例如,一个e-mail应用程序可能有一个操作是查看一个附件,需要启动图片浏览Activity来显示。这个 Activity应该作为e-mail应用程序Task的一部分,因为这是用户在这个Task中触发的操作。然而,当用户离开这个Task,然后从主画面选择e-mail app,我们可能希望回到查看的会话中,但不是查看图片附件,因为这让人困惑。通过在启动图片浏览时设定这个标志,浏览及其它启动的Activity在下次用户返回到mail程序时都将全部清除。 

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 
  如果设置,新的Activity不会在最近启动的Activity的列表中保存。 

FLAG_ACTIVITY_FORWARD_RESULT 
  如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity将会传到这个新的Activity中。这种方式下,新的Activity可以调用setResult(int),并且这个结果值将发送给那个作为答复目标的 Activity。 

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 
  这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。 

FLAG_ACTIVITY_MULTIPLE_TASK 
  不要使用这个标志,除非你自己实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已存的Task送入前台的行为。当设置时,新的Task总是会启动来处理Intent,而不管这是是否已经有一个Task可以处理相同的事情。 
  由于默认的系统不包含图形Task管理功能,因此,你不应该使用这个标志,除非你提供给用户一种方式可以返回到已经启动的Task。 
  如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志被忽略。 

FLAG_ACTIVITY_NO_ANIMATION 
  如果在Intent中设置,并传递给Context.startActivity()的话,这个标志将阻止系统进入下一个Activity时应用 Acitivity迁移动画。这并不意味着动画将永不运行——如果另一个Activity在启动显示之前,没有指定这个标志,那么,动画将被应用。这个标志可以很好的用于执行一连串的操作,而动画被看作是更高一级的事件的驱动。 

FLAG_ACTIVITY_NO_HISTORY 
  如果设置,新的Activity将不再历史stack中保留。用户一离开它,这个Activity就关闭了。这也可以通过设置noHistory特性。 

FLAG_ACTIVITY_NO_USER_ACTION 
  如果设置,作为新启动的Activity进入前台时,这个标志将在Activity暂停之前阻止从最前方的Activity回调的onUserLeaveHint()。 
  典型的,一个Activity可以依赖这个回调指明显式的用户动作引起的Activity移出后台。这个回调在Activity的生命周期中标记一个合适的点,并关闭一些Notification。 
  如果一个Activity通过非用户驱动的事件,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity,保证暂停的Activity不认为用户已经知晓其Notification。 

FLAG_ACTIVITY_PREVIOUS_IS_TOP 
  If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately. 

FLAG_ACTIVITY_REORDER_TO_FRONT 
  如果在Intent中设置,并传递给Context.startActivity(),这个标志将引发已经运行的Activity移动到历史stack的顶端。 
  例如,假设一个Task由四个Activity组成:A,B,C,D。如果D调用startActivity()来启动Activity B,那么,B会移动到历史stack的顶端,现在的次序变成A,C,D,B。如果FLAG_ACTIVITY_CLEAR_TOP标志也设置的话,那么这个标志将被忽略。 

9、 请描述下Activity的生命周期。

答:activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();

可见生命周期:从onStart()直到系统调用onStop()

前台生命周期:从onResume()直到系统调用onPause()

10、 activity在屏幕旋转时的生命周期

答:不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

11、 如何启用Service,如何停用Service。

服务的开发比较简单,如下:

第一步:继承Service类

public class SMSService extends Service {}

第二步:在AndroidManifest.xml文件中的节点里对服务进行配置:

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

服务常用生命周期回调方法如下: 

onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。

onDestroy()该方法在服务被终止时调用。

与采用Context.startService()方法启动服务有关的生命周期方法

onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。

与采用Context.bindService()方法启动服务有关的生命周期方法

onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用

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

答:首先写一个类要继承BroadcastReceiver

第一种:在清单文件中声明,添加

   

第二种使用代码进行注册如:

IntentFilter filter =  new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

IncomingSMSReceiver receiver = new IncomgSMSReceiver();

registerReceiver(receiver.filter);

两种注册类型的区别是:

1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。

2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

13、 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。

答:简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.

Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列

Handler:可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息

Looper:是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的

Handler:Handler接受到消息后调用handleMessage进行处理

Message:消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理

在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换。下面将对它们进行分别介绍:

1. Message 

    Message消息,理解为线程间交流的信息,处理数据后台线程需要更新UI,则发送Message内含一些数据给UI线程。

2. Handler 

    Handler处理者,是Message的主要处理者,负责Message的发送,Message内容的执行处理。后台线程就是通过传进来的 Handler对象引用来sendMessage(Message)。而使用Handler,需要implement 该类的 handleMessage(Message)方法,它是处理这些Message的操作内容,例如Update UI。通常需要子类化Handler来实现handleMessage方法。

3. Message Queue 

    Message Queue消息队列,用来存放通过Handler发布的消息,按照先进先出执行。

    每个message queue都会有一个对应的Handler。Handler会向message queue通过两种方法发送消息:sendMessage或post。这两种消息都会插在message queue队尾并按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过sendMessage发送的是一个message对象,会被 Handler的handleMessage()函数处理;而通过post方法发送的是一个runnable对象,则会自己执行。

4. Looper 

    Looper是每条线程里的Message Queue的管家。Android没有Global的Message Queue,而Android会自动替主线程(UI线程)建立Message Queue,但在子线程里并没有建立Message Queue。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL,但调用Looper.myLooper() 得到当前线程的Looper就有可能为NULL。对于子线程使用Looper,API Doc提供了正确的使用方法:这个Message机制的大概流程:

    1. 在Looper.loop()方法运行开始后,循环地按照接收顺序取出Message Queue里面的非NULL的Message。

    2. 一开始Message Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message Queue,该函数里面设置了那个Message对象的target属性是当前的Handler对象。随后Looper取出了那个Message,则调用 该Message的target指向的Hander的dispatchMessage函数对Message进行处理。在dispatchMessage方法里,如何处理Message则由用户指定,三个判断,优先级从高到低:

    1) Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;

    2) Handler里面的mCallback指向的一个实现了Callback接口的对象,由其handleMessage进行处理;

    3) 处理消息Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息。

    由此可见,我们实现的handleMessage方法是优先级最低的!

    3. Handler处理完该Message (update UI) 后,Looper则设置该Message为NULL,以便回收!

    在网上有很多文章讲述主线程和其他子线程如何交互,传送信息,最终谁来执行处理信息之类的,个人理解是最简单的方法——判断Handler对象里面的Looper对象是属于哪条线程的,则由该线程来执行! 

    1. 当Handler对象的构造函数的参数为空,则为当前所在线程的Looper; 

2. Looper.getMainLooper()得到的是主线程的Looper对象,Looper.myLooper()得到的是当前线程的Looper对象。

14、 简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver

答:一个activity呈现了一个用户可以操作的可视化用户界面;一个service不包含可见的用户界面,而是在后台运行,可以与一个activity绑定,通过绑定暴露出来接口并与其进行通信;一个broadcast receiver是一个接收广播消息并做出回应的component,broadcast receiver没有界面;一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI,Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。它是通过将Intent对象和目标的intent filter相比较来完成这一工作的;一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中声明的。

15、 说说mvc模式的原理,它在android中的运用,android的官方建议应用程序的开发采用mvc模式。何谓mvc?

mvc是model,view,controller的缩写,mvc包含三个部分:

  模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。

  视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。

  控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。

  android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:

  1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如果你对android了解的比较的多了话,就一定可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通信,幸运的是,android提供了它们之间非常方便的通信实现。

  2)控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理,这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。

1、 退出 activity 对一些资源以及状态的操作保存,可以在生命周期的哪个函数中进行 

AonPause() BonCreate() ConResume() DonStart()

2、 Android 项目工程下面的 assets 目录的作用是什么 

A、放置应用到的图片资源。 Res/drawable B、主要放置一些文件资源,这些文件会被原封不动打包到 apk 里面 

C、放置字符串,颜色,数组等常量数据 res/values D、放置一些与 UI 相应的布局文件,都是 xml 文件 res/layout

3、 下列不属于android布局的是(c)

AFrameLayout BLinearLayout   CBorderLayout  DTableLayout ERelativeLayout

4、 Intent 的作用的是 a  

A、intent是连接四大组件的纽带,可以实现界面间切换,可以包含动作和动作数据, 

B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切 换页面而消失 service 

C、实现应用程序间的数据共享 contentprovider

D、处理一个应用程序整体性的工作

5、 下列哪个是AbsoluteLayout中特有的属性 b

A,android:layout_height  B,android:layout_x  

C,android:layout_above  D,android:layout_toRightOf

6、 RatingBar组件中不能用属性直接设置的是d

A,五角星个数 B,当前分数C,分数的增量D,五角星的色彩

7、 在手机开发中常用的数据库是_a__

A,sqlLite   B,Oracle    C,Sql Server    D,Db23

8、 关于BroadcastReceiver的说法不正确的是_b_

A, 是用来接收广播Intent

B,一个广播Intent只能被一个订阅了此广播的BroadcastReceiver所接收

C, 对有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者

D, 接收者声明的优先级别在android:priority属性中声明,数值越大优先级别越高

9、 使用MediaPlayer播放保存在sdcard上的mp3文件时_c_

A,需要使用MediaPlayer.create方法创建MediaPlayer

B,直接newMediaPlayer即可

C,需要调用setDataSource方法设置文件源

D,直接调用start方法,无需设置文件源

10、 在android中使用RadioButton时,要想实现互斥的选择需要用的组件是 d

A,ButtonGroup  B, RadioButtons  C,CheckBox  D,RadioGroup

11、 在多个应用中读取共享存储数据时,需要用到的query方法,是哪个对象的方法?__A_

A, ContentResolver B, ContentProvider C, Cursor     D,  SQLiteHelper

12、 DDMSLog信息分为几个级别_c_

A,3         B,4        C,5          D,6

13、 能够自动完成输入内容的组件是_d__

A,TextView  B,EditText  C,ImageView D,AutoCompleteTextView

14、 创建子菜单的方法是_b__

A,add B,addSubMenu C,createSubMenu D,createMenu

15、 使用AIDL完成远程service方法调用下列说法不正确的是_a_

A, aidl对应的接口名称不能与aidl文件名相同

B, aidl的文件的内容类似java代码

C, 创建一个Service(服务),在服务的onBind(Intent intent)方法中返回实现了aidl接口的对象

D, aidl对应的接口的方法前面不能加访问权限修饰符

16、 MediaPlayer播放资源前,需要调用哪个方法完成准备工作_b

A,setDataSource      B,prepare    C,begin        D,pause

17、 处理菜单项单击事件的方法不包含_d_

A, 使用onOptionsItemSelected(MenuItem item)响应  

B,使用onMenuItemSelected(int featureId ,MenuItem item) 响应

C,使用onMenuItemClick(MenuItem item) 响应

D,使用onCreateOptionsMenu(Menu menu)响应

18、 android中文件操作模式中表示只能被本应用使用,写入文件会覆盖的是_d__

A, MODE_APPEND B,MODE_WORLD_READABLE

C,MODE_WORLD_WRITEABLE D, MODE_PRIVATE

19、 进度条中哪个属性是设置进度条大小格式的_d_

A,android:secondaryProgress   B,android:progress    C,android:max     D,style

20、 下列用以显示一系列图像的是_b_

A,ImageView    B,Gallery     C,ImageSwitcher       D,GridView

21、 表示下拉列表的组件是_b__

A,Gallery     B,Spinner      C,GridView      D,ListView

22、 关于AlertDialog的说法不正确的是_a_

A,要想使用对话框首先要使用new关键字创建AlertDialog的实例

B,对话框的显示需要调用show方法

C,setPositiveButton方法是用来加确定按钮的

D,setNegativeButton方法是用来加取消按钮的

23、 下列说法错误的是__d__

A,Button是普通按钮组件,除此外还有其他的按钮组件

B,TextView是显示文本的组件,TextViewEditText的父类

C,EditText是编辑文本的组件,可以使用EditText输入特定的字符

D,ImageView是显示图片的组件,可以通过设置显示局部图片

24、 关于android中播放视频的说法不对的是_c__

A,可以使用SurfaceView组件播视频   B,可以使用VideoView组件播视频

C,VideoView组件可以控制播放的位置和大小

D,VideoView播放视频的格式可以是3gp

25、 下列哪个是SqlLite下的命令_c_

A,shell    B,push   C,.quit     D,keytool

26、 下列关于如何使用Notification,不对的是_d_

A,notification需要NotificatinManager来管理 

B,使用NotificationManagernotify方法显示notification消息

C,在显示Notification时可以设置通知时的默认发声,震动等

D,Notification中有方法可以清除消息

27、 下列关于 open core说法不正确的是_b__

A, Open coreAndroid多媒体框架的核心

B, MediaPlayeropen Core中的一个核心类

C, 所有在Android平台的音频、视频的采集以及播放等操作都是通过它来实现的

D, 在实现开发中我们并不会过多地研究open core的实现,我们的Android为我们提供了上层的media api的开发使用

28、 上下文菜单与其他菜单不同的是_b_

A,上下文菜单项上的单击事件可以使用onMenuItemSelected方法来响应

B,上下文菜单必须注册到指定的view上才能显示

C,上下文菜单的菜单项可以添加,可以删除

D,上下文菜单的菜单项可以有子项

29、 拖动条组件是_c_

A,RatingBar     B,ProgressBar      C,SeekBar      D,ScrollBar

30、 读取文件内容的首要方法是_d__

A,openFileOutput   B,read    C,write    D,openFileInput

31、 关于隐式Intent正确的是_a_

A, android中使用IntentFilter 来寻找与隐式Intent相关的对象

B,通过组件的名称寻找与intent相关联的对象

C, 隐式Intent更多用于在应用程序内部传递消息

D, 一个声明了IntentFilter的组件只能响应隐式Intent请求

32、 多选框被选择事件通常用__b__

A,setOnClickListener  B,setOnCheckChangeListener  

C, setOnMenuItemSelectedListener        D,setOnCheckedListener

33、 自定义对话框时,将视图对象添加到当前对话框的方法是_d_

A,setIcon     B,setXML    C,setLayout    D,setView

34、 下列不属于service生命周期的方法是_C_

A,onCreate    B,onDestroy   C,onStop    D,onStart

35、 绑定Service的方法是_a__

A,bindService   B, startService   C,onStart    D,onBind

36、 java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分   类,按功能分为:(c),如果为读取的内容进行处理后再输出,需要使用下列哪种流?(g)

      A、输入流和输出流  B、字节流和字符流  C、节点流和处理流  

      DFile stream  EPipe stream  FRandom stream  GFilter stream

37、 下列代码的执行结果是:(b

    public class Test3{

  public static void main(String args[]){

  System.out.print(100%3);

  System.out.print(",");

  System.out.println(100%3.0);

  }

  }

  A1,1

  B1,1.0

  C1.0,1

  D1.0,1.0

38、   在继承中,关于构造方法的说明,下列说法错误的是(d

   A、子类无条件的继承父类的无参构造方法,

   B、子类可以引用父类中的有参构造方法,使用super关键字,

   C、如果子类没有构造方法,则父类无参构造方法作为自已的构造方法,

   D、如果子类有无参构造方法,而父类的无参构造方法则被覆盖。

39、  以下程序的运行结果为(  b

 public class IfTest{

 public static void main(String args[]){

 int x=3;

 int y=1;

 if(x==y)

 System.out.println("Not equal");

 else

 System.out.println("Equal");

 }

 }

     ANot equal     BEqual    C、无输出    D、编译出错

40、  Java语言中字符串“学Java”所占的内存空间是(a)

  A. 6个字节

      B. 7个字节

      C. 10个字节

      D. 11个字节 

41、 关于下列程序段的输出结果,说法正确的是:(

     public class MyClass{

 static int i;

     public static void main(String argv[]){

     System.out.println(i);

     }

     }

     A、有错误,变量i没有初始化。

     Bnull

 C1

     D0

42、 下列哪些语句关于内存回收的说明是正确的? (b )

  A、 程序员必须创建一个线程来释放内存

  B、 内存回收程序负责释放无用内存 

  C、 内存回收程序允许程序员直接释放内存 

  D、 内存回收程序可以在指定的时间释放内存对象 

43、 下面异常是属于Runtime Exception 的是(abcd(多选)

      AArithmeticException 

      BIllegalArgumentException 

      CNullPointerException 

      DBufferUnderflowException 

44、 Math.round(11.5)等于多少(). Math.round(-11.5)等于多少(c). c

      A11 ,-11   B11 ,-12   C12 ,-11   D12 ,-12

45、 下列程序段的输出结果是:(

     void complicatedexpression_r(){

     int x=20, y=30;

     boolean b;

     b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;

     System.out.println(b);

     }

     Atrue  Bfalse  C1  D0

46、 activity对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行(d)

   AonPause()  BonCreate()   C、 onResume()   DonStart()

47、 Intent传递数据时,下列的数据类型哪些可以被传递(abcd(多选)

       ASerializable  Bcharsequence  CParcelable  DBundle

48、 android 中下列属于Intent的作用的是(c)

  A、实现应用程序间的数据共享

  B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失

  C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带

  D、处理一个应用程序整体性的工作

49、 下列属于SAX解析xml文件的优点的是(b)

      A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能

      B、不用事先调入整个文档,占用资源少

      C、整个文档调入内存,浪费时间和空间

      D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会

  消失

50、  下面的对自定style的方式正确的是(a

    A、 

fill_parent

 

     B、 

fill_parent

   

     C、 

fill_parent

  

     D、 

fill_parent

  

 

二、多选题

51、 Intent 传递数据时,下列的数据类型哪些可以被传递 abcd 

ASerializable Bcharsequence CParcelable DBundle

52、 1.android 数据存储与访问的方式一下说法正确的是:(abcde) 

A、文件  B、数据库  C、sharedpreference  D、内容提供者  E、网络              

53、 下列可能会导致GC内存泄露的是:abc

 A.数据库的cursor没有关闭    B.构造adapter时,没有使用缓存contentview

C.衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程activity一般会重载一些方法用来维护其生命周期,下列不输于相关方法的是     D.使用sqlite数据库

54、 android 通过 startService 的方式开启服务, 关于 service 生命周期的 onCreate()和 onStart() 说法正确的是 ad 

A、当第一次启动的时候先后调用 onCreate()和 onStart()方法 

B、当第一次启动的时候只会调用 onCreate()方法 

C、如果 service 已经启动,将先后调用 onCreate()和 onStart()方法

D、如果 service 已经启动,只会执行 onStart()方法,不在执行 onCreate()方法

55、 开发android程序需要的开发工具和开发包包括 abcd

A, JDK   B,Eclipse  C,Android SDK  D,ADT   E,Raw

56、 下列属于补间动画相关类的是_acd__ 

A, TranslateAnimation   B, FrameAnimation

C, RotateAnimation   D, AlphaAnimation

57、 下列哪些 api 的操作需要声明权限 cd 

A、播放 mp3 文件 B、读 SD 卡 (读 sd 卡状态) C、发短信 D、访问网络 

58、 4.在 android 中使用 SQLiteOpenHelper 这个辅助类时,哪些操作可能生成一个数据库, ab 

A、getWriteableDatabase()  B、getReadableDatabase() 

C、getDatabase()  D、getAbleDatabase()

59、 下列对SharePreferences存、取文件的说法中正确的是:abd

A,属于移动存储解决方案     B,sharePreferences处理的就是key-value对  

C,读取xml文件的路径是/sdcard/shared_prefx  D,信息的保存格式是xml

60、  NotificationManager中清除消息的方法是 bd

A,destroy     B,cancel      C,clear      D,cancelAll

                                     

三、 填空题:(共11题,15分)

61、  当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行的回调函数是_____startActivityResult()

62、   android中输入日期的组件是__ DatePicker ___

63、   AIDL的全称是__ Android interface definition language__

64、 广播分为 ____无序广播和有序广播_______

65、 android中输入时间的组件是_TimePicker______

66、 Android应用的入口点是 ____Main___

67、 android中专门用于录音的组件是__MediaRecorder__

68、 动画中有一种___Frame__动画,通过顺序的播放排列好的图片来实现,类似电影。

69、 从PC向模拟器中复制文件的命令_adb push___

70、 android系统4个应用程序之一,主要用于后台运行和跨进程访问的是_service__

71、 创建只显示文本的Toast对象时建议使用__makeText---方法

72、 我们用___int____来定义一个整数,用___char____来定义一个字符类型,称为原始数据类型。

73、  android中常用的四个布局是framlayout,linenarlayout,relativelayout和tablelayout。

74、  android 的四大组件是activiey,service,broadcast和contentprovide。

75、  java.io包中的objectinputstream和objectoutputstream类主要用于对对象(Object)的读写。

76、  android 中service的实现方法是:startservice和bindservice。

77、  activity一般会重载7个方法用来维护其生命周期,除了onCreate(),onStart(),onDestory()   外还有onrestart,onresume,onpause,onstop。

78、  android的数据存储的方式sharedpreference,文件,SQlite,contentprovider,网络。

79、 当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行

 的回调函数是startActivityResult()。

80、  请使用命令行的方式创建一个名字为myAvd,sdk版本为2.2,sd卡是在d盘的根目录下,

  名字为scard.img, 并指定屏幕大小HVGA.____________________________________。

81、  程序运行的结果是:_____good and gbc__________。

    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'; 

  } 




:第一章

1 android系统的平台特色有  开放性 ,摆脱运行商的束缚  ,丰富的硬件连接  。(不受任何限制的开发商和无缝结合的Google应用)

2安卓的平台搭建必须的软件是 JDK , eclipse-SDK , Android-sdk 和 ADT 

3安卓的应用程序的基类是Activity 。

4安卓应用程序中描述了一个屏幕的布局文件是 卖弄。Main.xml 

简答:

1.简述Android 平台的特征有哪些。

开放性、挣脱运营商的束缚、丰富的硬件选择、不受任何限制的开发商、无缝结合的Google应用

2. 简述Android 平台开发环境搭建的步骤。

安装Java JDK安装Eclipse月蚀开发界面;Android SDK 安装;Eclipse集成开发环境(IDE)搭建;ADT配置;创建AVD。

3. 简述创建android程序的基本步骤。

新建项目:打开Eclipse,选择File > New > Project > Android Project;

编辑*.java主文件;

运行Android项目。

第二章android项目结构分析

填空

安卓的作为一个移动设备的开发平台,体系统构架和其他操作系统一样,采用了分层的构架,安卓从高层到底层分为应用程序层,应用程序构架层 , 各种库和运行环境 ,linux核心层 。

2安卓运行环境主要是指的虚拟机技术 Dalvik 。

3不像其他大多数系统的应用程序,安卓应用程序没有一个(单一的入口点)     。

4有两个方法是几乎所有的Activtity子类都实现的(onCreatBundle)),(onPause())。

5 Service是不能自己启动的,必须通过Context对象调用 (startService) 或(bindService)方法来启动。

Intents)在不同的组件之间传递消息,讲一个组件的请求意图传给另一个组件。

7每一个activty的状态由它所在的activity栈中的位置所决定的,所有当前正在运行的activity将遵循  ( 后进先出)  的原则。

8通常的可以通过三种类型的文件来创建资源:(xml文件),位图文件以及(原始数据)     。

9使用资源包括三种方法  (在代码里使用资源类);(在代码中调用资源并实例化);从其他资源类里引用,这样可以重用通用资源。

10 每个安卓的application都必须包含一个(AndroidManifest.xml ),且文件名是固定的,不能修改。

简答题

1.简述Android系统架构从高到低的几个层次。

答:android从高层到低层分为以下几个层次。

应用程序层(Application

应用程序框架层(Application Framework)

各种库(Libraries)和运行环境(RunTime)

linux核心层(OS)

2.应用程序的基本组件有哪些?

答:

(1) Activity。

(2) Service。

(3) Broadcast Receiver。

(4) Content Provider。

(5)Intent。

3. Android根据应用程序的组件以及组件当前运行状态将所有的进程按重要性程度从高到低划分为几个?

答:Android根据应用程序的组件以及组件当前运行状态将所有的进程按重要性程度从高到低划分为五个:前台进程、可见进程、服务进程、后台进程、空进程。

4. 随着Activity的创建和销毁,可能会经历哪四种状态?

答:随着Activity的创建和销毁,可能会经历以下四种状态:

Active(活跃)状态

Paused(暂停)状态

Stopped (结束)状态

Inactive(已被销毁或未启动)状态

5.使用资源包括哪几种方法?

答:使用资源包括三种方法:在代码里使用资源类;在代码中调用资源并实例化;从其他资源类里引用。

6. AndroidManifest.xml主要包含哪些功能?

答:AndroidManifest.xml主要包含以下功能:

说明application的java 数据包,数据包名是application的唯一标识;

描述application的component;

说明application的component运行在哪个process下;

声明application所必须具备的权限,用以访问受保护的部分API,以及与其他application的交互;

声明application其他的必备权限,用以component之间的交互;

列举application运行时需要的环境配置信息,这些声明信息只在程序开发和测试时存在,发布前将被删除;

声明application所需要的Android API的最低版本级别,比如1.0,1.1,1.5;

列举application所需要链接的库。

第三章

在现行布局中androidorientation=vertical”语句声明的作用是 (此布局中的控件垂直排列   。

2、在程序代码中声明一个Button对象,该对象使用 (findViewById 函数来通过id引用界面上的普通按钮控件

3在定义多个单项选项时,由RadioButton和 (RadioGroup) 组合起来共同完成

4.android系统总有五种常用的布局方式  (绝对布局(AbsoluteLayout), 线性布局(LinearLayout), 相对布局(RelativeLayout),表格布局(TableLayout),帧布局(FrameLayout))。

5安卓中的三种类型的菜单:(选项菜单(Option Menu)、上下文菜单(Context Menu) 子菜单(Sub Menu )

6当用户按下菜单键时打开的是出现在屏幕下方的图标菜单,该种菜单可以同时设置图标和文字,它显示最多  6  个菜单项

7单击事件是当用户碰到某个组件或则方向键被按下时产生该事件,该事件的侦听器是 (View.OnClickListener) ,对应的处理函数 (onClick())   。

8.android系统中常用的事件有:按键事件、单击事件、焦点事件、触摸事件。

二  简答题:

1简述在安卓界面上添加控件的方法主要有几种?

一种是编写xml代码文件,在该种文件中添加控件,设置属性,进行总体界面布局,在界面中只需引用控件的ID号;另一种是直接在源代码中编写控制语句,设置控制属性,进行界面设置。

4在界面上创建一个orientation的作用是什么?

设置界面的排列方式,是垂直排列(vertical)还是水平排列(horizontal

6安卓中实现事件处理的步奏?

(1) 创建事件监听器。

(2) 给要响应事件的组件注册事件监听器。

(3) 在事件处理方法中编写实现代码。

第六章

数据存储与访问

1使用SharedPreferences方式来存取数据,通常用到位于  (android.content) 包中的SharedPreferens接口

2android中提供了文件读写方法。通过openFileOutput()方法获得文件输入流(FileOutputStream),把数据写入文件。安卓系统中支持4中操作的模式:私有(MODE_PRIVATE)、追加(MODE_APPEND)、全局读(MODE_WORLD_READABLE)、全局写(MODE_WORLD_WRITEABLE)。

3安卓模拟器支持sd卡的使用,在cmd窗口下创建一个sd卡镜像文件的命令如下:

MksdcardSDCARD 1024M    E\android\sdcard.img

其中,参数1024M指明 (SD卡的容量) 。

4Xml资源解析器对象操作的是   (XML)   类型文件

5为了更好的对SQLite数据库的创建,打开以及更改进行管理,在android中,还可以通过一个继承自 (SQLiteOpenHelper构造函数) 的数据库辅助类来创建和打开一个数据可。并且至少需要实现该数据库辅助类的三个方法  onCreate()方法 onUpgrade()方法onOpen()方法

6ContentProvide应用中 使用  (ContentResolver) 通过指定的uri来间接的操作ContentProvider的数据。通常采用  (UriMatcher) 辅助类来进行URI的匹配

二 简答题

1简述Android平台提供了哪些数据存储方法

简单存储、文件存储、数据库存储、数据共享。

2Android编程时,如何获得SharedPreferences 对象。如何保存键值对到配置文件中?

获取SharedPreferences对象的方法如下:

SharedPreferences  sharedPreferences = get SharedPreferences(Preferences_Name,MODE);

利用SharedPreferences读取保存的配置,需要先声明一个SharedPreferences变量,然后getSharedPreferences得到一个SharedPreferences实例对象,即得到一个已经指定好指向哪个文件、以哪种方式指向的SharedPreferences对象;然后通过getXX得到保存在配置文件里面的键值对,XX表示保存的值的类型。

3简述安卓模拟器中应用程序使用SD卡的步骤

(1) 开发人员在模拟器中手动添加SD卡的映像文件。

(2) 创建SD卡的镜像文件。

(3) 在编程时实现对SD卡的数据读写。

4简述创建或者打开一个Sqlite数据库的方法有哪些?    

要创建或打开一个SQLite数据库,可以直接调用SQLiteDatabase的方法openOrCreateDatabase (String path,SQLiteDatabase.CursorFactory factory)来返回一个SQLite数据库对象,实现创建SQLite数据库。参数path是据库创建路径,包含数据库名称。参数factory是一个CursorFactory对象,用于查询时构造Cursor的子类对象并返回,若传入null使用默认的factory构造。

同样可以通过Context对象调用SQLiteDatabase openOrCreateDatabase (String name,int mode,SQLiteDatabase.CursorFactory factory)直接在数据库目录(/data/data//databases)中创建或打开一个名为name的数据库。

5使用ContentProvider来实现数据共享,都涉及到哪些辅助类

当应用需要通过ContentProvider对外共享数据时,需要继承ContentProvider并重写方法。

另外一个是ContentUris类的使用,ContentUris类用于操作Uri中数据路径后面的ID部分。

 第七章 定位服务与地图应用

填空 

1.开发基于地理位置的服务可以使用  (android.location)  和(Google Maps) 外部类库来开发

2android平台中提供访问定位服务的功能,也提供获取最佳定位提供者功能的类是 LocationManager      。

3. android关于定位功能的包Android Location API关于定位中比较重要的类有   LocationManager 、LocationProvider、LocationListener、 和  Criteria  。

简单题

1. Android 平台关于定位功能的包Android Location API中比较重要的类有哪些。

 LocationManager: 本类提供访问定位服务的功能,也提供 获取最佳定位提供者的功能。另外,临近警报功能 (前面所说的那种功能)也可以借助该类来实现。     

 LocationProvider: 该类是定位提供者的抽象类。定位提供者具备周期性报告设备地理位置的功能。      

LocationListener: 提供定位信息发生改变时的回调功能。必须事先在定位管理器中注册监听器对象。     

 Criteria:该类使得应用能够通过在LocationProvider设置的属性来选择合适的定位提供者。

2. 述申请地图密钥的步骤。

1找到你的debug.keystore文件。

证书的一般路径为:打开Eclipse,选择Windows—Preference—Android—Build,其中Default debug keystore的值便是debug.keystore的路径,如图7-2所示。

debug.keystore文件的位置

2)获取debug.keystoreMD5

首先在命令提示符下进入debug.keystore文件所在的路径,执行命令:keytool -list -keystore debug.keystore,这时可能会提示你输入密码,这里输入默认的密码“android”,即可取得MD5值,如图7-3所示。

debug.keystoreMD5

3申请Android MapAPI 密钥。

打开浏览器,输入网址:http://code.google.com/intl/zh-CN/android/maps-api-signup.html,登录Google账号,在GoogleAndroid Map API Key申请页面上输入步骤2得到的MD5认证指纹,选中“I have read and agree with the terms and conditions”选项,如图7-4所示,按下“Generate API Key”按钮,即可得到我们申请到的API Key,如图7-5所示。记下申请的Android Map API Key值,在后面的应用程序中会用到它

3简述google.android.maps的包中包含了哪些用于在Googl Map上显示,控制层叠的功能类以及每个类的功能

1. FileOutputStream stream = openFileOutput(fileName, MODE_PRIVATE); 

2. byte[] bytes = message.getBytes(); 

3. stream.write(bytes); 

4. stream.close(); 

5. FileInputStream stream = openFileInput(fileName); 

6. int len = stream.available(); 

7. byte[] bytes = new byte[len]; 

8. stream.read(bytes); 

9. result = EncodingUtils.getString(bytes, ENCODING); 

10. stream.close(); 

01.public class UIDataActivity extends Activity {  

02.      

03.    public static final String ENCODING = "UTF-8";  

04.    String fileName="test.txt";  

05.    String message = "Android数据存储I/O例子 ";  

06.    TextView textView;  

07.      

08.      

09.    /** Called when the activity is first created. */  

10.    @Override  

11.    public void onCreate(Bundle savedInstanceState) {  

12.        super.onCreate(savedInstanceState);  

13.        setContentView(R.layout.main);  

14.          

15.        /* 

16.         * 本示例是应用程序在私有数据文件夹下创建一个文件并读取其中的数据显示在TextView上 

17.         */  

18.          

19.        writeFileData(fileName,message);  

20.          

21.        String result = readFileData(fileName);  

22.          

23.        textView = (TextView)findViewById(R.id.tv);  

24.        textView.setText(result);  

25.    }  

26.      

27.    public void writeFileData(String fileName,String message){  

28.        //使用FileOutputStream对象如果文件不存在或者不可以写入时.会抛出FileNotFoundException异常  

29.        try {  

30.            FileOutputStream stream = openFileOutput(fileName, MODE_PRIVATE);  

31.            byte[] bytes = message.getBytes();  

32.            stream.write(bytes);  

33.            stream.close();  

34.        } catch (FileNotFoundException e) {  

35.            // TODO Auto-generated catch block  

36.            e.printStackTrace();  

37.        } catch (IOException e) {  

38.            // TODO Auto-generated catch block  

39.            e.printStackTrace();  

40.        }  

41.    }  

42.      

43.    public String readFileData(String fileName){  

44.        String result ="";  

45.        try {  

46.            FileInputStream stream = openFileInput(fileName);  

47.            int len = stream.available();  

48.            byte[] bytes = new byte[len];  

49.            stream.read(bytes);  

50.            result = EncodingUtils.getString(bytes, ENCODING);  

51.            stream.close();  

52.        } catch (FileNotFoundException e) {  

53.            // TODO Auto-generated catch block  

54.            e.printStackTrace();  

55.        } catch (IOException e) {  

56.            // TODO Auto-generated catch block  

57.            e.printStackTrace();  

58.        }  

59.        return result;  

60.    }  

61.}  

获取LocationManager对象getSystemService(Context.LOCATON_SERVICE);获取当前位置getLastKnownLocation(String provider)监听位置变化requestLocationUpdates(String provider,  long minTime, float minDistance,  LocationListener listener)在Manifest文件中声明权限

更多相关文章

  1. 获取Android SDK 源代码并在Eclipse中关联查看的方法(for sdk2.3
  2. 图解IntelliJ IDEA 13版本对Android SQLite数据库的支持
  3. android中解析文件的三种方式
  4. Android存储数据的三种方式
  5. Android数据库升级
  6. Android存储-SQLite数据库存储数据(三)
  7. Android NDK相关的库方法

随机推荐

  1. 使用Maven管理Android项目(一)
  2. 开发Android应用程序与Eclipse第2部分
  3. Android(安卓)ant自动打包脚本:自动替换友
  4. Android(安卓)之 Handler总结
  5. Android(安卓)的生命周期基础知识
  6. Android(安卓)APIDemos 研读之一:android.
  7. Android之Context 和 application contex
  8. Android(安卓)Fresco图片加载库基础使用
  9. Android(安卓)AlertDialog的一切
  10. Android中LocationManager的简单使用,获