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" />