Android 应用程序之道

摘要:阐述了编写Android应用程序的几大方面,包括:Android操作系统与其应用程序的关联、组件、UI、存储、通信、NDK。着重于这几方面我们所应该理解和掌握的知识点,以及注意的知识点。

关键词:Android;关联;组件;UI;存储;通信;NDK

0 前言

当今智能手机高速发展着,以Android为平台的智能手机占据了整个智能手机市场的一半以上,Android除了在智能手机市场上发力外,还在平板电脑,上网本,电视机等诸多领域发展着,因此我们编写的应用程序的市场也将更加的广泛,并且随着后PC时代的来临,智能手机,平板电脑等将越来越普及,功能越来越强大并向PC靠拢,可以想象我们编写的Android应用程序功能和用途也将更加强大和广泛。那么我们又应该怎样编写Android应用程序?我们在编写Android应用程序时又应该注意哪些方面? 因此本文接下来我将成6个方面来阐述Android应用程序编写之道: Android操作系统与应用程序的关联 ,Android特有的组件框架, Android应用程序UI框架 , Android应用程序数据的存储, Android 应用程序的通信及Android NDK。

1 Android操作系统与应用程序的关联

大家都知道Android操作系统是开源的,我们可以下载其源码来分析Android操作系统和其应用程序的关系,可以使我们写出更好和更稳定的应用程序,在此我主要是重逻辑的角度来阐述Android操作系统于应用程序的关联。

我们知道Android应用程序是运行于Android平台之上的,那么我们应该怎样来看待Android平台与应用程序?当我们把Android操作系统当作以经集成好的机器,应用程序就是在操作系统上在集成一些新的功能模块,根据系统所提供的小的组件(零件)来组装一个有一定功能和用途的模块,在把模块组装上操作系统,成某种意义上应用程序是对操作系统功能的扩充,犹如现代社会的规格化,集成化得机器一样,你的应用程序就是组装上的一个模块而已,那些更小的模块组装成你的应用程序。但是那些模块是操作系统所提供的。你给出那些你所需的模块(组件),由操作系统负责组装成你的应用程序,在由操作系统把你的应用程序组装于它自身之上。

每个组件都有着特定的功能和用途,操作系统为每个应用程序分配唯一的ID 和唯一的空间,应用程序运行其中,相对这说应用程序是私有的,应用程序各有不同的需求,有的应用程序要和别的应用程序通信,或应用程序自身内部的通信,有的应用程序要使用别的应用程序的功能或系统的功能,有的应用程序要使用系统的数据或别的应用程序的数据。

从Android开发者官网,我们可知Android操作系统的上层是以Java为基础的,因此在很大部分程度上Android应用程序的编写和编写Java的应用程序没有什么区别。对于已经熟悉Java应用程序的编写的人员来说在Android上进行编写应用程序只需熟悉Android所特有的那部分技术就能过很好的在Android编写应用程序。因此对于想要在Android上编写应用程序的人员来说:

首先的让自己熟悉Java,理解Java应用程序的编写。

其次再应该让自己熟悉Android所特有的部分,即可以在Android上编程应用程序了。

2 Android特有的组件框架

Android应用程序是以组件为基础的,就像Java以对象为基础一样,当然组件内仍是对象的思想。Android应用程序就一个由各种组件所集成应用程序。我们的应用程序可以使用系统提供的组件或别人编写的组件,同时我们编写的组件也能被别人的应用程序使用。这样做的好处是能过实现代码的复用,减少编程的工作量。 本文讲述了应用程序都需的Manifest文件和Android的四大核心组件及Intent和IntentFilter。

2.1 Manifest文件

Manifest文件是应用程序中很重要的一部分,是Android组件集合的场所。Android操作系统是通过对Manifest文件的检查来决定应用程序组合了那些组件,然后再根据在其中声明的初始化各组件以及组件基本的功能。由于程序是由组件所组成的,其中有些组件和功能是程序使用了别的程序的了,就像在现实生活中一样,你使用别人的东西,你首先等获得别人的权限,在Android应用程序中权限的声明也是位于Manifest文件中的。同时在Manifest文件中可以对程序对硬件的要求和其特点进行声明。应用程序是运行于操作系统之上的,Manifest文件就像操作体系表明你是有什么组成的,以及你有拥有的功能和对硬件的要求。

