Service分成兩種: startService和bindService。
##startService - 由第一個元件啟動, 由第一個元件結束, 這個是最常見的, 也是最簡單的啟動方式。
一開始先宣告一個Service的類別
public class ServiceDemo extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
由於是啟動Service, 因此onBind會是return null, 由於Service是運作在UI Thread上面, 因此你必須將長任務開個Thread並且執行在onStartCommand方法內。
接著Actvitiy對此類別進行啟動。
Intent intent = new Intent(this, ServiceDemo.class);
startService(intent);
有時候在系統記憶體吃緊的時候, 會將系統某些Service收起來, 這時候有幾個參數可以讓系統替你重新啟動Service。
##bindService
public class ServiceDemo extends Service {
private MyBinder mBinder = new MyBinder();
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
public String getServiceName(){
return ServiceDemo.class.getName();
}
private class MyBinder extends Binder{
public ServiceDemo getService(){
return ServiceDemo.this;
}
}
}
以上程式碼可以看到Service的宣告, 此時你可以宣告一個Binder, 透過Binder來取得整個Service的實體, 因此你可以透過這個實體來引用Service上任何一個公開的方法。
##在Activtiy部分
private LoaclServiceConnection mLoaclServiceConnection = new LoaclServiceConnection();
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
bindService(new Intent(this, ServiceDemo.class), mLoaclServiceConnection, Context.BIND_AUTO_CREATE);
}
}
private class LoaclServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//透過Binder調用Service內的方法
String name = ((ServiceDemo)service.getService()).getServiceName();
}
@Override
public void onServiceDisconnected(ComponentName name) {
//service 物件設為null
}
}
在這邊連繫的Service必須傳入一個ServiceConnection物件, 而當連繫成功以後, 就會呼叫ServiceConnection的onStartConnection方法, 將Service的Binder回傳回來, 透過轉型為Service本身的實體, 就可以操作Service上的任意方法。 這樣就是一個最簡單的Service雙向溝通。