ActivityとServiceの連携
Activityと
Android Interface Definition Language
(AIDL)
を使ったサービスで連携できる
実装するには、まずAIDLインターフェースを定義する
srcフォルダの直下へ
拡張子 .aidlファイル作成
ソースは
package net.developapp.activityservice; interface ActivityService{ int addString(String value); String getString(); }
次に、サービス作成
ここではonBind()の実装
.Stubインターフェースの実装をする
@Override public void onBind(Intent arg0){ return mBinder; }
//AIDL Binder実装
private ActivityService.Stub Binder = new ActivityService.Stub(){
@Override
public int addString(String value) throws RemoteException{
mStringList.add(value);
return mStringList.size();
}
@Override
public String[] getString() throws RemoteException{
return mStringList.toArray(new String[mStringList.size()]);
}
};
[/java]
そして、Activityの実装
ここでは
ServiceConnectionの実装
Serviceのbind/unbindを実装をする
まず
extends ListActivity
でListActivityを使えるようにする
private ActivityService mService; //メンバ変数宣言 private savedConnection //ServiceConnection実装 mServiceConnection = new ServiceConnection(){ public void onServiceConnected(ComponentName name, IBinder ibinder){ //ActivityServiceのインターフェース取得 mService = ActivityService.Stub.asInterface(ibinder); //一覧内容更新 reloadList(); } public void onServiceDisconnected(ComponentName name){ mService = null; } };
次に、onCreate()へ追記
ボタンを押したときの処理をする
findViewById(R.id.buttonadd).setOnClickListener( new OnClickListener(){ @Override public void onClick(View v){ EditText editString = (EditText)findViewById(R.id.editText); if(mService != null){ try{ mService.addString(editText.getText().toString()); reloadList(); }catch(RemoteException e){ e.printStackTrace(); } } } } ); //ServiceのBind Intent service = new Intent(this, ServiceActivity.class); bindService(service, mServiceConnection, BIND_AUTO_CREATE);
次に、onDestroy()の実装
protected void onDestroy(){ super.onDestroy(); //Bind解除 unbindService(mServiceConnection); }
そして、ユーザー関数reloadList()の実装
private void reloadList(){ try{ //ActivityServiceから文字列のリスト取得 String[] list = mService.getString(); //文字列のリストをListViewへ設定 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R..layout.sample_list_item_1, list); setListAdapter(adapter); }catch(RemoteException e){ e.printStackTrace(); } }
Android Interface Definition Language 通称
AIDLの使いどころは
別アプリから共通処理としてServiceを呼び出したいとき
また、サーバーみたいに同時に複数の呼び出しがあるので
AIDLインターフェースは
完全にスレッドセーフで実装すること