2.2 Activity组件

Activity是应用程序最基本的组件之一,大部分的应用程序都继承了该组件,从某种意义上可以说Activity是应用程序的入口,应用程序起动后所获得界面都在Activity中构造,即UI界面一般都在Activity构造。对现代化得应用程序而言,UI界面已经成为了应用程序所必需有的。因为它使得程序操作更加简单明了,容易。

Activity包含7中状态,分别为create,start,Resume,destroy,Pause,Stop,Restart,对于create状态,于Activity初次创建时进行,在create状态中用户一般可以进行初始化操作。如:绑定数据对列表,创建视图等,在destroy状态中进行有些资源的回收工作,resume状态即是获得了当前焦点的状态。应用程序一般在create和destroy中进行编码即可,因此应用程序都要一般要重写onCreate函数和onDestroy函数。

其整个生命周期如下图1-1所示:

Android 应用程序之道_第1张图片

图1.1

你应该根据你自己的需求在其生命周期内构造符合自己要求的代码。

2.3 Service组件

Service是Android应用程序重要组件之一,Service是运行于后台的没用有UI界面的,能够进行长时间的操作的组件,如果你想进行长时间的操作如:播放音乐,成网上下载资源等,一般应用Service组件。但请注意:Service并没有开启一个新的线程,Service仍然在主线程内运行,因此在编写长时间操作时应该在Service内启动一个新的线程来进行长时间操作。

Service可以分为独立的Service和绑定组件的Service,但是对于BroadcastReceiver只能通过startService函数启动Service,对于独立的Service而言,Service包含create,start,destroy三个状态,create状态一般用于一些初始化处理,并且在Service存活的生命周期内是create状态只能存在一次,即onCreate函数只调用一次,start状态是可以调用多次的函数,在其中可以放入一些长时间的或需反复操作的代码。

Destroy状态一般用于资源的回收。调用onDestroy函数后服务即销毁。独立的Service通过调用startService函数起动。其整个生命周期如图1-2所示,对于绑定Activity的Service,相对于独立的Service而言其生命周期去掉了start,添加了onbind和onunbind,于独立的Service有着相同的功能,bind起到了和独立Service中start函数的功能, 组件可以通过调用unBindService函数来解除与服务的绑定,注意:多个组件可以绑定同一个Service。只有当所有的组件都不在绑定Service时,操作系统才把Service销毁。


Android 应用程序之道_第2张图片

图1-2

2.4 BroadcastReceiver组件

BroadcastReceiver用于接收系统广播或应用程序的广播,对于自定义的广播接收器都需要重写onReceive函数,当你接收到广播后的后续动作都都放于onReceive函数中。对于操作系统而言对自身的很多活动都会发出广播,你的应用程序可以通过注册广播接收器来接收当系统或某一应用程序的某一事件发生时发生的广播,你就知道某一事件发生了,比如当系统启动时,或你接收来电时,短信都会发出广播,你可以通过接收广播来写些特殊功能的软件。Broadcast在一定程度上起着跟中断相同的功能,只是广播是不会中断其正在运行的程序的。同时可以看成是成消息机制抽离而来的,Android的消息机制一般用应用程序内部通信,Android把其抽离出来形成单独的广播,有助有我们理解和使用,同时也更加符合组件和对象的思想。

2.5 Content Providers组件

Content Providers(内容提供者)是Android的组件之一,应用程序用它来向外提供数据,以便外部程序通过ContentResolver来解析应用程序所提供的数据,从Content Providers内有一个管道接口,可以看出Android在这点上利用了Java管道的方法,利用管道来实现数据的分享。Content Providers扮演的公共使用室的角色。

2.6 Intent和IntentFilter

