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インターフェースは
完全にスレッドセーフで実装すること