IntentServiceを使えば手軽にバックグラウンド処理を行うことができる。
■コード
PostIntentService.java
public class PostIntentService extends IntentService implements PostTask.Observer {
private int counter = 0;
private int retry = 2;// 通信をリトライする回数
private Data mData;
public PostIntentService() {
super("PostIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
mData = (Data) intent.getSerializableExtra("data");
// send updating status
Intent i = new Intent();
i.setAction(PostResponseReceiver.ACTION_RESPONSE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.putExtra("status", "updating");
sendBroadcast(i);
execute();
counter++;
}
@Override
public void onSuccessPost(String result) {
// send success status
Intent i = new Intent();
i.setAction(PostResponseReceiver.ACTION_RESPONSE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.putExtra("status", "success");
sendBroadcast(i);
}
@Override
public void onFailedPost(String result) {
if (counter < retry) {
execute();
counter++;
}
else {
// send failed status
Intent i = new Intent();
i.setAction(PostResponseReceiver.ACTION_RESPONSE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.putExtra("status", "failed");
i.putExtra("data", mData);// for reproduct
sendBroadcast(i);
}
}
private void execute() {
PostTask task = new PostTask(this);
task.execute();
}
}
PostBroadcastReceiver.java
public class PostBroadcastReceiver extends BroadcastReceiver {
public static final String ACTION_RESPONSE = "com.example.android.intent.action.POST_PROCESSED";
private static final int POST_REQUEST = 100;
private Observer mObserver;
public PostBroadcastReceiver(Observer observer) {
mObserver = observer;
}
/**
* Broadcastをreceiveしたときに実行される
*/
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getStringExtra("status").equals("updating")) {
}
else if (intent.getStringExtra("status").equals("success")) {
if (mObserver != null) {
mObserver.onPostFinished();
}
}
else if (intent.getStringExtra("status").equals("failed")) {
if (mObserver != null) {
mObserver.onPostFailed();
}
}
}
/**
* activityなどにimplementsするオブザーバ
*/
public interface Observer {
public void onPostFinished();
public void onPostFailed();
}
}
クライアントコード
以下のようにすることでActivityからServiceを開始できる。
Intent intent = new Intent(this, PostIntentService.class);
intent.putExtra("data", mData);
startService(intent);
以下のように結果を受け取るActivityのonCreateにreceiverをbindしておく必要がある。
IntentFilter filter = new IntentFilter(PostBroadcastReceiver.ACTION_RESPONSE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new PostResponseReceiver(this);
registerReceiver(receiver, filter);
また、以下のようにonDestroyなどで登録したreceiverを解除しなくてはならない。
unregisterReceiver(receiver);
AndroidManifest.xml
Serviceは以下のようにマニフェストファイルに登録する必要がある。
<service android:name=".PostIntentService" />