一、Android系统服务:
getSystemService(String name)是Android很重要的一个方法,根据NAME来取得对应的Object,然后转换成相应的服务对象。以下介绍系统相应的服务。
===============================================================
name 返回的对象 说明
WINDOW_SERVICE WindowManager 管理打开的窗口程序
LAYOUT_INFLATER_SERVICE LayoutInflater 取得xml里定义的view
【LayoutInflater layoutInflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);】

ACTIVITY_SERVICE ActivityManager 管理应用程序的系统状态
POWER_SERVICE PowerManger 电源的服务
ALARM_SERVICE AlarmManager 闹钟的服务
NOTIFICATION_SERVICE NotificationManager 状态栏的服务
KEYGUARD_SERVICE KeyguardManager 键盘锁的服务
LOCATION_SERVICE LocationManager 位置的服务,如GPS
SEARCH_SERVICE SearchManager 搜索的服务
VIBRATOR_SERVICE VibratorManager 手机震动的服务
CONNECTIVITY_SERVICE Connectivity 网络连接的服务
WIFI_SERVICE WifiManager Wi-Fi服务
TELEPHONY_SERVICE TeleponyManager 电话服务
SENSOR_SERVICE SensorManager 传感器服务

二、DownloadManager介绍
(一)、DownloadManager简介
DownloadManager是Android 2.3引入的,基于http协议,用于处理长时间下载。
DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager.Request。
DownloadManager.Request用来请求一个下载,DownloadManager.Query用来查询下载信息。

(二)、DownloadManager主要提供了下面几个接口:
1、public long enqueue(Request request)执行下载,返回downloadId,downloadId可用于后面查询下载信息。若网络不满足条件、Sdcard挂载中、超过最大并发数等异常会等待下载,正常则直接下载。
2、public int remove(long… ids)删除下载,若下载中取消下载。会同时删除下载文件和记录。
3、public Cursor query(Query query)查询下载信息。
4、public static LonggetRecommendedMaxBytesOverMobile(Context context通过移动网络下载的最大字节数
5、public String getMimeTypeForDownloadedFile(long id)得到下载的mimeType,如何设置后面会进行介绍

其它:通过查看代码我们可以发现还有个CursorTranslator私有静态内部类。这个类主要对Query做了一层代理。将DownloadProvider和DownloadManager之间做个映射。将DownloadProvider中的十几种状态对应到了DownloadManager中的五种状态,DownloadProvider中的失败、暂停原因转换为了DownloadManager的原因。


(二)、DownloadManager用法【使用步骤:】
1、调用DownloadManager.Request开始下载

DownloadManager downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
 String apkUrl = "http://img.meilishuo.net/css/images/AndroidShare/Meilishuo_3.6.1_10006.apk";
 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apkUrl));
 request.setDestinationInExternalPublicDir("Trinea", "abc.mp4");


设置下载文件保存的路径

// request.setTitle("文件下载");
设置下载中通知栏提示的标题

// request.setDescription("保存的文件名称");
设置下载中通知栏提示的介绍

// request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
表示下载进行中和下载完成的通知栏是否显示。默认只显示下载中通知。VISIBILITY_VISIBLE_NOTIFY_COMPLETED表示下载完成后显示通知栏提示。

// request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
VISIBILITY_HIDDEN表示不显示任何通知栏提示,这个需要在AndroidMainfest中添加权限android.permission.DOWNLOAD_WITHOUT_NOTIFICATION.

// request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
表示下载允许的网络类型,默认在任何网络下都允许下载。有NETWORK_MOBILE、NETWORK_WIFI、NETWORK_BLUETOOTH三种及其组合可供选择。如果只允许wifi下载,而当前网络为3g,则下载会等待。

// request.setMimeType("video/mp4");
设置下载文件的mineType。因为下载管理Ui中点击某个已下载完成文件及下载完成点击通知栏提示都会根据mimeType去打开文件,所以我们可以利用这个属性。比如上面设置了mimeType为application/cn.trinea.download.file,我们可以同时设置某个Activity的intent-filter为application/cn.trinea.download.file,用于响应点击的打开文件。

long downloadId = downloadManager.enqueue(request);
调用downloadManager的enqueue接口进行下载,返回唯一的downloadId。

2、下载成功监听
下载完成后,下载管理会发出DownloadManager.ACTION_DOWNLOAD_COMPLETE这个广播,并传递downloadId作为参数。通过接收广播我们可以打开对下载完成的内容进行操作。

