バックグラウンドサービスを実行していて、サービスと対話するクライアントがあります。
クライアントが何らかの操作を要求すると、サービスはそれを実行し、結果をアクティビティ(クライアント)に送り返す必要があります。
アクティビティでサービスメソッドを呼び出す方法を知っており、コールバックを使用して、やりたいことを実現できます。しかし、Apiデモ(リモートサービス)で提供されているコールバックメカニズムとコード例を理解できません。
誰かがこのサービスコールバックがどのように機能するかを説明できますか?または、より単純なメカニズムを使用して達成可能なもの。
これが流れです
サービスを呼び出すインテントを作成します。 startService()
またはBindService()
のいずれかをBIND_AUTO_CREATE
サービスが結合されると、IBinder
インターフェイスであるクライアントと通信するためのトンネルが作成されます。これはAIDLインターフェースの実装で使用され、IBinder
を返します。
private final MyServiceInterface.Stub mBinder = new MyServiceInterface.Stub() {
public int getNumber() {
return new Random().nextInt(100);
}
};
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(this, "Service OnBind()", Toast.LENGTH_LONG).show();
return mBinder;
}
クライアントで作成したmBinder
が返されると、ServiceConnection
がコールバックされ、これを使用してサービスインターフェイスを取得します。
mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mService = MyServiceInterface.Stub.asInterface(service);
};
これで、mService
インターフェースを取得して、そこからサービスを呼び出して取得できるようになりました。