深入探讨Android----必不可少的高级功能
注意:此篇文章只是针对高级功能的一个简单介绍,我会在日后不断更新这篇文章,在每个高级功能的后面附上详细介绍的链接和源码下载。
1、Android的核心功能
1)、声明和实施应用程序权限
应用程序必须在Android清单文件中注册合适的权限;应用程序还可以使用<permission>标记声明并实施自定义权限。每种权限都必须在Android清单文件中定义,并将其用于应用程序的特定组件:最显而易见的是活动或服务。您还可以将权限应用于方法。
2)、使用通知提醒用户
即使应用程序没有在前台运行,也可以使用通知提醒用户。应用程序可使用的通知有多种形式,只要它在Android清单文件中注册了合适的权限:
在状态栏中显示文本通知;
播放声音;
让设备震动;
改变指示灯的颜色和频率。
(并非所有设备都支持上述通知形式,例如有些设备没有指示灯)
通知是使用系统服务android.app.NotificationManager创建和触发的。请求这种系统服务后,就可以创建一个Notification对象,并使用方法notify()来触发通知。
2、设计复杂的用户界面
最优秀最流行的应用程序又一个共同点,那就是都有涉及良好的解除的用户界面。Android SDK提供了很多激动人心的用户界面功能:
使用Fragments API将用户界面组件化,从而将用户界面与活动类分开;
使用样式和主题将一致的设置用于众多控件或整个屏幕;
涉及和重用自定义用户组件;
功能强大的输入方法框架;
检测各种屏幕手势;
文本到语音(text-to-speech,TTS)引擎;
语音识别功能。
1)、使用样式和主题
样式是一组通用的视图属性设置,可将其应用于任何数量的视图控件。例如,您可能希望应用程序中的所有视图控件(如TextView)都使用相同的文本颜色、字体和字号。为此可以创建一个定义了这3种属性的样式,并将其应用于应用程序布局中的每个TextView控件。
主题是一些列样式。样式应用于特定的控件,而主题应用于指定活动中所有的视图对象。通过一次性将主题应用与一组视图对象,可让用户界面的外观一致,这是一种不错的定义应用程序的颜色方案和其他常见视图属性设置的方。可以以编程方式指定主题,方法是调用活动类的方法setTheme();也可以在Android清单文件中将主题应用于特定活动。
2)、设计自定义View和ViewGroup控件
要创建自定义控件,只需android.view包中的View(或GroupView)控件为基础,并实现所需的功能。
您可以再XML部分本件中使用自定义的View控件,还可以以编程方式加载它们。您可以创建新型控件,也可以扩展现有控件的功能。
3)、使用输入方法
Android平台提供了队用户友好的软键盘,供没有硬键盘的设备使用。Android SDK还提供了功能强大的文本输入方法和可下载的输入方法编辑器(IME)。
4)、处理用户手势
您可以使用android.view.GestureDetector处理手势,如滑动(fling)、拖动(scroll)和触摸(tap)。要使用GestureDetector类,可以再活动中实现方法onTouchEvent()。下面是应用程序可监视并处理的一血手势:
onDown:用户接触触摸屏时发生;
onShowPress:用户接触触摸屏后松开或移动前发生;
onSingleTapUp:点按时间中用户松开时发生;
onSingleTapConfirmed:点按时间发生时调用;
onDoubleTap:发生点按两次事件时调用;
onDoubleTapEvent:点按两次手势中的事件发生时调用,包括按下、移动和松开;
onLongPress:类似于onSingleTap,但在影虎按住且不移动手指的时间足够长时调用;
onScroll:用户按住、平稳地移动并松开手指时调用;
onFling:用户按住、加速移动手指再松开前调用。
另外,android.gesture包还让应用程序能够识别、存储和显示任何手势,这意味着几乎用户能绘制的任何符号都可转化为有特定含义的手机。有些版本的SDK有Gesture Builder(手势生成器),可以简化在没有手势是被功能的应用程序中穿件手势的工作。
5)、文字转语音
Android平台包含了一个TTS引擎(android.speech.tts),让设备能够进行语音合成。您可以使用TTS引擎让应用程序给用户”朗读”文本。在基于位置的服务(lbs)的应用中,经常使用这种功能,让用户无需查看就能知道方向;还有其他应用程序使用这种功能方便有阅读或视力障碍的用户。
Android TTS引擎支持很多语言,包括英语、法语、德语、意大利语和西班牙语。合成的语音可以立即播放或保存到音频文件中,就想其他任何音频文件一样。
6)、语音转文字
可使用语音识别功能来改善应用程序,为此可使用语音识别框架(android.speech.RecognizerIntent)。您可使用这种意图来录制语音,并将其发送给识别服务器进行处理,因此没有网络连接的设备无法使用这项功能。
3、使用多媒体
Android SDK提供了全面的多媒体支持,让开发人员能够在应用程序中集成音频和视觉媒体(静态图像和视频),这些API位于android.media包中。
1)、播放和录制音频
Android SDK提供了播放和录制各种格式的音频的机制。音频文件可能是资源、本地文件、要共享的URI对象或网络资源。要播放音频,可以使用MediaPlayer类(android.media.MediaPlayer);要录制音频,可以使用MeidaRecorder类(android.media.MediaRecorder)。要录制音频,必须有权限android.permission.RECORD_AUDIO。
2)、播放和录制视频
可使用VideoView控件在屏幕上播放视频。为给VideoView控件提供基本的视频控制功能(如播放、暂停和停止),可使用MediaController控件。
与录制音频一样,要使用内置的相机录制视频,可使用MediaRecorder类。要访问相机,应用程序必须在Android清单文件中注册权限android.permission.CAMERA,而要使用MediaRecorder录制音频,必须再注册权限android.permission.RECORD_AUTIO。因此,要使用麦克风和相机录制视频,必须在Android清单文件中注册这两种权限。
4、2D和3D图形
如果您熟悉计算机图形编程,将很高兴地注意到Android给移动设备提供了相当尖端的图形功能。
1)、使用Android图形库
Android SDK自带了android.graphics包,其中包含很多可用于在屏幕上绘画的类。Android图形包包含位图工具,并支持字体、倾斜、渐变、形状和动画、还有一些助手类(如Matrix),可以帮助执行图形操作。
2)、使用OpenGL ES图形API
为支持更复杂的图形,Android使用流行的OpenGL ES图形API,它提供了有限的OpenGL ES1.1支持。应用程序可利用OpenGL ES进行绘画、插U那个键动画以及创建带光照、阴影和纹理效果的三维图形。
5、定制Android设备
1)、设置铃声
要修改手机的铃声,应用程序可以使用RingtoneManager;这种应用程序必须在Android清单文件中注册合适的权限(android.permission.WRITE_SETTINGS)。另外还可以使用意图打开铃声选择器。
2)、设置壁纸
应用程序可以设置主屏幕背景使用的壁纸,为此可以使用WallpaperManager类。有很多方法可用于获取当前使用的壁纸以及使用位图、资源或其他形式的图形设置新壁纸。
除了将静态图像用作壁纸外,Android还支持动态壁纸,这其实就是动画式壁纸,但几乎可以包含应用程序可绘制的任何东西。动态壁纸类似于窗口小部件,但其实现方式不同。
3)、创建动态壁纸
使用设备和Android SDK的图形功能可以绘制什么,动态壁纸就能显示什么。
动态壁纸类似于Android服务,但是它是宿主能够显示的表面(surface)。您想让动态壁纸多复杂,他就能多复杂,但应考虑手机响应速度和电池续航时间。下面是一些动态壁纸的例子:
以3D方式显示描述抽象性状的动画式场景;
以幻灯方式显示在线图像共享服务提供的图像的服务;
交互式池塘,触摸时出现阵阵涟漪;
根据季节、天气和时间变化的壁纸。
6、管理和共享数据
熟悉一些应用程序永久性地存储数据的方式:
在应用程序和活动级将简单的基本数据类型存储到SharedPreferences中;
将数据存储到远程应用程序服务器中。
应用程序还可以用如下方式存储和共享数据:
利用设备的文件和目录结构以任何个数存储私有应用程序文件;
将结构化数据存储到私有的SQLite数据库中;
访问充当内容提供器的其他内部应用程序中的数据;
通过成为内容提供器共享内部应用程序数据。
1)、使用文件和目录
每个Android应用程序都有私有的应用程序目录和文件,您可以使用标准Java文件I/O包,java.io来操作文件和目录。
Android应用程序的文件存储在Android文件系统的一个标准目录层次结构中;而Android应用程序的数据存储在Android文件系统的如下顶级目录中:
/data/data/<package name>/
在这个顶级目录下,创建了一些专用的子目录,用于存储数据库、首选项和文件。您还可以根据需要在这里创建私有目录和文件,为此,可以使用应用程序的Context对象的相应方法。
下面是Context类的一些重要的文件和目录管理方法:
openFileInput():打开子目录/file中的一个文件,以便读取;
openFileOutput():在子目录/file中打开或创建一个文件,以便写入;
deleteFile():删除子目录/file中指定名称的文件;
fileList():列出子目录/file中所有的文件;
getFilesDir():获取一个表示子目录/file的File对象;
getCacheDir():获取一个表示子目录/cache的File对象;
getDir():创建或获取一个表示指定子目录的File对象。
2)、使用SQLite数据库存储结构化数据
Android可在本地存储SQLite数据库。SQLite关系数据库是基于文件的轻量级数据库,非常适合用于移动设备。Android SDK提供了很多SQLite数据库管理类,它们位于androdi.database.sqlite包中,在这个包中,有用于如下目的的工具类:
创建和管理数据库以及对其进行版本控制;
创建SQL查询;
使用Cursor对象遍历查询结果;
分析数据库事务;
处理数据库异常。
除了以编程方式创建和使用SQLite数据库外,开发人员还可以使用命令行工具sqlite3,这个工具可通过用于调试的ADB外壳界面进行访问。
3)、与其他应用程序共享数据
应用程序可以利用其它Android应用程序的数据——如果后者通过成为内容提供器暴露了数据。您还可以让应用程序成为内容提供器,使其能够与其他应用程序共享自己的数据。
(1)、使用内容提供器
Android平台自带了一些很有用的应用程序,如“联系人”和浏览器,他们通过充当内容提供器暴露了自己的部分或全部数据。要访问这些应用程序的内容,可以使用内容提供器数据接口。有些内容提供器以只读方式提供数据,而有些运行应用程序创建、更新和删除记录。
在大多数情况下,都通过查询预定义的URI对象来访问内容提供器,应用程序可以像访问数据库那样访问内容提供器接口。
可以将URI视为一个地址,它指向内容所在的位置。要从内容提供器取回数据,可以使用方法managedQuery()。然后使用游标遍历查询结果,就想遍历数据库查询结果一样。
(2)、探索一些常用的内容提供器
Android包含的内容提供器位于android.provider包中,下面是一些最有用的内容提供器。
MediaStore:访问手机内外部存储设备中的多媒体;
CallLog:访问有关已拨电话、已接电话和未接电话的信息;
Browser:访问用户的浏览历史和书签;
Contacts:访问用户的联系人数据库;
UserDictionary:一个用户定义的字典,用于进行预测性文本输入;
可以讲来自数据库或内容提供器游标的数据直接绑定到用户界面控件,如ListView。为此可结合使用数据适配器控件(如ArrayAdapter或CursorAdapter)和从AdapterView派生而来的视图控件,如ListView或Spinner;
(3)、充当内容提供器
将内部数据暴露给其他应用程序,应用程序必须实现一个内容提供器接口,并在Android清单文件中注册成为内容提供器;
(4)、使用实时文件夹组织内容
实时文件夹是一种特殊对象,被单击时显示充当内容提供器的应用程序的数据。例如,音乐应用程序可能让用户创建指向特定音乐播放列表的实时文件夹,而实时文件夹可放在主屏幕上。要创建实时文件夹,应用程序必须创建一个响应意图操作ACTION_CREATE_LIVE_FOLDER的活动类,并让一个ContentProvider对象提供实时文件夹的数据。
4)、集成全局搜索功能
Android让应用程序可被整个系统搜索,这是通过以下方式实现的:配置应用程序,并提供自定义活动类,对执行搜索和处理结果所需的各种命令进行处理。另外,应用程序还可以提供搜索建议,这些建议在用户在Quick Search Box中输入搜索条件时显示。
7、访问设备硬件
Android开发人员从未像现在这样对设备的硬件有如此大的访问权限。除了访问相机和LBS服务等硬件外,Android SDK提供了各种访问手机低级硬件的功能的API。
读取原始传感器数据(如磁场传感器和朝向传感器);
访问Wi-Fi和蓝牙传感器;
监视电视使用情况和电源管理。
1)、读取传感器原始数据
下面是Android SDK支持的一些传感器:
加速计:测量三维空间中的加速度;
光纤传感器:测量亮度(对相机闪光灯说很有用);
磁场传感器:测量三维空间的磁力;
朝向传感器:测量设备的朝向;
温度传感器:测量温度;
距离传感器(Procimity sensor):测量设备到某一点的距离。
SensorManager对象用于从设备传感器那里收集数据,要获取SensorManager实例,可使用方法getSystemService()。
2)、使用Wi-Fi
只要有合适的权限(ACCESS_WIFI_STATE和CHANGE_WIFI_STATE),应用程序就可使用WifiManager对象访问设备内置的Wi-Fi传感器。要获取WifiManager实例,可使用方法getSystemService(0;
3)、使用蓝牙
Android SDK在android.bluetooth中提供了蓝牙支持类,包括用于扫描蓝牙设备、进行配对和处理数据传输的类。
4)、管理电源设置和电视续航时间
大多数移动设备都主要依靠电池供电。要监视电池,应用程序必须有权限BATTERY_STATS、注册接收Intent.ACTION_BATTERY_CHANGED和BroadcastIntent,并实现BroadcastReceiver以提取电池信息和采取必要的措施。下面是一些可监视的电池和电源设置。
是否安装了电池(我想知道监视这个有什么用呢.....);
电池的健康状况、状态(是否在充电)、电压和温度;
电池充电量和相关联的图标;
设备是否连接到了AC或USB电源;
应用程序可使用有关设备电源状态的信息来管理自己的电耗、例如,在电量不多时,定期使用大量处理能力的应用程序可能禁用耗电量大的功能。