サービスへのプロセス間通信
「サービス側」
- 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);
コメント
コメントを投稿