一、爲何要用bindService去啓動一個服務?java
FAQ:經過startService()和stopService()啓動和關閉服務時,Service與訪問者之間沒法進行通訊和數據交換,而使用bindService()和unbindService()啓動和關閉服務的時候就解決了這個問題;ide
二、如何使用bindService()去啓動一個服務?ui
FAQ:咱們一般會使用bindService(intent, connection, Service.BIND_AUTO_CREATE);方法去啓動一個服務。看下參數詳解:this
intent:要啓動的服務;code
connection:這是一個ServiceConnection對象,用來監聽Service與訪問者之間的鏈接狀態,鏈接成功時回調onServiceConnected(ComponentName componentName, IBinder binder)這個方法,其中binder是回調的服務對象,從中能夠獲取服務相關信息,斷開鏈接回調onServiceDisconnected(ComponentName name)方法,解除綁定的時候調用unbindService(connection)方法;component
Service.BIND_AUTO_CREATE:綁定時是否自動建立Service,這裏自動建立。對象
三、如何建立一個綁定的Service?get
FAQ:下面代碼實現了一個綁定的Service:it
public class BindService extends Service { private static final String TAG = "BindService"; private int count; private boolean quit; private MyBind bind = new MyBind(); @Override public IBinder onBind(Intent arg0) { Log.i(TAG, "service is binded"); return bind; } @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "service is onUnbind"); return true; }; @Override public void onCreate() { super.onCreate(); Log.i(TAG, "service is onCreate"); new Thread(new Runnable() { @Override public void run() { while (!quit) { try { Thread.sleep(2000); count++; } catch (Exception e) { } } } }).start(); } @Override public void onDestroy() { super.onDestroy(); this.quit = true; Log.i(TAG, "service is onDestroy"); } class MyBind extends Binder { public int getCount() { return count; } } }
四、建立綁定的Activity:io
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private Button bindBtn, unbindBtn, getBtn; private Intent intent; MyBind bind; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindBtn = (Button) findViewById(R.id.button1); unbindBtn = (Button) findViewById(R.id.button2); getBtn = (Button) findViewById(R.id.button3); bindBtn.setOnClickListener(l); unbindBtn.setOnClickListener(l); getBtn.setOnClickListener(l); intent = new Intent(this, BindService.class); } OnClickListener l = new OnClickListener() { @Override public void onClick(View view) { if (view == bindBtn) { bindService(intent, connection, Service.BIND_AUTO_CREATE); } else if (view == unbindBtn) { unbindService(connection); } else if (view == getBtn) { Toast.makeText(MainActivity.this, "Service的count值:" + bind.getCount(), Toast.LENGTH_LONG).show(); } } }; ServiceConnection connection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { Log.i(TAG, "onServiceDisconnected"); Toast.makeText(MainActivity.this, "onServiceDisconnected", Toast.LENGTH_LONG).show(); } @Override public void onServiceConnected(ComponentName componentName, IBinder binder) { Toast.makeText(MainActivity.this, "onServiceConnected", Toast.LENGTH_LONG).show(); Log.i(TAG, "onServiceConnected"); bind = (MyBind) binder; } }; }
五、程序說明:
當Service與Activity綁定的時候,Activity能夠經過MyBind來獲取Service狀態,其實對於Service的onBind()返回的IBinder對象能夠看做Service組件返回的回調對象,Service容許客戶端經過IBinder對象來訪問Service的內部數據,這樣就實現了客戶端與Service之間的通訊!