Android学習【4】Androidバインドサービス通信


今日はサービスをバインドして通信することを学びました.
ActivityでbindServiceメソッドを実行すると、onBindメソッドが呼び出されます.
接続が確立されると、Activityでコールバック関数onServiceConnectedが実行され、IBinderタイプのパラメータが渡されます.このためIBinderによるデータ転送が可能となる.MyBinderクラスの構築はBinderから次のように継承されます.
    public class MyBinder extends android.os.Binder {
        public void setText(String str) {
            data = str;
        }

        public MyService getService(){
            return MyService.this;
        }
    }

Activityとの通信を実現するための2つの方法があります.
ActivityのonServiceConnectメソッドは次のとおりです.
public void onServiceConnected(ComponentName name, IBinder service) {
        binder = (MyService.MyBinder)service;
        binder.getService().setCallback(new MyService.Callback() {
            @Override
            public void OnDataChange(String data) {
                Message msg= new Message();
                Bundle b= new Bundle();
                b.putString("data",data);
                msg.setData(b);
                handler.sendMessage(msg);
            }
        });
    }

MyBinderタイプのオブジェクトが渡されていることがわかります.「更新」ボタンをクリックすると、binderによってサービス内のメソッドが呼び出され、データ通信が実現されます.
サービスのデータに基づいてActivityのUIコントロールを更新したい場合はどうしますか?
上のコードはすでに反応しています~~
まず、サービスプロセスの数値を取り出す方法を定義したインタフェースcallbackを作成します.
    public  interface Callback{
        void OnDataChange(String data);
    }

その後、サービスでCallbackタイプの変数callbackを定義し、get/setメソッドを作成します.サービスでsetCallback(str)メソッドを呼び出し、ActivityでもsetCallbackメソッドを呼び出すことで、Activityにデータを渡すことができます.
Activityに渡された後にもう一つ問題があり、Androidは他のスレッドがUIを更新することを許可していないので、Handleを採用してこの問題を解決しました.
private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            textView.setText(msg.getData().getString("data"));
        }
    };

サンプルソースコードは、ここで参照をダウンロードできます.http://download.csdn.net/detail/fxmfxm9304/9054649