サービスへのプロセス間通信
「サービス側」
- AIDLファイルを定義する
- サービスの処理を作成
- マニフェストにサービスのインテントフィルタを定義する
1. AIDLの定義
AIDLの書き方については@IT様を参照するとよい。package com.example.myiservice;
interface IService {
void message(in String msg);
}
2. サービスでの処理部分
Handler mHandler = new Handler();
IService.Stub mBinder = new IService.Stub(){
@Override
public void message(final String msg) throws RemoteException {
mHandler.post(new Runnable(){
@Override
public void run() {
// Handlerを使ってServiceのToastを呼び出す
Toast.makeText(Service.this, "Hello,World!", Toast.LENGTH_SHORT).show();
}
});
}
}
3. インテントフィルタの追加
マニフェストファイルにServiceのインテントフィルタを設定しないと接続できない。 <service
android:name="com.example.myiservice.Service"
android:enabled="true">
<intent-filter>
<action android:name="ncom.example.myiservice.IService" />
</intent-filter>
</service>
「クライアント側」
- AIDLファイルをリンクする
- 接続の処理を作成
- バインドする
1. AIDLをリンク
プロジェクト内にパッケージ[com.example.myiservice]を作成するFile | New | Package
ファイルをリンクする
File | New | File より Advanced の Link to file in the file system にチェックして取り込む
2. 接続のための準備
// サービスコネクション
private IService mService;
private ServiceConnection mServiceConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
3.バインドする部分
onCreate()等に書くのだ。// サービスにバインド mIntent = new Intent(IService.class.getName()); boolean ret = bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
コメント
コメントを投稿