Android Bound Services筆記

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

 

作者 達小生

發佈留言