サービスがアプリケーションの一部になる場合、必要以上に複雑になります。RESTful Web サービスからデータを取得する単純な使用例があるため、ResultReceiver と IntentService を調べる必要があります。
この Service + ResultReceiver パターンは、何らかのアクションを実行したいときに、startService() を使用してサービスを開始またはバインドすることで機能します。実行する操作を指定して、Intent のエクストラを介して ResultReceiver (アクティビティ) に渡すことができます。
サービスでは、Intent で指定された操作を行うために onHandleIntent を実装します。操作が完了したら、渡された ResultReceiver を使用してメッセージを Activity に送り返し、その時点で onReceiveResult が呼び出されます。
たとえば、Web サービスからデータを取得したいとします。
-インテントを作成し、startService を呼び出します。
- サービスの操作が開始され、開始したことを示すメッセージがアクティビティに送信されます
-アクティビティはメッセージを処理し、進行状況を示します。
-サービスは操作を終了し、一部のデータをアクティビティに送り返します。
-あなたのアクティビティはデータを処理し、リストビューに入れます
-サービスは完了したというメッセージを送信し、それ自体を強制終了します。
-アクティビティは終了メッセージを取得し、進行状況ダイアログを非表示にします。
例えば:
アクティビティ:
public class HomeActivity extends Activity implements MyResultReceiver.Receiver {
public MyResultReceiver mReceiver;
public void onCreate(Bundle savedInstanceState) {
mReceiver = new MyResultReceiver(new Handler());
mReceiver.setReceiver(this);
...
final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, QueryService.class);
intent.putExtra("receiver", mReceiver);
intent.putExtra("command", "query");
startService(intent);
}
public void onPause() {
mReceiver.setReceiver(null); // clear receiver so no leaks.
}
public void onReceiveResult(int resultCode, Bundle resultData) {
switch (resultCode) {
case RUNNING:
//show progress
break;
case FINISHED:
List results = resultData.getParcelableList("results");
// do something interesting
// hide progress
break;
case ERROR:
// handle the error;
break;
}
}
サービス:
public class QueryService extends IntentService {
protected void onHandleIntent(Intent intent) {
final ResultReceiver receiver = intent.getParcelableExtra("receiver");
String command = intent.getStringExtra("command");
Bundle b = new Bundle();
if(command.equals("query") {
receiver.send(STATUS_RUNNING, Bundle.EMPTY);
try {
// get some data or something
b.putParcelableArrayList("results", results);
receiver.send(STATUS_FINISHED, b)
} catch(Exception e) {
b.putString(Intent.EXTRA_TEXT, e.toString());
receiver.send(STATUS_ERROR, b);
}
}
this.stopSelf();
}
}
結果受信者:
public MyResultReceiver extends ResultReceiver {
private Receiver mReceiver;
public MyResultReceiver(Handler handler) {
super(handler);
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
}
}
}