android 系统服务

 

一、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               Vibrator                                 手机震动的服务

CONNECTIVITY_SERVICE        Connectivity                           网络连接的服务

WIFI_SERVICE                         WifiManager                           Wi-Fi服务

TELEPHONY_SERVICE             TeleponyManager                   电话服务

SENSOR_SERVICE                   SensorManager                       传感器服务

                                                SmsManager                           短信发送服务

二、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)

【备注1:】

大致分为两种类型 一种是相对时间 ,一种是绝对时间

所以,根据使用的类型不同 triggerAtTime设置也有所不同

1、如果使用ELAPSED_REALTIME_WAKEUP类型 应该调用SystemClock.elapsedRealtime()获取相对时间在加上你设定的延迟时间

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+5000, sender);

2、如果使用RTC_WAKEUP类型 应该调用System.currentTimeMillis()获取从1970.1.1号以来的时间在加上你设定的延迟时间

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5000, sender);

3、setRepeating方法有4个参数,这些参数的含义如下:

type:表示警报类型,一般可以取的值是AlarmManager.RTC和AlarmManager.RTC_WAKEUP。如果将type参数值设为AlarmManager.RTC,表示是一个正常的定时器,如果将type参数值设为AlarmManager.RTC_WAKEUP,除了有定时器的功能外,还会发出警报声(例如,响铃、震动)。

triggerAtTime:第1次运行时要等待的时间,也就是执行延迟时间,单位是毫秒。

interval:表示执行的时间间隔,单位是毫秒。

operation:一个PendingIntent对象,表示到时间后要执行的操作。PendingIntent与Intent类似,可以封装Activity、BroadcastReceiver和Service。但与Intent不同的是,PendingIntent可以脱离应用程序而存在。

【备注2:】

1、AlarmManager.ELAPSED_REALTIME; //时间流逝时间,即相对于系统启动时间,睡眠时间考虑在内,睡眠状态不可用  

2、AlarmManager.ELAPSED_REALTIME_WAKEUP; //时间流逝时间,即相对于系统启动时间,睡眠时间考虑在内,睡眠状态下唤醒  

3、AlarmManager.RTC; //硬件时间,即系统时间,睡眠状态不可用  

4、AlarmManager.RTC_WAKEUP; //硬件时间,即系统时间,睡眠状态下唤醒 

特别提醒:】

        小米为了省电,将AlarmManager做5分钟唤醒一次来处理事件,这样导致了时间的延迟,最终导致不能准时唤醒。

四、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 。

猜你喜欢

转载自blog.csdn.net/dubo_csdn/article/details/86129134