Intent和Intent Filter(意图和意图过虑器),Android各组件有自己的目的,它想要做什么想完成什么,都可以在Intent内声明,有些可以显示声明,有些可以隐示声明即通过Intent Filter来声明,Intent可以用来在各组件之间传递消息,并且Intent可以携带数据给目的组件,来起动其它的组件。如可以通过startActivity函数来启动Activity组件,通过startService函数来启动Service。

3 应用程序UI之道

Android UI界面是通过两种方式来实现:一是通过xml文件的形式,二是通过自己编写代码的方式来,谷歌推荐使用xml文件的形式来呈现UI,因为以文件的形式来呈现UI,有利于管理和修改UI中的设置,并且符合对象的思想。UI就好像人的外表,它呈现给使用者更加直观的映现,便于使用者操作和使用,和用户交互。

Android UI采用如下的方式来呈现UI:


Android 应用程序之道_第3张图片


图1-3

从中我们可以看出Android UI的呈现是采用嵌套的形式,即ViewGoup中嵌套View或ViewGroup,再在ViewGroup中进行嵌套来实现UI的。

我们对UI的设计可以采用Android提供的控件,来设计UI,通过一层又一层的嵌套来实现复杂的UI界面,对于Android所提供的控件我们应该重点掌握LinearLayout,RelativeLayout,FrameLayout,ListView,ImageView,TextView,Spinner,Menu,AlertDialog

ProgressBar,Button,EditText等,以上控件都是继承至View或View的子类,除了掌握Android本身提供的控件和其继承关系外,我们还应该掌握自定义控件的编写。对于自定义控件的编写,一般采用的方法是让我们自己的类去继承Android所提供的控件,或控件的父类,一般我们可以继承View类来编写自己的控件,对于继承View的类,我们最主要的是要实现其构造函数,onDraw函数和事件处理函数,对于onDraw函数,由于onDraw函数的参数是Canvas类,所以我们可以获取Canvas,通过其提供的函数来绘制图形,对于事件处理一般是对按键事件和触摸事件进行处理,在相应的函数中实现当某一事件发生时所要做的动作。以便实现自己想要的外观和功能。

总之,对于Android UI其大体上的思想和其它的UI是一样的,为了实现好的UI界面我们要对系统提供的控件和自定义控件都有相当的了解,才能很好的实现UI。

4 Android数据之存储

对于Android数据的存储有多种方法,本文主要讲述以SQLite数据库的形式,SharedPreferences的形式,以及xml文件的形式的数据存储方式。

4.1 SQLite

SQLite是轻量级的,是支持SQL语句的,用于嵌入式设备的开源的数据库。 为了对SQLite数据库进行操作,Android为我们提供了一套API以便让我们来使用和操作SQLite数据库,对于SQLite我们应该自己编写一个类继承于SQLiteOpenHelper,并实现SQLiteOpenHelper中的抽象方法,然后通过它的函数SQLiteDatabase对象,就可以通过SQLiteDatabase来操作SQLite数据库。当然我们也可以不用SQLiteOpenHelper,但是通过SQLiteOpenHelper可以帮助我们更好的操作数据库。

4.2 SharedPreferences

SharedPreferences是用于存储一些用户配置的数据SharedPreferences采用的是键值对的来存储数据的,SharedPreferences是个接口我们通常通过getSharedPreferences函数来过的SharedPreferences对象,对SharedPreferences对中的数据的读取于对Map的读取差不多,但是要对其中数据进行修改的话我们应该根据SharedPreferences中的函数来获得SharedPreference.Editor类,用它来对SharedPreferences中的数据进行修改。

请注意,Android系统提供给了我们PreferenceActivity类。用于对数据的存储。

4.3 Xml

