1. 程式人生 > >Service學習筆記

Service學習筆記

1 定義服務

public class MyService extends Service {
    public MyService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

2 啟動和停止服務

@Override
    public void onCreate() {
        Log.d(TAG,"onCreate executed");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG,"onStartCommand executed");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG,"onDestroy executed");
        super.onDestroy();
    }
case R.id.start_service:
                Intent startMySevice = new Intent(this, MyService.class);
                startService(startMySevice);
                break;
            case R.id.stop_service:
                Intent stopMyService = new Intent(this, MyService.class);
                stopService(stopMyService);
                break;

3 活動和服務進行通訊

private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
case R.id.bind_service:
                Intent bindMySevice = new Intent(this, MyService.class);
                bindService(bindMySevice, connection, BIND_AUTO_CREATE);
                break;
            case R.id.unbind_service:
                unbindService(connection);

4 服務的生命週期

1)一旦在專案的任何位置呼叫了Context的startService() 方法,相應的服務就會啟動起來並回調 onStartCommand() 方法。如果這個服務之前還沒有建立過,onCreate() 方法會先於 onStartCommand() 方法執行。複製啟動了就會一直保持執行狀態,直到 stopService() 或 stopSelf() 方法被呼叫。注意,素日每呼叫一次startService方法,onStartCommand() 就會執行一次,但實際上每一個服務只會存在一個例項,所以不管你呼叫了所少次 startService() 方法,只需要呼叫一次 stopService() 或 stopSelf() 方法,服務就會停止下來了。

2)呼叫Context的 bindService() 來獲取一個服務的持久連線,這時就會回撥服務中的 onBind() 方法。類似的,如果這個服務之前還沒有建立過,onCreate() 方法就會先於onBInd() 方法執行。之後,呼叫方可獲取到onBInd() 方法裡返回的IBinder物件的例項,這樣就可以通訊了。只要呼叫方和服務之間的連線沒有斷開,服務就會一直保持執行狀態。

3)當呼叫了 startService() 方法後,又去呼叫了 stopService() 方法,這時服務中的 onDestroy() 方法就會執行,表示服務已經銷燬了。類似的,當呼叫了 bindService() 後又去呼叫unbindService(),onDestroy() 方法也會執行。

4)如果我們對一個服務既呼叫了 startService() 又呼叫了 bindService() 方法後,根據Android 系統的機制,一個服務只要啟動或被綁定了之後,就會一直處於執行狀態,必須要讓以上兩種條件同事不滿足,服務才會被銷燬。所以,要同時呼叫 stopService() 和 unbindService() 方法,onDestroy() 才會執行。