Androidプログラマへの道 〜 Moonlight 明日香 〜 - サービスにインタフェースを実装する
サービスにインタフェースを実装するには, AIDL(Android Interface Definition Language)を利用する.

サービスのインタフェース実装

サービスに関してはバインドでサービスを起動/停止する参照.
  • TestService.java
    • IMyServiceの機能を実装する.
package com.moonlight_aska.android.service03;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

public class TestService extends Service {
  public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
    return mService;
  }

  // インタフェースの実装
  private final IMyService.Stub mService = new IMyService.Stub() {
    public int add(int x, int y) throws RemoteException {
      return x + y;
    }
  };
}
  • IMyService.aidl
    • AIDLファイルを作成し, サービスのインタフェースを定義する.
package com.moonlight_aska.android.service03;

interface IMyService {
  int add(int x, int y);
}
  • ServiceActivity.java
    • サービスのインタフェースを呼び出す.
package com.moonlight_aska.android.service03;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class ServiceActivity extends Activity implements View.OnClickListener {
  private Button btn = null;
  private IMyService mService = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_service);
    btn = (Button)findViewById(R.id.service_btn);
    btn.setOnClickListener(this);
    // サービスの起動
    Intent intent = new Intent(IMyService.class.getName());
    bindService(intent, connect, BIND_AUTO_CREATE);
  }

  private ServiceConnection connect = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      // TODO Auto-generated method stub
      mService = IMyService.Stub.asInterface(service);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
      // TODO Auto-generated method stub
      mService = null;
    }
  };

  @Override
  public void onClick(View v) {
    // TODO Auto-generated method stub
    if (v.getId() == R.id.service_btn) {
      EditText input1 = (EditText)findViewById(R.id.input1_id);
      EditText input2 = (EditText)findViewById(R.id.input2_id);
      try {
        // サービスに加算を実行させる
        int res = mService.add(Integer.parseInt(input1.getText().toString()),
          Integer.parseInt(input2.getText().toString()));
        TextView ans = (TextView)findViewById(R.id.answer_id);
        ans.setText(String.valueOf(res));
      } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
}