3、响应通知栏点击 ( 响应下载完成通知栏点击)
下载完后,点击通知栏可以阅读已经下载文件。系统其实会调用Intent的action属性,根据mimeType去调用相应的系统内置文件阅读器。所以一定要设置好DownloadManager.Request的setMimeType()方法。


三、AlarmManager:
(一)、简介:
AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而是直接通过AlarmManager来使用这种服务。这也许就是客户/服务模式的好处。AlarmManager与 AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。

(二)、AlarmManager API:
1、AlarmManage提供了几个常用方法:
1)、取消已经注册的与参数匹配的闹铃
void cancel(PendingIntent operation)
2)、注册一个新的闹铃
void set(int type, long triggerAtTime, PendingIntent operation)
3)、注册一个重复类型的闹铃
void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
4)、设置时区
void setTimeZone(String timeZone)

2、五种类型的闹铃服务:【区分的是时间标准和是否在睡眠状态下唤醒设备。】
1)、public static final int ELAPSED_REALTIME
// 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。

2)、public static final int ELAPSED_REALTIME_WAKEUP
//能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。

3)、public static final int RTC
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。

4)、public static final int RTC_WAKEUP
//能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
5)、Public static final int POWER_OFF_WAKEUP
//能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。


四、Vibrator:
(一)、基本用法:

Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
 mVibrator.vibrate(new long[] { 500, 200, 500, 200 }, -1);


【参数说明:】
1、只有1个参数的时候,第一个参数用来指定振动的毫秒数;
2、传递2个参数的时候,第1个参数用来指定振动时间的样本,第2个参数用来指定是否需要循环,-1为不重复,非-1则从pattern的指定下标开始重复 。
3、振动时间的样本是指振动时间和等待时间的交互指定的数组,即节奏数组。
例如:
震动节奏分别为:OFF/ON/OFF/ON…
long[] pattern = {3000, 1000, 2000, 5000, 3000, 1000};
表示的含义:在程序起动后等待3秒后,振动1秒,再等待2秒后,振动5秒,再等待3秒后,振动1秒


五、SensorManager:【详见Sensor一章】
(一)、基本用法:
一般使用传感器都有以下5个步骤:
1、调用Context的getSystemService(Context.SENSOR_SERVICE)方法获取SensorManager对象;
2、调用SensorManager的getDefaultSensor(int type)方法获取指定类型的传感器;
3、在onCreate()生命周期方法中调用SensorManager的registerListener()方法为指定的传感器注册监听;
4、实例化SensorEventListener接口,作为registerListener()方法的第一个参数。重写SensorEventListener接口中onSensorChanged()方法;
5、在onDestroy()生命周期方法中调用SensorManager对象的unregisterListener()方法释放资源。

六、TelephonyManager:【详见监听来电广播一章】
(一)、基本用法:
1、获取电话状态:

TelephonyManager manager = (TelephonyManager) context .getSystemService(Service.TELEPHONY_SERVICE);
 int state = manager.getCallState();
 switch (state) {
 case TelephonyManager.CALL_STATE_IDLE:
 Log.i("MyPhoneReceiver", "--->电话挂了!!");
 break;
 case TelephonyManager.CALL_STATE_OFFHOOK:
 Log.i("MyPhoneReceiver", "--->电话接听了!!");
 break;
 case TelephonyManager.CALL_STATE_RINGING:
 Log.i("MyPhoneReceiver", "--->电话铃声响了!!");
 break;
 }



2、利用AIDL及反射挂断电话:

Class<TelephonyManager> teleClass = TelephonyManager.class;
 try {
 Method teleMethod = teleClass.getDeclaredMethod(
 "getITelephony", null);
 teleMethod.setAccessible(true);
 ITelephony telephony = (ITelephony) teleMethod.invoke(
 telephonyManager, null);
 boolean flag = telephony.endCall();
 } catch (Exception e) {
 e.printStackTrace();
 }



七、WindowManager:
(一)、简介:
window manager (窗口管理器) Window Manager是Android中一个重要的服务(Service )。Window Manager Service 是全局的,是唯一的。它将用户的操作,翻译成为指令,发送给呈现在界面上的各个Window。Activity会将顶级的控件注册到 Window Manager 中,当用户触碰屏幕或键盘的时候,Window Manager就会通知到,而当控件有一些请求产生,也会经由ViewParent送回到Window Manager中。从而完成整个通信流程。
Window Manager API用于与 window manager (窗口管理器) 进行交互。可以添加 view 到屏幕,也可以从屏幕删除 view 。它面向的对象一端是屏幕,另一端就是 view ,直接忽略我们以前的 Activity 或者 Dialog 。