Android学習【4】Androidバインドサービス通信
2020 ワード
今日はサービスをバインドして通信することを学びました.
ActivityでbindServiceメソッドを実行すると、onBindメソッドが呼び出されます.
接続が確立されると、Activityでコールバック関数onServiceConnectedが実行され、IBinderタイプのパラメータが渡されます.このためIBinderによるデータ転送が可能となる.MyBinderクラスの構築はBinderから次のように継承されます.
Activityとの通信を実現するための2つの方法があります.
ActivityのonServiceConnectメソッドは次のとおりです.
MyBinderタイプのオブジェクトが渡されていることがわかります.「更新」ボタンをクリックすると、binderによってサービス内のメソッドが呼び出され、データ通信が実現されます.
サービスのデータに基づいてActivityのUIコントロールを更新したい場合はどうしますか?
上のコードはすでに反応しています~~
まず、サービスプロセスの数値を取り出す方法を定義したインタフェースcallbackを作成します.
その後、サービスでCallbackタイプの変数callbackを定義し、get/setメソッドを作成します.サービスでsetCallback(str)メソッドを呼び出し、ActivityでもsetCallbackメソッドを呼び出すことで、Activityにデータを渡すことができます.
Activityに渡された後にもう一つ問題があり、Androidは他のスレッドがUIを更新することを許可していないので、Handleを採用してこの問題を解決しました.
サンプルソースコードは、ここで参照をダウンロードできます.http://download.csdn.net/detail/fxmfxm9304/9054649
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