Service綁定到Android Component組件上,其通訊方式一般是如下三種
1. 在onBind(Intent intent)中返回Binder對象,通過此介面與Service互動
2. 通過IBinder對象建立一個Messenger,通過Handler的方式來與Service互動
3. 通過AIDL進行互動
第一種返回Binder的方式是最為方便的,因為可以在Binder中直接返回Service執行個體,使Component直接與 Service 通訊。
但是存在一個局限性,就是只有在Service與Component在同一個進程中的時候才可以通過Binder的方式進行,如果這個Service是一個程式內部使用的,那麼這種方式是首選的通訊方式。
其中需要注意的是:當多個Component綁定到同一個Service的時候,系統只會在第一個Component進行綁定的時候調用onBind方法,而其他的Component在綁定的時候,直接返回第一個返回的Binder,也就是說,多個組件是用的同一個Binder。
如果企圖在不同進程間返回Binder,系統會在運行時報錯。
第二種是通過一個Messenger進行互動,Messenger的建立和使用都很簡單,如下:
//在Service中
@Override
public IBinder onBind(Intent arg0) {
return mMessenger.getBinder();
}
private Messenger mMessenger = new Messenger(new HelloHandler());
class HelloHandler extends Handler{
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show();
super.handleMessage(msg);
}
}
//在Activity中
private Messenger mMessenger ;
private ServiceConnection sc = new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, "服務串連");
mMessenger = new Messenger(service);
mBound = true;
}
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG, "斷開服務");
mBound = false;
}
};
這樣就可以通過發送訊息的方式來與Service溝通了,其中Messenger的優勢在於,他可以在Service與Compontent位於不同進程的時候來通訊,這個是Binder方式無法做到的,Messenger底層是使用AIDL實現的。
一般來說前兩種可以滿足大多數程式的需求,如果要做並發處理的Service,那麼要使用AIDL來實現,具體見http://developer.android.com/guide/developing/tools/aidl.html
component
作者 達小生