1. 程式人生 > >Android複習之旅--Service

Android複習之旅--Service

服務(Service)可以理解為一個沒有介面的能夠長期在後臺執行的Activity。即使啟動服務的應用程式被切換掉,其啟動的服務仍可以在後臺正常執行。

因此,Service適用於處理一些耗時的業務邏輯,比如下載檔案,進行網路傳輸或者播放音樂等。

建立服務

與建立Activity類似,建立一個類繼承Service,必須重寫onBind()方法,然後可以選擇重寫父類的方法,也可以自定義方法等,最後要在清單檔案中註冊

class MyService extends Service {        
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("服務被綁定了"
); return new MyBinder();//返回中間人 } ... } <service android:name="com.rixin.service.MyService"></service>

服務的生命週期

服務只會被建立一次,如果服務以及被開啟了,就不會重新呼叫onCreate()方法

詳情請參考我之前寫的 [Android複習之旅–Activity/Service/Fragment 生命週期]

服務的啟動方式

啟動服務有兩種方式,一種是startService方式(服務一經開啟,除非手動停止,否則會一直執行在後臺),一種是bindService方式(服務受呼叫者Activity的生命週期影響)

startService(直接開啟)
onCreate() –> onStartCommand() –> onDestory()

直接開啟服務,服務一旦啟動跟呼叫者(開啟者)沒有任何關係。呼叫者Activity退出了,服務還會在後臺繼續執行,並且Activity沒法訪問服務裡面的方法。

  • 先建立服務
public class MyService extends Service {
     @Override
     public IBinder onBind(Intent intent) {
          return null
; } @Override public void onCreate() { // TODO 初始化資料 } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO 處理業務邏輯 } @Override public void onDestroy() { // TODO 回收資源 } }
  • 再開啟服務(MainActivity.java)
Intent intent = new Intent(this, MyService.class);
startService(intent);  //開啟服務
stopService(intent);  //關閉服務

bindService(繫結開啟)
onCreate() –> onBind() –> onDestory()

繫結開啟服務,服務和開啟者(呼叫者)有密切關係。只要activity掛了,服務跟著也掛了,不求同時生,但求同時死,呼叫者Activity可以呼叫服務裡面的方法。

  • 先建立服務
    建立一個內部類繼承Binder,Binder相對於是服務的代理,作為Activity呼叫服務中的自定義方法的橋樑
public class MyService extends Service {
    class MyBinder extends Binder{
        public void callMethodInService(){
            methodInService(); //呼叫方法
        }
    }
    // 服務裡面定義的方法
    public void methodInService(){
        Toast.makeText(this, "我是服務裡面的方法", 0).show();
    }
    @Override
    public void onCreate() {
        // TODO 初始化資料
    }
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }
    @Override
    public boolean onUnbind(Intent intent) {
        // 返回啟動的繫結服務是否已經解綁
        return super.onUnbind(intent);
    }
    @Override
    public void onDestroy() {
        // TODO 回收資源
    }
}
  • 再開啟服務,並呼叫服務裡面的自定義方法
    建立一個內部類繼承ServiceConnection,用來監聽呼叫者與Service之間的連線狀態。
MainActivity.java:
Intent intent = new Intent(this, MyService.class);
bindService(intent, new MyConn(), Context.BIND_AUTO_CREATE);

MyBinder binder;  // MyBinder是服務中繼承Binder的內部類
class MyConn implements ServiceConnection{
    // 當服務被成功繫結的時候執行此方法
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        binder = (MyBinder) service;
    }
    // 當服務失去繫結的時候呼叫此方法(一般當服務突然異常終止時執行)
    @Override
    public void onServiceDisconnected(ComponentName name) {

    }       
}

//呼叫服務裡面的方法
public void call(View view){
    binder.callMethodInService();
}

希望能對你們有所幫助