ActivityとServiceの連携

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です