1、1.什么是 Activity?你用过哪些 Activity?2.GL 的坐标系和手机坐标系有什么区别?3.Android 动画有哪几种?它们有什么区别?4.请写出 5 中布局并简单介绍它们?5.介绍 Android 四大基本组件?6.如何实现 Activity 和 Service 之间的通信?7.如何通过 ContentProvider 实现数据共享?8.在正在播放的动画时,按 home 和 返回键 然后再点击进入 函数的调用有什么不同?9.传感器如何使用?10.Activity 的生命周期?答案:1.Activity 是 Android 组件中最基本也是最为常见用的四大组件之一,在 Andr
2、oid 程序中每一个界面都是一个 Activity。Android 程序中所有的 Activity 组成了 Activity 栈,当前活动的Activity 位于栈顶。常见的 Activity 有 ListActivity(列表) 、TabActivity(标签) 、LauncherActivity(列表,每一个列表项都是一个 intent) 、ExpandableListActivity (拓展列表) 、PreferenceActivity(显示设置选项参数) 。2.gl 坐标系原点默认在左下角屏幕坐标系原点默认在左上角3.Android 中的动画可以分为逐帧动画和补间动画。逐帧动画类似于电
3、影,一张图片一张图片的变换。补间动画给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。4.在 Android 中,共有五种布局方式,分别是:FrameLayout(帧布局) ,LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。(1 ) FrameLayout 帧布局,它为每一个加入其中的组件创建一个空白区域(称为一帧) ,每个子组件占据一帧,这些帧会根据 gravity 属性自动对齐。它就像吧组件一个一个的叠加起来,但是它不能把下层的组件移动到上层来。(2 )
4、LinearLayout 线性布局, 是应用程序中最常用的布局方式,主要提供控件水平或者垂直排列的模型,每个子组件都是以垂直或水平的方式来定位.(默认是垂直)(3 ) AbsoluteLayout 绝对定位布局 ,采用坐标轴的方式定位组件,左上角是(0,0)点,往右 x 轴递增,往下 Y 轴递增 ,组件定位属性为 android:layout_x 和 android:layout_y 来确定坐标。(4 ) RelativeLayout 相对布局 ,根据另外一个组件或是顶层父组件来确定下一个组件的位置。和 CSS 里面的类似。(5 ) TableLayout 表格布局,类似 Html 里的 Ta
5、ble.使用 TableRow 来布局,其中 TableRow 代表一行,TableRow 的每一个视图组件代表一个单元格。5.Activity 每一个 Activity 都是一个界面Service 服务,在后台运行的和 Activity 的区别是 Service 没有界面BroadcastReceiver 广播接收器 负责处理广播消息ContentProvider 数据共享6.方法一:定义 static 变量方法二:用 IBinder 和 ServiceConnection 实现用 bindService()和 unBindService()来启动和关闭 Service方法三:通过 Broa
6、dcastReceiver 来实现,在 Service 和 Activity 中都写并注册一个BroadcastReceiver,正在需要传递消息的时候通过 sendBroadcast(intent )来传递消息。7.一个程序可以通过实现一个 Content provider 的抽象接口将自己的数据完全暴露出去,而且 Content providers 是以类似数据库中表的方式将数据暴露。Content providers 存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过 2 种方法:创建一个属于你自己的 Content
7、 provider或者将你的数据添加到一个已经存在的 Content provider 中,前提是有相同数据类型并且有写入 Content provider 的权限。如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android 提供了 ContentResolver,外界的程序可以通过 ContentResolver 接口访问ContentProvider 提供的数据8.back 键默认行为是 finish 处于前台的 Activity 的即 Activity 的状态为 Destroy 状态为止,再次启动该 Activity 是从 onCreate 开始的(不会调用 onSaveIn
8、stanceState 方法) 。Home 键默认是 stop 前台的 Activity 即状态为 onStop 为止而不是 Destroy,若再次启动它,会调用onSaveInstanceState 方法,保持上次 Activity 的状态则是从 OnRestart 开始的-onStart()-onResume()。MessageMessage 消息,理解为线程间交流的信息,处理数据后台线程需要更新 UI,则发送 Message 内含一些数据给 UI 线程。HandlerHandler 处理者,是 Message 的主要处理者,负责 Message 的发送,Message 内容的执行处理。后
9、台线程就是通过传进来的 Handler 对象引用来 sendMessage(Message)。而使用 Handler,需要 implement 该类的 handleMessage(Message)方法,它是处理这些 Message 的操作内容,例如 Update UI。通常需要子类化 Handler 来实现handleMessage 方法。Message QueueMessage Queue 消息队列,用来存放通过 Handler 发布的消息,按照先进先出执行。每个message queue 都会有一个对应的 Handler。Handler 会向 message queue 通过两种方法发送消
10、息:sendMessage 或 post。这两种消息都会插在 message queue 队尾并按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过 sendMessage 发送的是一个 message 对象,会被 Handler 的 handleMessage()函数处理;而通过 post 方法发送的是一个 runnable 对象,则会自己执行。Looper Looper 是每条线程里的 Message Queue 的管家。 Android 没有 Global 的 Message Queue, 而 Android 会自动替主线程(UI 线程)建立 Message Queue,但
11、在子线程里并没有建立 Message Queue。 所以调用 Looper.getMainLooper()得到的主线程的 Looper 不为 NULL,但调用 Looper.myLooper() 得到当前线程的 Looper 就有可能为 NULL。 对于子线程使用Looper,API Doc 提供了正确的使用方法:24.AIDL 的英文全称是 Android Interface Define Language当 A 进程要去调用 B 进程中的 service 时,并实现通信,我们通常都是通过 AIDL 来操作的Service:Service 是 android 的一种机制,当它运行的时候如果是
12、 Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是 Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。 Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的
13、run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有 start 的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建
14、、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例) 。因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。An
15、droid 提供了 5 种方式存储数据:(1 )使用 SharedPreferences 存储数据;它是 Android 提供的用来存储一些简单配置信息的一种机制,采用了 XML 格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。(2 )文件存储数据;文件存储方式是一种较常用的方法,在 Android 中读取/写入文件的方法,与 Java 中实现 I/O 的程序是完全一样的,提供了 openFileInput()和 openFileOutput()方法来读取设备上的文件。(3 ) SQLite 数据库存储数据; SQLite 是 Android 所带的一个标准的数据库,它支
16、持 SQL 语句,它是一个轻量级的嵌入式数据库。(4 )使用 ContentProvider 存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此 Content Provider 的各种数据类型。(5 )网络存储数据;通过网络上提供给我们的存储空间来上传( 存储)和下载(获取) 我们存储在网络空间中的数据信息。Manifest.xml 文件中主要包括哪些信息?答:manifest:根节点,描述了 package 中所有的内容。uses-permission:请求你的 package 正常运作所需赋予的安全许可。permission: 声明了安全许可来限制哪些程序能你
17、package 中的组件和功能。instrumentation:声明了用来测试此 package 或其他 package 指令组件的代码。application:包含 package 中 application 级别组件声明的根节点。activity:Activity 是用来与用户交互的主要工具。receiver:IntentReceiver 能使的 application 获得数据的改变或者发生的操作,即使它当前不在运行。service:Service 是能在后台运行任意时间的组件。provider:ContentProvider 是用来管理持久化数据并发布给其他应用程序使用的组件。根据自己
18、的理解描述下 Android 数字签名。答:(1)所有的应用程序都必须有数字证书,Android 系统不会安装一个没有数字证书的应用程序(2)Android 程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证(3)如果要正式发布一个 Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用 adt 插件或者 ant 工具生成的调试证书来发布。(4)数字证书都是有有效期的,Android 只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。Android 中 Dalvik 和 JVM 的区别是什
19、么?相同点:都使用 Java 语法不同点:字节码格式定义不同(dex 格式 vs class 格式)运行库不同多虚拟机并发运行优化:共用 dex,大量使用 mmap启动机制不同:预加载、预初始化编译过程不同 Dalvik 不能运行.class 和.jarDalvik 不具备 JavaME 的 APIDalvik 的大部分函数库来自 Apache Harmony 项目启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?都是隐式意图Task:主界面首先创建一个 Task 栈, 配置了 Main Launcher Activity 被启动,作为栈底从其他跳转过来的 Ac
20、tivity 在启动它的 Activity 所在的栈里四种启动模式:Standard intent 发送给新的实例singleTop Activity 不在栈顶时 intent 发送给新的实例,在栈顶时启动原来的 ActivitysingleTask 当 intent 到来,系统会检查栈里面是否已经有该 Activity 的实例。如果有直接将 intent 发送给它。singleInstance 解释 singleInstance 模式比较麻烦。首先要说一下 Task(任务)的概念。如果是 Swing 或者 Windows 程序,可能有多个窗口可以切换,但是你无法在自己程序中复用人家的窗口。注
21、意是直接复用人家的二进制代码,不是你拿到人家 api 后的源代码级调用。Android 可以做到,让别人的程序直接复用你的 Activity(类似桌面程序的窗口) 。Android 为提供这种机制,就引入了 Task 的概念。Task 可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么 Android 就创建了一个 Task,然后启动这个应用的入口Activity,就是 intent-filter 中配置为 main 和 launch 的那个 。这个 Activity 是根(Root)Activity,可能会在它的界面调用其他 Activity,这些 Activity 如果按
22、照上面那三个模式,也会在这个栈(Task)中,只是实例化的策略不同而已。验证的办法是调用和打印 Activity的 taskId:TextView textView2 = new TextView(this); textView2.setText(“task id: “+this.getTaskId(); 会发现,无论切换 Activity,taskId 是相同的。当然也可以在这个单一的 Task 栈中,放入别人的 Activity,比如 google 地图,这样用户看过地图按回退键的时候,会退栈回到调用地图的 Activity。对用户来说,并不觉得在操作多个应用。这就是 Task 的作用。但
23、是,有这样的需求,多个 Task 共享一个 Activity(singleTask 是在一个 task 中共享一个 Activity) 。现成的例子是 google 地图。比如我有一个应用是导游方面的,其中调用的 google 地图Activity。那么现在我比如按 home 键,然后到应用列表中打开 google 地图,你会发现显示的就是刚才的地图,实际上是同一个 Activity。如果使用上面三种模式,是无法实现这个需求的。google 地图应用中有多个上下文 Activity,比如路线查询等的,导游应用也有一些上下文 Activity。在各自应用中回退要回退到各自的上下文 Activit
24、y 中。singleInstance 模式解决了这个问题(绕了这么半天才说到正题) 。让这个模式下的 Activity 单独在一个 task 栈中。这个栈只有一个 Activity。导游应用和 google 地图应用发送的 intent 都由这个 Activity 接收和展示。这里又有两个问题:如果是这种情况,多个 task 栈也可以看作一个应用。比如导游应用启动地图 Activity,实际上是在导游应用 task 栈之上 singleInstance 模式创建的(如果还没有的话,如果有就是直接显示它)一个新栈,当这个栈里面的唯一 Activity,地图Activity 回退的时候,只是把这个
25、栈移开了,这样就看到导游应用刚才的 Activity 了;多个应用(Task)共享一个 Activity 要求这些应用都没有退出,比如刚才强调要用 home 键从导游应用切换到地图应用。因为,如果退出导游应用,而这时也地图应用并未运行的话,那个单独的地图 Activity(task)也会退出了。HTTP 协议简介: HTTP (Hypertext Transfer Protocol ),是 Web 联网的基础,也是手机联网常用的协议之一,HTTP 协议是建立在 TCP 协议之上的一种协议。 HTTP 连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建
26、立连接到关闭连接的过程称为“一次连接”。 在 HTTP 1.0 中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。 在 HTTP 1.1 中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。由于 HTTP 在每次请求结束后都会主动释放连接,因此 HTTP 连接是一种“短连接”、“无状态”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服
27、务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。 基于 HTTP1.0 协议的客户端在每次向服务器发出请求后,服务器就会向客户端返回响应消息,在确认客户端已经收到响应消息后,服务端就会关闭网络连接。在这个数据传输过程中,并不保存任何历史信息和状态信息,因此,HTTP 协议也被认为是无状态的协议。HTTP1.1 和 HTTP1.0 相比较而言,最大的区别就是增加了持久连接支持。当客户端使用HTTP1.1 协议连接到服务器后,服务器就将关闭客户端连接的主动权交还给客户端;也就是说,只要不调用 Socket 类的 close 方法关闭网络
28、连接,就可以继续向服务器发送 HTTP 请求。HTTP 连接使用的是“请求响应”的方式(2 次握手),不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。而 Socket 连接在双方建立起连接后就可以直接进行数据的传输HTTP 协议的特点:支持 B/S 及 C/S 模式;简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记;无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后
29、续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。HTTP 协议请求方法: 请求行中包括了请求方法,解释如下:GET 请求获取 Request-URI 所标识的资源;POST 在 Request-URI 所标识的资源后附加新的数据;HEAD 请求获取由 Request-URI 所标识的资源的响应消息报头 PUT 请求服务器存储一个资源,并用 Request-URI 作为其标识DELETE 请求服务器删除 Request-URI 所标识的资源;TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断CONNECT 保留将来使用OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求Get 与 Post 请求区别: Post 请求可以向服务器传送数据,而且数据放在 HTML HEADER 内一起传送到服务端URL 地址,数据对用户不可见。而 get 是把参数数据队列加到提交的 URL 中,值和表单内各个字段一一对应, 例如(http:/ 传送的数据量较小,不能大于 2KB。post 传送的数据量较大,一般被默认为不受限制。但理论上,IIS4 中最大量为 80KB,IIS5 中为 100KB。get 安全性非常低,post 安全性较高