一,Service概述
服務(Service)是Android系統(tǒng)中4個應用程序組件之一。服務主要用于兩個目的:后臺運行和跨進程訪問
通過啟動一個服務,可以在不顯示界面的前提下在后臺運行指定的任務,這樣可以不影響用戶做其他事情。
通過AIDL服務可以實現(xiàn)不同進程之間的通信,這也是服務的重要用途之一。
二,Service基礎
Service并沒有實際界面,而是一直在Android系統(tǒng)的后臺運行。
一般使用Service為應用程序提供一些服務,或不需要界面的功能,例如,從Internet下載文件、控制Video播放器等。
這里我主要介紹Service的啟動和結(jié)束過程(Service的生命周期)以及啟動Service的各種方法
1.生命周期
Service與Activity一樣,也有一個從啟動到銷毀的過程,但Service的這個過程比Activity簡單得多。
一個服務實際上是一個繼承android.app.Service的類
Service啟動到銷毀的過程只會經(jīng)歷如下3個階段:
創(chuàng)建服務:調(diào)用 public void onCreate();
開始服務:調(diào)用 public void onStart(Intent intent, int startId);
銷毀服務:調(diào)用 public void onDestroy();
一個服務只會創(chuàng)建一次,銷毀一次,但可以開始多次,因此,onCreate和onDestroy方法只會被調(diào)用一次,而onStart方法會被調(diào)用多次。
2,創(chuàng)建和使用Service的步驟
(1)編寫一個服務類,該類必須從android.app.Service繼承。
public class MyService extends Service{
@Override
public IBinder onBind(Intent intent)
@Override
public void onCreate()
Service類涉及到3個生命周期方法,但這3個方法并不一定在子類中覆蓋,可根據(jù)不同需求來決定使用哪些生命周期方法。
在Service類中有一個onBind方法,該方法是一個抽象方法,在Service的子類中必須覆蓋。這個方法當Activity與Service綁定時被調(diào)用
(2)在AndroidManifest.xml文件中使用標簽來配置服務。一般需要將標簽的android:enabled屬性值設為true,并使用android:name屬性指定在第1步建立的服務類名
(3)如果要開始一個服務,使用startService方法,停止一個服務要使用stopService方法。此時需要使用Intent對象
//構造Intent對象
Intent? serviceIntent = new Intent(this, MyService.class);
或者
Intent serviceIntent = new Intent("net.blogjava.mobile.myService");
Bundle bundle? = new Bundle();
bundle.putInt("op", op);
serviceIntent.putExtras(bundle);
startService(serviceIntent);? ? ? //啟動服務
stopService(serviceIntent);? ? ? //停止服務
三,系統(tǒng)服務
(1)獲得系統(tǒng)服務
通過Activity類的getSystemService方法可以獲得指定的對象(系統(tǒng)服務);
getSystemService方法只有一個String類型的參數(shù),表示系統(tǒng)服務的ID,這個ID在整個Android系統(tǒng)中是唯一的
Android SDK在android.content.Context類中定義了這些ID:例如
public static final String AUDIO_SERVICE = "audio"; //? 定義音頻服務的ID
public static final String WINDOW_SERVICE = "window";? //? 定義窗口服務的ID
public static final String NOTIFICATION_SERVICE = "notification";? ? ? //? 定義通知服務的ID
(2)使用系統(tǒng)服務
//? 獲得WindowManager對象
android.view.WindowManager windowManager = (android.view.WindowManager).getSystemService(Context.WINDOW_SERVICE);
//? 在窗口的標題欄輸出當前窗口的寬度和高度,例如,320*480
setTitle(String.valueOf(windowManager.getDefaultDisplay().getWidth()) + "*"
+ String.valueOf( windowManager.getDefaultDisplay().getHeight()));