今天來介紹Service的第二種使用方式,Bind方式ide
Bind方式和Start方式啓動很相似,都是經過Intent來啓動,不一樣的是,Bind方式須要傳入三個參數,以下:函數
Intent intent2 =new Intent(MainActivity.this,BindService.class); bindService(intent2,conn,BIND_AUTO_CREATE);
其中conn爲一個ServiceConnection對象,用於獲取以Bind方式綁定的Service對象,其包含兩個抽象函數,以下:this
conn=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { bindservice=((BindService.MyBinder)service).getService(); } @Override public void onServiceDisconnected(ComponentName name) { } };
其中的onServiceDisconnected爲當Service的綁定意外丟失時會調用,在該例中沒有用到。spa
其中onServiceConnected爲當ServiceConnextion對象和Service成功綁定時回調用的方法,其中的IBinder參數正是在Service中的onBind方法的返回值類型。故咱們只須要在Service中,新建一個IBinder的子類,獲取Service對象便可。code
public class BindService extends Service { public class MyBinder extends Binder { public BindService getService() { return BindService.this; } } @Nullable @Override public IBinder onBind(Intent intent) { Log.d("Jinx","Bind"); return new MyBinder(); }
如上所示便可,其中Binder爲IBinder的一個子類,咱們的內部類繼承Binder便可。對象
在經過conn進行關聯後,即可以方便地在Activity中調用Service中的方法,以下代碼虛擬了一個音樂播放器爲例:blog
Service中:繼承
public void Play() { Log.d("Jinx","Play"); } public void Pause() { Log.d("Jinx","Pause"); }
Activity中:接口
case R.id.play_bt: bindservice.Play(); break; case R.id.pause_bt: bindservice.Pause(); break;