android Service學習之bindService

一、爲何要用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之間的通訊!

相關文章
相關標籤/搜索