Xml称为可扩展标记语言,Android为我们提供了API用于对xml文件的操作,我们可以把我们想要存储的东西于xml文件中,然后再读取xml文件即可获得我们存储的内容。我们一般把xml转换成类的形式,在转换之前我们应该知道类的基本结构。xml的读取是根据xml中的标签和属性。对于xml文件的读取有多种方法:Sax,Dom,Pull。Sax,Dom,Pull对于解析xml文件各有其优势。都根据其不同的策略来解析xml文件,本质上仍然是根据xml文件的格式来解析的,以sax为例:我们首先要获得SAXParser对象通过SAXParserFactory,注意其采用的是工厂模式,然后通过SAXParser的函数parse来解析xml。注意的是解析的时候有要用到DefaultHandler或HandlerBase,所以我们要编写类继承于DefaultHandler或HandlerBase并在实现

对解析事件的处理。

5 Android应用程序之通信

Android通信可以分为,应用程序内部通信和应用程序之间的通信。对应用程序内部通信:我们可以使用Intent意图,Handler。Handler用于在线程之间进行通信,由于Handler是于初始化Handler的线程绑定的,因此我们可以在一个线程中初始化Handler,在另一个线程中调用Handler中提供的函数来使得线程之间进行通信。Intent是用在组件之间进行通信的,我们可以在Intent中装入我们自己的数据来达到组件之间通信的目的。对于Android应用程序之间的通信:Android应用程序之间的通信:包括Http,Tcp/Ip ,蓝牙通信,Wifi通信等这些一般都用于网络通信之中和AIDL应用于进程之间的通信,对于AIDL其内部机理是所采用的Binder框架(Binder框架采用的客服端和服务端的模式,客服端和服务端通过Binder驱动来通信)。对于服务端Android为我们提供了AIDL工具。我们只要编写.aidl文件,AIDL工具会为我们生成Java接口,然后编写类继承Service,并实现AIDL工具为我们生成的Java接口。对于客服端通过bindService函数来绑定AIDL服务端来获取服务对象。

6 Android NDK

Android提供了NDK以便我们使用C和C++语言,NDK的使用能是我们对应用程序进行更加细腻的操作,定制我们所特有的功能,同时也为我们对硬件的操作提供的支持而不仅仅使用Android所提供的API来操作硬件。Android NDK的实现是使用Java本地函数来实现的,我们可以定义本地函数,然后再自己用C或C++来实现本地函数。由于Java本地函数有着自己的一套输入输出规范。我们本地函数的定义要遵循其规范。请注意我们的应用程序也应该编写Android.mk文件和Application.mk文件,以便编译器编译。

7 结束语

本文Android应用程序的6大方面,从中我们可以看出其与Java应用程序的主要区别,我们可以根据它们的区别来编写我们自己的Android应用程序。

参考文献:

[1] http://developer.Android.com/

[2]李宁.《Android开发权威指南》.人民邮电出版社,2011,09

[3]柯元旦. 《Android内核剖析》.电子工业出版社,2011,09

[4]李青﹑王瑜﹑赵丞兵 译. 《Android开发秘籍》.人民邮电出版社,2011,09

[5]王家林. 《大话企业级Android应用开发实战》. 电子工业出版社,2011,08


此是很早之前所写的一点关于android的东西。

更多相关文章

  1. C语言函数以及函数的使用
  2. 独家教程:用PHP编写Android应用程序
  3. Android彻底组件化—代码和资源隔离
  4. Android 应用程序之间数据共享—ContentProvider
  5. 如何退出Android应用程序
  6. android 自定义组件 :对VelocityTracker的研究
  7. Android层次化安全架构及核心组件概览
  8. android:组件化方案
  9. Android判断网络状态是否断开+Android完全关闭应用程序+ 本文讲

随机推荐

  1. Android(安卓)使用Parcelable序列化对象
  2. RxAndroid(安卓)教程
  3. Android(安卓)studio登录界面之记住密码
  4. android中的Section ListView
  5. Android中Invalidate和postInvalidate的
  6. Android中的Adapter 详解(一)
  7. Android音乐编程:管理音频焦点
  8. android中ListActivity使用记录Your cont
  9. Android之玩转MPAndroidChart让(折线图、
  10. 自定义View学习笔记(二)-Android坐标系简介